互联网行业高弹性系统架构最佳实践
本方案通过弹性伸缩和PolarDB的配合,实现应用和数据库两个层面的弹性。
原文请参见互联网行业高弹性系统架构最佳实践。
前提条件
所有云产品均需在同一VPC中,如何创建VPC请参见搭建IPv4专有网络。
已创建64位CentOS 7系统的ECS实例,创建步骤请参见创建ECS实例。
已创建PolarDB MySQL版集群,并在PolarDB白名单中添加VPC网段。
已创建同城容灾版本的云数据库Redis,并在Redis白名单中添加VPC网段。
已开通ESS服务,开通方式请参见开通并授权服务。
已创建SLB实例,创建方式请参见创建负载均衡实例。
已创建EIP,申请操作请参见申请新EIP。
已申请域名且已经完成域名备案。
应用场景
在互联网行业的业务发展中,很多业务具有突发性特点。
例如互联网电商的秒杀、促销等活动,这类业务的特点是时间固定,但访问量不固定。除了提前升级配置之外,客户往往希望系统本身也能有自动弹性伸缩的能力。
对于互联网教育的场景,由于存在放假和工作日的区别,系统也需要有一定的弹性伸缩能力去应对高出平时几倍的压力,等访问减少时,业务系统能释放冗余的资源达到节约成本的目标。
典型场景和需求:
业务系统波动大,以互联网行业为典型代表;
业务系统和数据库系统都要能实现弹性伸缩;
系统可用性高,弹性收缩用户感知小;
支持手工快速提升系统和数据库性能。
技术架构
本实践基于如下图所示的技术架构和主要流程。

方案优势
应用弹性:通过配置合理的弹性伸缩配置,业务高峰期到来业务压力上涨时自动增加ECS实例保障业务系统平稳运行。对于可预见的快速业务上涨,配置定时任务或者通过手动执行伸缩规则的方式可以预先备齐ECS资源。业务低谷期自动释放多余ECS资源节约成本。
数据库弹性:通过PolarDB在线节点配置弹性、只读节点弹性、同步克隆弹性和存储弹性四个维度的弹性,保障在大规模业务压力到来时快速应对业务压力。
应用高可用性:通过ESS收缩配置设置均衡分布策略,在主可用区宕机时,ESS会在备可用区开出相同资源,保障业务平稳运行。
PolarDB、Redis、SLB高可用性:通过多可用区的主备策略保障跨可用区自动容灾。
注意事项
跨可用区访问可能会有1~2ms的延迟。
数据库不能实现自动弹性伸缩,需要人工干预升降配。
业务系统需无状态,有状态系统需要先进行业务改造。
操作步骤
本例以WordPress为业务系统演示。
本文档中的命令只能由root权限的用户来执行。
登录云服务器ECS控制台。
连接目标ECS实例,具体操作请参见连接ECS实例。
在ECS上安装解压和压测工具。
yum install -y unzip zip sysbench dstat
说明unzip和zip为压缩和解压缩程序,后续解压zip文件使用。
Sysbench和dstat为Linux系统压测和系统监控工具,后续验证弹性伸缩时使用。
在ECS上安装Apache和PHP组件。
安装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
启动Apache服务。
service httpd start
设置Apache为开机默认启动。
sudo chkconfig httpd on
编辑
info.php
文件。vim /var/www/html/info.php
按
i
进行编辑,在文件中输入如下内容。<?php phpinfo(); ?>
按Esc,输入
:wq
保存并退出。在浏览器输入
http://<ECS的弹性公网IP>/info.php
,PHP安装正确会看到下图的PHP信息。
在ECS上安装WordPress。
创建WordPress安装目录。
mkdir -p /opt/WP
打开WP文件夹。
cd /opt/WP
下载并解压WordPress。
## 下载WordPress wget https://cn.wordpress.org/latest-zh_CN.tar.gz ## 解压WordPress tar -xzvf latest-zh_CN.tar.gz
配置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
按
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' );
参数
描述
示例
DB_NAME
PolarDB数据库名称。
wp-polardb
DB_USER
PolarDB数据库账户的用户名。
wp_user
DB_PASSWORD
PolarDB数据库账户对应的密码。
password
DB_HOST
PolarDB数据库内网连接地址,查看内网连接地址方式请参见管理连接地址。
pc-wz957jq**********.mysql.polardb.rds.aliyuncs.com
按Esc,输入
:wq
保存并退出。打开/var/www/html/,并将WordPress目录复制到/var/www/html/路径下。
cd /var/www/html cp -rf /opt/WP/wordpress/* /var/www/html/
在浏览器输入
http://<ECS的弹性公网IP>
,在WordPress配置页面填写站点标题、用户名和密码等信息,如下图所示。单击左下角安装WordPress,完成安装。
在WordPress上开通Redis缓存支持。
下载并解压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/
编辑
wp-config.php
文件。vim /var/www/html/wp-config.php
按
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');
参数
描述
示例
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
按Esc,输入
:wq
保存并退出。复制配置文件到根目录下。
cp /var/www/html/wp-content/plugins/redis-cache/includes/object-cache.php /var/www/html/wp-content/
在浏览器输入
http://<ECS的弹性公网IP>/wp-login.php
,登录WordPress管理页面。在左侧导航点单击
在插件页面,单击Redis Object Cache下的启动。
单击Settings,打开Redis Object Cache页面。
当Status显示Connected时,表示Redis数据库连接正常。您可以点击Flush Cache将缓存数据导入Redis数据库。
在WordPress管理页面左侧导航栏中单击 ,在WordPress地址(URL)和站点地址(URL)选项中输入您预先申请并备案的域名。
配置负载均衡。
登录负载均衡SLB控制台。
在左侧导航栏单击
定位到目标SLB实例,单击右侧点我开始配置。
在负载均衡业务配置导航页面,选择HTTP协议,监听端口设置为80,开启会话保持功能,单击下一步。
单击
,勾选之前创建的ECS实例,单击下一步:配置权重和端口号。设置端口号为80,权重为50,单击下一步。
在配置健康检查页面,开启健康检查后单击下一步。
在配置审核页面,单击提交。
待到审核项目都显示成功后单击确定即可。
登录云解析DNS控制台,将SLB弹性公网IP地址绑定预先申请并备案的域名。
说明如何绑定域名请参见添加网站解析。
登录云服务器ECS控制台,为之前创建好的ECS创建镜像。
说明如何创建ECS实例镜像请参见使用实例创建自定义镜像。
登录弹性伸缩控制台,配置弹性伸缩。
验证弹性伸缩。
通过控制台登录ECS,登录操作请参见连接ECS实例。
通过压测命令提高ECS的CPU使用率。
sysbench cpu --cpu-max-prime=2000000 --threads=2 --time=1000 run
根据之前配置的报警任务。
当CPU使用率超过80%时,触发ESS的报警任务,ESS会自动创建ECS服务器。
当CPU使用率低于50%时,触发ESS的报警任务,ESS会自动减少ECS服务器。
至此配置完成。