【案例分享】如何利用京东云建设高可用业务架构

京东云开发者
• 阅读 80

作者:京东云 张久志

本文以2022年一个实际项目为基础,来演示在京东云上构建高可用业务的整个过程。公有云及私有云客户可通过使用京东云的弹性IAAS、PAAS服务,创建高可用、高弹性、高可扩展、高安全的云上业务环境,提升业务SLA,提升运维自动化水平,降低资源成本及运维成本。有业务迁移上云需求,希望构建云上高可用业务架构的客户或对云上高可用架构规划有兴趣的读者可以一看。

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

本文演示场景包括单AZ出现故障导致的主机故障、数据库故障、缓存故障场景下,业务能够提供持续访问能力。并保障数据的完整性和一致性,同时,能够在无人干预的条件下,实现业务的弹性扩展,保障业务高并发的场景下有良好的响应时间。

说明:

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

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

业务架构以某单位的业务需求为基础,模拟其业务生产环境,规划京东云上的业务整体架构,其中, NAT网关、负载均衡、堡垒机均创建在公网访问子网,其余主机及数据库等,创建在内部子网内。

【案例分享】如何利用京东云建设高可用业务架构

其中应用主机使用高可用组创建, LB后端直接挂载高可用组。

使用高可用组的目标是实现业务高峰期故障时,计算资源能自动加入负载均衡后端,自动化扩展业务处 理能力。减少运维干预成本。

2、资源需**求(所有IPURL均调整为非真实IP**URL

【案例分享】如何利用京东云建设高可用业务架构

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/local

mount -t nfs -o vers=3 -o noresvport 10.0.0.200:/cfs /wp

#(说明,生产环境可在/etc/fstab挂载)

bash /root/start.sh

start.sh见以下代码

[root@wpha0 wp]# cat /root/start.sh

docker stop wordpress

sleep 3

docker rm wordpress

sleep 3

docker 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}
 do
curl 100.126.35.4
echo $i
echo $(date +%T)
sleep 3
  done

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

#!/bin/bash

#for ((i=1;i<=10;i++))

for i in {1..15000}

 do

curl 100.126.38.16

echo $i

echo $(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验证部分及主机可访问性脚本结果未截图,感兴趣的读者可自行在云上通过本文指引过程搭建验证。

点赞
收藏
评论区
推荐文章
Peter20 Peter20
1年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
其他专业领域的AWS认证有哪些?
除了云从业者、架构师、运维人员、开发人员四种身份外,还为其他专业领域的人提供认证考试。AWS认证的高级网络适合执行复杂网络任务的个人。主要从网络设计/规划的角度,考生使用AWS设计、开发和部署高可用的网络架构,使用执行工具自动执行AWS组网任务。其中很大一部分是在学习AWS直连、VPN、弹性负载均衡器、VPC、BGP路由协议等网络的知识。这次考试的难度仅次于
腾讯云原生 腾讯云原生
1年前
宙斯盾 DDoS 防护系统“降本增效”的云原生实践
作者tomdu,腾讯云高级工程师,主要负责宙斯盾安全防护系统管控中心架构设计和后台开发工作。导语宙斯盾DDoS防护系统作为公司级网络安全产品,为各类业务提供专业可靠的DDoS/CC攻击防护。在黑客攻防对抗日益激烈的环境下,DDoS对抗不仅需要“降本”还需要“增效”。随着云原生的普及,宙斯盾团队持续投入云原生架构改造和优化,以提升系统的处理能力及
腾讯云原生 腾讯云原生
1年前
用户案例 | 腾讯医疗资讯平台云原生容器化之路
作者yuhuliu,腾讯研发工程师,关注存储、大数据、云原生领域。摘要医疗资讯业务在高速发展过程中,形成了覆盖不同场景、不同用户、不同渠道的几十个业务,以及上千个服务。为了高效满足用户多样化的需求,医疗技术团队通过TKE上云,使用CodingDevOps平台,以及云上可观测技术,来提升研发效率、降低运营运维成本。本文介绍我们在上云过程中一些实践和
Wesley13 Wesley13
1年前
ECS主动运维2.0,体验升级,事半功倍
_摘要:_ 阿里云致力于提供更好用的运维体验,让您使用ECS的过程更透明、高效,并实现更加标准化、自动化的运维方式。基于主动运维2.0,您使用ECS云服务器的体验更加流畅,而且利用系统事件,不再依赖于工单联系客服,可以通过自助处理的方式响应主动运维实例重启,减少对系统可靠性和业务连续性的影响。   云服务器ECS(ElasticCompute
Stella981 Stella981
1年前
OpenStack最新版本Victoria发布亮点与初体验
前言OpenStack是一个云操作系统,可控制整个数据中心内的大型计算,存储和网络资源池,所有资源均通过具有通用身份验证机制的API进行管理和配置。还提供了一个仪表板,可让管理员进行控制,同时授权其用户通过Web界面配置资源。除了标准的基础架构即服务功能外,其他组件还提供业务流程,故障管理和服务管理等其他服务,以确保用户应用程序的高可用性
Stella981 Stella981
1年前
Spring boot 2.3优雅下线,距离生产还有多远?
前言在生产环境中,随着云原生架构的发展,自动的弹性伸缩、滚动升级、分批发布等云原生能力让用户享受到了资源、成本、稳定性的最优解。但是在应用的缩容、发布等过程中,由于实例下线处理得不够优雅,将会导致短暂的服务不可用,短时间内业务监控会出现大量io异常报错;如果业务没做好事务,那么还会引起数据不一致的问题,那么需要紧急手动订正错误数据;甚至每次发布
Wesley13 Wesley13
1年前
AIoT 开发学习资料汇总
简介:一站式打包AIoT开发者资料,助您快速掌握AIoT场景搭建技能。<aname"JnnBF"</a一、阿里云AIoT产品/资源矩阵先盘点一下有哪些可用的产品和服务,以便快速集成,搭建出高可靠应用。<aname"kb0KG"</a设备服务设备接入服务(
飞速成功案例 | “ 腾讯+飞速 ” 互联网企业的数字化实践之路
​腾讯作为BAT三大巨头之一;在2018年引进了低代码平台,以低代码为核心的一体化高生产力平台赋能业务,在不同的业务领域中进行探索和突破。传统低代码无法适应市场发展随着腾讯的核心业务迅速发展,定制化需求的业务不断涌现,传统模块无法适应快速发展的市场定制化需求;尤其是标准化应用二次开发的限制成为了业务掣肘,信息化建设倾向于统建、大集中共享模式,对项目协同与管控要求较高。基于此,如何通过容器化优化资源使用、提升运维效率、加速微服务落地;使用国产化的底层资源和服务,做到自主可控,安全性强;实现系统云化、简单易用
京东云开发者 京东云开发者
1个月前
计算存储分离在京东云消息中间件JCQ上的应用
作者:田寄远JCQ全名JDCloudMessageQueue,是京东云自研、具有CloudNative特性的分布式消息中间件。JCQ设计初衷即为适应云特性的消息中间件;具有高可用、数据可靠性、副本物理隔离、服务自治、健康状态汇报、少运维或无运维、容器部署、