作者:京东云 张久志

本文以2022年一个理论我的项目为根底,来演示在京东云上构建高可用业务的整个过程。私有云及公有云客户可通过应用京东云的弹性IAAS、PAAS服务,创立高可用、高弹性、高可扩大、高平安的云上业务环境,晋升业务SLA,晋升运维自动化程度,升高资源老本及运维老本。有业务迁徙上云需要,心愿构建云上高可用业务架构的客户或对云上高可用架构布局有趣味的读者能够一看。

客户业务为典型的web利用,在京东云上创立一个通过公网IP/域名拜访的高可用的web网站,蕴含通用利用的规范框架,包含拜访接入层、APP层、缓存层、数据库层。整体业务架构设计提供可用区(AZ)级别的高可用等级。

本文演示场景包含单AZ呈现故障导致的主机故障、数据库故障、缓存故障场景下,业务可能提供继续拜访能力。并保障数据的完整性和一致性,同时,可能在无人干涉的条件下,实现业务的弹性扩大,保障业务高并发的场景下有良好的响应工夫。

阐明:

本文的架构为演示架构,_并未严格遵循生产环境_的业务性能及平安的整体规划步骤及要求,在生产环境中,至多应该对主机及CFS的存储性能进行压测,确保可能满足理论业务需要,同时,通过域名拜访的web服务,倡议应用WAF等平安防护产品,保障业务的入口平安。

1、京东云高可用架构设计

业务架构以某单位的业务需要为根底,模仿其业务生产环境,布局京东云上的业务整体架构,其中,  NAT网关、负载平衡、堡垒机均创立在公网拜访子网,其余主机及数据库等,创立在外部子网内。

其中利用主机应用高可用组创立, LB后端间接挂载高可用组。

应用高可用组的指标是实现业务高峰期故障时,计算资源能主动退出负载平衡后端,自动化扩大业务处 理能力。缩小运维干涉老本。

