本方案通过弹性伸缩和PolarDB的配合,实现应用和数据库两个层面的弹性。

参考链接:https://www.aliyun.com/acts/best-practice/preview?id=52159

前提条件

应用场景

在互联网行业的业务发展中,很多业务具有突发性特点。

  • 例如互联网电商的秒杀、促销等活动,这类业务的特点是时间固定,但访问量不固定。除了提前升级配置之外,客户往往希望系统本身也能有自动弹性伸缩的能力。
  • 对于互联网教育的场景,由于存在放假和工作日的区别,系统也需要有一定的弹性伸缩能力去应对高出平时几倍的压力,等访问减少时,业务系统能释放冗余的资源达到节约成本的目标。

典型场景和需求:

  • 业务系统波动大,以互联网行业为典型代表;
  • 业务系统和数据库系统都要能实现弹性伸缩;
  • 系统可用性高,弹性收缩用户感知小;
  • 支持手工快速提升系统和数据库性能。

技术架构

本实践基于如下图所示的技术架构和主要流程。

互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第1张

方案优势

  • 应用弹性:通过配置合理的弹性伸缩配置,业务高峰期到来业务压力上涨时自动增加ECS实例保障业务系统平稳运行。对于可预见的快速业务上涨,配置定时任务或者通过手动执行伸缩规则的方式可以预先备齐ECS资源。业务低谷期自动释放多余ECS资源节约成本。
  • 数据库弹性:通过PolarDB在线节点配置弹性、只读节点弹性、同步克隆弹性和存储弹性四个维度的弹性,保障在大规模业务压力到来时快速应对业务压力。
  • 应用高可用性:通过ESS收缩配置设置均衡分布策略,在主可用区宕机时,ESS会在备可用区开出相同资源,保障业务平稳运行。
  • 缓存数据库和弹性负载均衡高可用性:通过多可用区的主备策略保障跨可用区自动容灾。

注意事项

  • 跨可用区访问可能会有1-2ms的延迟。
  • 数据库不能实现自动弹性伸缩,需要人工干预升降配。
  • 业务系统需无状态,有状态系统需要先进行业务改造。
  • PolarDB现阶段未推出同城容灾版本,若要容灾需通过DTS同步,切换时需要修改应用的数据库连接。
    说明 使用DTS实时同步PolarDB请参见文档从POLARDB MySQL同步至POLARDB MySQL

操作步骤