2、资源需求(所有IPURL均调整为非实在IPURL

3、利用部署

3.1 根底环境筹备

业务以一个典型的wordpress的网站为例,业务容器化部署于云主机上,高可用依赖京东云的云主机高可用组,主机装置docker,并配置docker服务主动启动。

#创立利用数据目录 配置目录权限、装置docker等 mkdir -p /wp chmod 777 /wp yum install docker vim -y systemctl enable docker systemctl start docker #挂载CFS文件作为利用数据目录 yum install nfs-utils -y systemctl enable rpcbind     systemctl start rpcbind mount -t nfs -o vers=3 -o noresvport 10.0.0.200:/cfs /wp#配置启动主动挂载CFS及启动服务,通过rc.local实现:#[root@wpha0 wp]# cat /etc/rc.local#!/bin/bash# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES## It is highly advisable to create own systemd services or udev rules# to run scripts during boot instead of using this file.## In contrast to previous versions due to parallel execution during boot# this script will NOT be run after all other services.## Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure# that this script will be executed during boot.touch /var/lock/subsys/localmount -t nfs -o vers=3 -o noresvport 10.0.0.200:/cfs /wp#(阐明,生产环境可在/etc/fstab挂载)bash /root/start.shstart.sh见以下代码[root@wpha0 wp]# cat /root/start.shdocker stop wordpresssleep 3docker rm wordpresssleep 3docker run -d --name=wordpress --restart=unless-stopped -p 443:443 -p 80:80 -v /wp:/var/www/html wordpress#[root@wpha0 wp]##启动脚本编辑实现后,并写入rc.local后,rc.local调整成可执行,以实现启动主机运行脚本, rc.local实现了主机启动后主动挂载CFS到指定目录,而后,通过start.sh主动革除旧数据,从新拉起wordpress服务。chmod +x /etc/rc.d/rc.local#拉取利用所需镜像 docker pull wordpress#拉取镜像后,运行服务。docker run -d --name=wordpress --restart=unless-stopped    -p 443:443 -p 80:80  -v /wp:/var/www/html  wordpress 

留神,这个场景下,次要调整了几个地位:

1、挂载CFS为wordpress的工作目录,这样,调整页面内容以及拉起新主机后,网站内容都保持一致。相干主动挂载形式为在/etc/rc.local退出挂载命令,同时chmod +x /etc/rc.d/rc.local 把这个文件加一下可执行权限。

2、须要把wp目录的权限改为777 (或docker外部的 33 tape等,不过不同版本可能有区别,改成777绝对稳当), 否则挂载后,docker外部的wordpress无奈获取目录读写权限。

3、NFS挂载须要装置nfs插件 yum install nfs-utils -y 并启动rpc服务 systemctl enable rpcbind   systemctl start rpcbind

WP目录为777 权限

到这里根底主机环境筹备实现。

下一步,进行wordpress利用的配置,实现高可用可视化的演示成果。

3.2 业务侧 wordpress配置

web利用应用wordpress部署。通过docker部署,并实现高可用组主机主动伸缩自动化拉起。

通过docker拉取wordpress

docker pull wordpress

拉取镜像后

docker run -d --name=wordpress --restart=unless-stopped    -p 443:443 -p 80:80  -v /wp:/var/www/html  wordpress

其中/wp 是挂载的CFS,作为多个利用主机独特挂载,作为wordpress的利用的利用文件目录。

启动wordpress容器,并挂载CFS目录为WP的利用目录。

以上部署在3.1中曾经实现。

前置筹备工作-负载平衡:

配置一个带公网IP的负载平衡,并配置监听器,监听器后端临时配置一个曾经拉起了docker的这台主机

前置筹备工作-数据库:

在配置网站前,须要首先在云控制台的RDS那里为wordpress创立一个账户:wordpress,并设置明码,建设一个库:wordpress(因为后续演示计划有调整,我又创立了一个新库wordpressbackup,理论失常来讲一个库就能够了),并受权wordpress库给wordpress用户。

前置筹备工作-redis:

在控制台购买一个redis,记录redis的URL,为后续配置redis 缓存做筹备。

这样,根本的应用环境就绪了。

通过浏览器拜访负载平衡(留神拜访LB,不间接拜访主机)的IP的80端口,即可进入wordpress的配置 页面, wordpress的配置,次要是数据库的地址以及数据库前缀的配置,输出正确的数据库的host 地址及明码即可,其余放弃默认,其余根据官网手册领导放弃默认配置即可。

配置实现后,wordpress会主动为网站创立相干的表,并提醒配置wordpress的admin以及治理明码。

装置实现后,能够登录数据库查看创立的表,后续MySQL高可用演示时,也能够登录到数据库做些惯例 操作,不受高可用切换影响。

到此,根本的利用就装置实现了。

配置redis动静缓存减速:

redis的角色,在这个案例里边,在wordpress里 redis 作为一个动静减速缓存应用,对减速网站拜访, 加重数据库压力起到肯定作用。

下载wordpress的redis插件,redis-cache。

下载后通过wordpress的治理页面-plugin --addnew 间接上传,而后根据插件操作手册装置配置即可。

装置redis-cache当前,会在/wp/wp-content/plugins 目录下生成一个 redis-cache目录。须要同时在/wp/wp- content 下生成一个 object-cache.php文件,失常来讲,须要调整一个参数host改成redis的域名即可。如果配置了明码,就须要调整这个以及redis-cache目录下的配置文件把明码配置进去,这个因为是 演示环境,redis设置 了免密,生产环境肯定要设置明码。

装置配置实现后,在治理界面的setting里会有redis的配置选项,这个和版本有关系,有些版本可能会让 在这里做参数配置。间接改文件参数成果是一样的。

mysqlredis治理及相干登录形式介绍:

MySQL的登录,没有装置client,应用了一个mysql的docker

相干命令:

docker run --name mysql -p 3306:3306  --restart=unless-stopped -v /root/dbackup/:/db -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

进入mysql的docker中:

docker exec -it mysql bash

连贯wordpress应用的数据库:

mysql  -h mysql-xxxea04fc4c52.jdcloud.com -u wordpress -p

use wordpressbackup;

show tables;

select id from wpbackup_posts;

--两头因为做了屡次演练和数据库切换,两头做了wordpress数据库导出和导入操作

mysql 数据库导出(均在mysql的docker容器中执行命令):

mysqldump  -h  mysql-xxxa04fc4c52.jdcloud.com -uwordpress -p --databases wordpressbackup >/db/wordpressbackup-0322.sql

数据导入:

进入数据库,

use wordpressbackup;

source /db/wordpressbackup-0322.sql;

----redis验证

redis验证,同样是没有装置client,通过docker里的命令行去连贯:

docker run -d --name redis --memory=1G -p 7379:6379   redis

docker exec -it redis bash

redis-cli -h redis-j49rpxxx.jdcloud.com

登入后,查看信息:

KEYS *

wordpress配置主页显示hostname及起源IP

---让wordpress获取hostname 并在页面展现+获取访客地址,以加强演示成果,明确看到拜访的理论主 机地位。

为了让访问者看到拜访的IP是哪个(证实高可用组的主动扩容及业务的主动拉起),须要在所应用的 theme 目录的function里退出相干代码。  /wp/wp- content/themes/twentytwentytwo/function.php

[root@AG-wordpress- HA-group1-c8705-2 twentytwentytwo]# vim /wp/wp-content/themes/twentytwentytwo/function.php

在里边退出以下代码,一个是show_ip函数,一个是show_hostname函数。

function get_the_user_ip() {if ( ! empty( $_SERVER["HTTP_CLIENT_IP"] ) ) {//check ip from share internet$ip = $_SERVER["HTTP_CLIENT_IP"];} elseif ( ! empty( $_SERVER["HTTP_X_FORWARDED_FOR"] ) ) {//to check ip is pass from proxy$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];} else {$ip = $_SERVER["REMOTE_ADDR"];}return apply_filters( "wpb_get_ip", $ip );}add_shortcode("show_ip", "get_the_user_ip");function get_hostname(){     $hostname = gethostname();          echo "$hostname\n";      return apply_filters( "hostname", $hostname );}add_shortcode("show_hostname", "get_hostname");

而后,在wordpress的site里退出短代码实现:

保留后,看到页面能够显示相干的IP及hostname信息了。

到这里,  wordpress的应用环境配置实现。

下一步配置业务的高可用环境,实现跨AZ的高可用组及主机主动弹性伸缩。

3.3 实例模板及高可用组、LB配置

单台主机配置实现后,重启能主动拉起利用,进行确认后, 将现有主机打一个镜像。作为高可用组的实例模板。后续LB后端的高可用组通过这个模板创立主机。

其余包含数据库配置、网站数据、redis缓存配置等,均实现了服务及数据的拆散,因而,在前期进行动 态弹性扩容时,应用这个模板的高可用组,能够间接拉起服务,实现动静弹性伸缩。

实例模板:

高可用组:

高可用组应用制作好了wordpress的利用主机的镜像。做到高可用组主动弹性伸缩出新主机--新主机主动 拉起wordpress利用--新主机主动挂载到LB接管业务流量的模式。

LB配置。

LB监听器抉择后端服务为高可用组,并配置健康检查。

高可用组挂载到LB后端当前,应用环境曾经搭建实现。

能够拜访LB入口,拜访到网站,并且会轮询到不同服务器,同时,拜访单台服务器的外网IP 也能够拜访网站业务:

LB拜访截图(2张,别离拜访到了两个主机)

单台主机拜访截图(间接拜访单台主机IP,刷新后不会轮询主机):

演示环境就绪。

下一步,进行破坏性演练,测验高可用环境的成果。

4、利用演示

高可用演示脚本:

高可用组信息,目前LB后端挂载的为高可用组:

测试页面信息(所有IP均为非实在IP):

业务入口(LB):   http://100.126.35.4/

高可用组单台主机拜访入口目前为:

http://100.126.38.13/

http://100.126.38.16

主机的高可用及主动伸缩:

演示所需的一些脚本:

一个是模仿生产环境,对业务主入口的LB继续拜访,这个在测试过程中,始终能够拜访到,不会中断。

#!/bin/bash#for ((i=1;i<=10;i++))for i in {1..15000} docurl 100.126.35.4echo $iecho $(date +%T)sleep 3  done

![]()

一个是模仿单机环境,对业主机入口的继续拜访,这个在测试过程中,当针对单机关机时,拜访会卡住。

#!/bin/bash#for ((i=1;i<=10;i++))for i in {1..15000} docurl 100.126.38.16echo $iecho $(date +%T)sleep 3  done

演示过程中,高可用组主动伸缩性能,能失常扩容出新的主机并提供业务拜访。

高可用组的主动伸缩,通过 stress模仿压力

装置stress后,间接运行(主机为2C):

stress --CPU 2

通过top命令能够看到CPU被打满。

过2分钟(高可用组伸缩策略配置的工夫),高可用组会主动扩大一台主机,并作为高可用组的一台主机主动挂载到LB的后端,可在LB及主机界面看到主动扩容的主机。

在控制台将一台高可用组内主机关机,而后可见LB后端服务健康检查发现挂载的高可用组一台服务器异样,高可用组如配置最小的主机数量,则高可用组也主动扩出一台主机,持续提供服务。在此期间,流量会转发给后端失常主机,健康检查异样的主机不再接管流量,业务拜访继续失常。

PAAS服务的高可用:

本演示以MySQL及redis研发在底层间接杀docker,而后业务拜访不中断,管制台上会呈现主从切换景象在这个过程中对业务的拜访不会中断。

云数据库及缓存的破坏性操作,底层操作由研发操作。

底层进行RDS主备切换(kill掉RDS主库),业务拜访同样不会中断,研发提供截图能够看到主从切换过程。

本文理论部署环境为京东为客户搭建的公有云环境(JDSTACK),私有云与公有云为雷同技术栈,搭建及验证过程类似。限于篇幅,redis验证局部及主机可拜访性脚本后果未截图,感兴趣的读者可自行在云上通过本文指引过程搭建验证。