本例以WordPress为业务系统演示。

  1. 登录云数据库PolarDB版控制台
  2. 创建PolarDB集群数据库和拥有读写权限的账号,具体操作请参见数据库创建数据库账号
  3. 登录云服务器ECS控制台
  4. 连接目标ECS实例,具体操作请参见连接ECS实例
  5. 在ECS上安装解压和压测工具。
    yum install -y unzip zip sysbench dstat
    说明
    • unzip和zip为压缩和解压缩程序,后续解压zip文件使用。
    • sysbench和dstat为Linux系统压测和系统监控工具,后续验证弹性伸缩时使用。
  6. 在ECS上安装Apache和PHP组件。
    1. 安装Apache和PHP组件。
      yum install -y httpd php php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc
      说明 安装完成后使用如下命令查看PHP版本:
      yum list installed | grep php

      WordPress 5.2.2要求PHP最低版本为5.6.20,若PHP版本低于该版本,请使用如下命令重新安装PHP组件。

      ## 查看当前PHP版本
      yum list installed | grep php
      
      ## 卸载低版本PHP组件
      yum remove -y php.x86_64 php-cli.x86_64 php-common.x86_64 php-gd.x86_64 php-ldap.x86_64 php-mbstring.x86_64 php-mcrypt.x86_64 php-mysql.x86_64 php-pdo.x86_64
      
      ## 确认是否全都卸载完成
      yum list installed | grep php
      
      ## 安装PHP组件的rpm包
      rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm
      rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
      
      ## 重新安装PHP相关组件
      yum install -y php56w.x86_64 php56w-cli.x86_64 php56w-common.x86_64 php56w-gd.x86_64 php56w-ldap.x86_64 php56w-mbstring.x86_64 php56w-mcrypt.x86_64 php56w-mysql.x86_64 php56w-pdo.x86_64
    2. 启动Apache服务。
      service httpd start
    3. 设置Apache为开机默认启动。
      sudo chkconfig httpd on
    4. 编辑info.php文件。
      vim /var/www/html/info.php
    5. i进行编辑,在文件中输入如下内容。
      <?php
      phpinfo();
      ?>
      互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第2张
    6. 按Esc,输入:wq保存并退出。
    7. 在浏览器输入http://<ECS的弹性公网IP>/info.php,PHP安装正确会看到下图的PHP信息。互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第3张
  7. 在ECS上安装WordPress。
    1. 创建WordPress安装目录。
      mkdir -p /opt/WP
    2. 打开WP文件夹。
      cd /opt/WP
    3. 下载并解压WordPress。
      ## 下载WordPress
      wget https://cn.wordpress.org/latest-zh_CN.tar.gz
      
      ## 解压WordPress
      tar -xzvf latest-zh_CN.tar.gz
    4. 配置WordPress访问PolarDB。
      ## 打开wordpress文件夹
      cd /opt/WP/wordpress/
      
      ## 复制wp-config-sample.php文件,并将复制后的文件名称修改成为wp-config.php
      cp wp-config-sample.php wp-config.php
      
      ## 编辑wp-config.php文件
      vim wp-config.php
    5. i进行编辑,配置如下参数。
      /** WordPress数据库的名称 */
      define( 'DB_NAME', 'wp-polardb' );
      
      /** MySQL数据库用户名 */
      define( 'DB_USER', 'wp_user' );
      
      /** MySQL数据库密码 */
      define( 'DB_PASSWORD', 'password' );
      
      /** MySQL主机 */
      define( 'DB_HOST', 'pc-wz957jq**********.mysql.polardb.rds.aliyuncs.com' );
      互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第4张
      参数 描述 示例
      DB_NAME PolarDB数据库名称。 wp-polardb
      DB_USER PolarDB数据库账户的用户名。 wp_user
      DB_PASSWORD PolarDB数据库账户对应的密码。 password
      DB_HOST PolarDB数据库内网连接地址,查看内网连接地址方式请参见查看连接地址 pc-wz957jq**********.mysql.polardb.rds.aliyuncs.com
    6. 按Esc,输入:wq保存并退出。
    7. 打开/var/www/html/,并将wordpress目录复制到/var/www/html/路径下。
      cd /var/www/html
      cp -rf /opt/WP/wordpress/* /var/www/html/
    8. 在浏览器输入http://<ECS的弹性公网IP>,在WordPress配置页面填写站点标题、用户名和密码等信息,如下图所示。互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第5张
    9. 单击左下角安装WordPress,完成安装。
  8. 在WordPress上开通redis缓存支持。
    1. 下载并解压redis-cache插件。
      ## 切换到WP目录
      cd /opt/WP
      
      ## 下载redis-cache插件
      wget https://downloads.wordpress.org/plugin/redis-cache.1.4.1.zip
      
      ## 解压redis-cache
      unzip redis-cache.1.4.1.zip
      
      ## 复制到/var/www/html/wp-content/plugins/
      cp -rf redis-cache /var/www/html/wp-content/plugins/
    2. 编辑wp-config.php文件。
      vim /var/www/html/wp-config.php
    3. i进行编辑,在PolarDB设置后增加Redis数据库信息。
      /** Redis 主机 */
      define('WP_REDIS_HOST', 'r-**********.redis.rds.aliyuncs.com');
      
      /** Redis 端口 */
      define('WP_REDIS_PORT', '6379');
      
      /** 接受用于使用该SELECT命令自动选择逻辑数据库的数值,不用修改 */
      define('WP_REDIS_DATABASE', '10');
      
      /** Redis数据库密码 */
      define('WP_REDIS_PASSWORD', 'password');
      互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第6张
      参数 描述 示例
      WP_REDIS_HOST 云数据库Redis内网连接地址,查看内网连接地址方式请参见查看连接地址 r-**********.redis.rds.aliyuncs.com
      WP_REDIS_PORT Redis服务端口,默认为6379. 6379
      WP_REDIS_DATABASE 指定缓存信息保存的DB,例如10就是保存到DB10。 10
      WP_REDIS_PASSWORD Redis的连接密码 password
    4. 按Esc,输入:wq保存并退出。
    5. 复制配置文件到根目录下。
      cp /var/www/html/wp-content/plugins/redis-cache/includes/object-cache.php /var/www/html/wp-content/
    6. 在浏览器输入http://<ECS的弹性公网IP>/wp-login.php,登录WordPress管理页面。互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第7张
    7. 在左侧导航点单击插件 > 已安装插件
    8. 插件页面,单击Redis Object Cache下的启动互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第8张
    9. 单击Settings,打开Redis Object Cache页面。互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第9张
    10. Status显示Connected时,表示Redis数据库连接正常。您可以点击Flush Cache将缓存数据导入Redis数据库。互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第10张
  9. 在WordPress管理页面左侧导航栏中单击设置 > 常规,在WordPress地址(URL)站点地址(URL)选项中输入您预先申请并备案的域名。
    互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第11张
  10. 配置负载均衡。
    1. 登录负载均衡SLB控制台
    2. 在左侧导航栏单击实例 > 实例管理
    3. 定位到目标SLB实例,单击右侧点我开始配置互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第12张
    4. 负载均衡业务配置导航页面,选择HTTP协议,监听端口设置为80,开启开启会话保持功能,单击下一步互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第13张
    5. 单击默认服务器组 > 继续添加,勾选之前创建的ECS实例,单击下一步:配置权重和端口号互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第14张
    6. 设置端口号80权重50,单击下一步
    7. 配置健康检查页面,开启健康检查后单击下一步
    8. 配置审核页面,单击提交
    9. 待到审核项目都显示成功后单击确定即可。
  11. 登录云解析DNS控制台,将SLB弹性公网IP地址绑定预先申请并备案的域名。
    说明 如何绑定域名请参见添加网站解析
  12. 登录云服务器ECS控制台,为之前创建好的ECS创建镜像。
    说明 如何创建ECS实例镜像请参见使用实例创建自定义镜像
  13. 登录弹性伸缩控制台,配置弹性伸缩。
    1. 创建伸缩组。互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第15张
      说明 创建伸缩组具体配置请参见创建伸缩组
    2. 创建伸缩配置并启用。
      说明 创建伸缩配置具体配置请参见创建伸缩配置
    3. 在该伸缩组中加入ECS实例。
      1. 登录弹性伸缩控制台,单击目标伸缩组后的管理互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第16张
      2. 单击ECS实例列表 > 手动添加 > 添加已有实例,将目标ECS实例移动到右侧后,单击确定互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第17张
    4. 创建伸缩规则。互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第18张互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第19张
      说明 创建伸缩规则具体配置请参见创建伸缩规则
    5. 创建伸缩任务。 互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第20张互联网行业高弹性系统架构最佳实践_最佳实践_云数据库PolarDB 阿里云技术文档 第21张
      说明 创建伸缩任务具体配置请参见执行伸缩规则
  14. 验证弹性伸缩。
    1. 通过控制台登录ECS,登录操作请参见连接ECS实例
    2. 通过压测命令提高ECS的CPU使用率。
      sysbench cpu --cpu-max-prime=2000000 --threads=2 --time=1000 run
    3. 根据之前配置的报警任务。
      • 当CPU使用率超过80%时,触发ESS的报警任务,ESS会自动创建ECS服务器。
      • 当CPU使用率低于50%时,触发ESS的报警任务,ESS会自动减少ECS服务器。

      至此配置完成。