如何利用京東云建設(shè)高可用業(yè)務(wù)架構(gòu)
?作者:京東云 張久志
本文以 2022 年一個(gè)實(shí)際項(xiàng)目為基礎(chǔ),來(lái)演示在京東云上構(gòu)建高可用業(yè)務(wù)的整個(gè)過(guò)程。公有云及私有云客戶可通過(guò)使用京東云的彈性 IAAS、PAAS 服務(wù),創(chuàng)建高可用、高彈性、高可擴(kuò)展、高安全的云上業(yè)務(wù)環(huán)境,提升業(yè)務(wù) SLA, 提升運(yùn)維自動(dòng)化水平,降低資源成本及運(yùn)維成本。有業(yè)務(wù)遷移上云需求,希望構(gòu)建云上高可用業(yè)務(wù)架構(gòu)的客戶或?qū)υ粕细呖捎眉軜?gòu)規(guī)劃有興趣的讀者可以一看。
客戶業(yè)務(wù)為典型的 web 應(yīng)用,在京東云上創(chuàng)建一個(gè)通過(guò)公網(wǎng) IP/ 域名訪問(wèn)的高可用的 web 網(wǎng)站,包含通用應(yīng)用的標(biāo)準(zhǔn)框架,包括訪問(wèn)接入層、APP 層、緩存層、數(shù)據(jù)庫(kù)層。整體業(yè)務(wù)架構(gòu)設(shè)計(jì)提供可用區(qū) (AZ) 級(jí)別的高可用等級(jí)。
本文演示場(chǎng)景包括單 AZ 出現(xiàn)故障導(dǎo)致的主機(jī)故障、數(shù)據(jù)庫(kù)故障、緩存故障場(chǎng)景下,業(yè)務(wù)能夠提供持續(xù)訪問(wèn)能力。并保障數(shù)據(jù)的完整性和一致性,同時(shí),能夠在無(wú)人干預(yù)的條件下,實(shí)現(xiàn)業(yè)務(wù)的彈性擴(kuò)展,保障業(yè)務(wù)高并發(fā)的場(chǎng)景下有良好的響應(yīng)時(shí)間。
說(shuō)明:
本文的架構(gòu)為演示架構(gòu),并未嚴(yán)格遵循生產(chǎn)環(huán)境的業(yè)務(wù)性能及安全的整體規(guī)劃步驟及要求,在生產(chǎn)環(huán)境中,至少應(yīng)該對(duì)主機(jī)及 CFS 的存儲(chǔ)性能進(jìn)行壓測(cè),確保能夠滿足實(shí)際業(yè)務(wù)需求,同時(shí),通過(guò)域名訪問(wèn)的 web 服務(wù),建議使用 WAF 等安全防護(hù)產(chǎn)品,保障業(yè)務(wù)的入口安全。
1、京東云高可用架構(gòu)設(shè)計(jì)
業(yè)務(wù)架構(gòu)以某單位的業(yè)務(wù)需求為基礎(chǔ),模擬其業(yè)務(wù)生產(chǎn)環(huán)境,規(guī)劃京東云上的業(yè)務(wù)整體架構(gòu),其中, NAT 網(wǎng)關(guān)、負(fù)載均衡、堡壘機(jī)均創(chuàng)建在公網(wǎng)訪問(wèn)子網(wǎng),其余主機(jī)及數(shù)據(jù)庫(kù)等,創(chuàng)建在內(nèi)部子網(wǎng)內(nèi)。
其中應(yīng)用主機(jī)使用高可用組創(chuàng)建, LB 后端直接掛載高可用組。
使用高可用組的目標(biāo)是實(shí)現(xiàn)業(yè)務(wù)高峰期故障時(shí),計(jì)算資源能自動(dòng)加入負(fù)載均衡后端,自動(dòng)化擴(kuò)展業(yè)務(wù)處 理能力。減少運(yùn)維干預(yù)成本。
2、資源需求(所有IP及URL均調(diào)整為非真實(shí)IP及URL)
項(xiàng)目 | 規(guī)格 | 數(shù)量 | 說(shuō)明 | |
主機(jī) | 2C8G 50G 系統(tǒng)盤 | 2~3 | 為保障驗(yàn)證效果,主機(jī)能臨時(shí)綁定公網(wǎng) IP (生產(chǎn)環(huán)境無(wú)需綁 定) 100.126.38.2 (公) 10.0.1.16 100.126.38.3 (公) 10.0.1.13 10.0.1.16 演示過(guò)程中會(huì)有新主機(jī)生成 | |
高可用組 | 使用應(yīng)用主機(jī) 模板 | 1 | 配置彈性伸縮,配置告警條件,在業(yè)務(wù)壓力大導(dǎo)致 CPU 觸發(fā) 閾值后,自動(dòng)擴(kuò)容主機(jī),提升負(fù)載能力 | |
數(shù)據(jù)庫(kù) | 2C8G 50GSSD 存儲(chǔ) MySQL 5.7 | 1 | mysql -1-a0b7e160c1xxxx.jdcloud.com | |
Redis | 4G | 1 | redis-1kn4b5zwgzc5-xxxn-1.jdcloud.com | |
公網(wǎng) IP | 4 個(gè),主機(jī)及 LB 各一個(gè) | 4 | 5M 帶寬 | |
LB | 1 個(gè),配 1 個(gè)公 網(wǎng) IP 作為業(yè)務(wù) 入口 | 1 | LB 綁定公網(wǎng) IP,配置輪詢模式。例如, Vip: 10.0.1.27 公網(wǎng) IP: 100.126.35.4 | |
CFS | 1 個(gè) | 1 | 共享存儲(chǔ)作為業(yè)務(wù)應(yīng)用數(shù)據(jù)存儲(chǔ)目錄掛載于高可用組主機(jī)特 定目錄下:例如, mount -t nfs -o vers=3 -o noresvport 10.0.0.200:/cfs /wp |
3、應(yīng)用部署
3.1基礎(chǔ)環(huán)境準(zhǔn)備
業(yè)務(wù)以一個(gè)典型的 wordpress 的網(wǎng)站為例,業(yè)務(wù)容器化部署于云主機(jī)上,高可用依賴京東云的云主機(jī)高可用組,主機(jī)安裝 docker,并配置 docker 服務(wù)自動(dòng)啟動(dòng)。
注意,這個(gè)場(chǎng)景下,主要調(diào)整了幾個(gè)位置:
1、掛載 CFS 為 wordpress 的工作目錄,這樣,調(diào)整頁(yè)面內(nèi)容以及拉起新主機(jī)后,網(wǎng)站內(nèi)容都保持一致。相關(guān)自動(dòng)掛載方式為在 /etc/rc.local 加入掛載命令,同時(shí) chmod +x /etc/rc.d/rc.local 把這個(gè)文件加一下可執(zhí)行權(quán)限。
2、需要把 wp 目錄的權(quán)限改為 777 (或 docker 內(nèi)部的 33 tape 等,不過(guò)不同版本可能有區(qū)別,改成 777 相對(duì)穩(wěn)妥), 否則掛載后,docker 內(nèi)部的 wordpress 無(wú)法獲取目錄讀寫權(quán)限。
3、NFS 掛載需要安裝 nfs 插件 yum install nfs-utils -y 并啟動(dòng) rpc 服務(wù) systemctl enable rpcbind systemctl start rpcbind
WP 目錄為 777 權(quán)限
到這里基礎(chǔ)主機(jī)環(huán)境準(zhǔn)備完成。
下一步,進(jìn)行 wordpress 應(yīng)用的配置,實(shí)現(xiàn)高可用可視化的演示效果。
3.2業(yè)務(wù)側(cè)wordpress配置
web 應(yīng)用使用 wordpress 部署。通過(guò) docker 部署,并實(shí)現(xiàn)高可用組主機(jī)自動(dòng)伸縮自動(dòng)化拉起。
通過(guò) 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,作為多個(gè)應(yīng)用主機(jī)共同掛載,作為 wordpress 的應(yīng)用的應(yīng)用文件目錄。
啟動(dòng) wordpress 容器,并掛載 CFS 目錄為 WP 的應(yīng)用目錄。
以上部署在 3.1 中已經(jīng)完成。
前置準(zhǔn)備工作 - 負(fù)載均衡:
配置一個(gè)帶公網(wǎng) IP 的負(fù)載均衡,并配置監(jiān)聽(tīng)器,監(jiān)聽(tīng)器后端暫時(shí)配置一個(gè)已經(jīng)拉起了 docker 的這臺(tái)主機(jī)
前置準(zhǔn)備工作 - 數(shù)據(jù)庫(kù):
在配置網(wǎng)站前,需要首先在云控制臺(tái)的 RDS 那里為 wordpress 創(chuàng)建一個(gè)賬戶:wordpress,并設(shè)置密碼,建立一個(gè)庫(kù):wordpress(因?yàn)楹罄m(xù)演示方案有調(diào)整,我又創(chuàng)建了一個(gè)新庫(kù) wordpressbackup,實(shí)際正常來(lái)講一個(gè)庫(kù)就可以了),并授權(quán) wordpress 庫(kù)給 wordpress 用戶。
前置準(zhǔn)備工作 - redis:
在控制臺(tái)購(gòu)買一個(gè) redis,記錄 redis 的 URL,為后續(xù)配置 redis 緩存做準(zhǔn)備。
這樣,基本的應(yīng)用環(huán)境就緒了。
通過(guò)瀏覽器訪問(wèn)負(fù)載均衡 (注意訪問(wèn) LB,不直接訪問(wèn)主機(jī)) 的 IP 的 80 端口,即可進(jìn)入 wordpress 的配置 頁(yè)面, wordpress 的配置,主要是數(shù)據(jù)庫(kù)的地址以及數(shù)據(jù)庫(kù)前綴的配置,輸入正確的數(shù)據(jù)庫(kù)的 host 地址及密碼即可,其余保持默認(rèn),其他依據(jù)官網(wǎng)手冊(cè)指導(dǎo)保持默認(rèn)配置即可。
配置完成后,wordpress 會(huì)自動(dòng)為網(wǎng)站創(chuàng)建相關(guān)的表,并提示配置 wordpress 的 admin 以及管理密碼。
安裝完成后,可以登錄數(shù)據(jù)庫(kù)查看創(chuàng)建的表,后續(xù) MySQL 高可用演示時(shí),也可以登錄到數(shù)據(jù)庫(kù)做些常規(guī) 操作,不受高可用切換影響。
到此,基本的應(yīng)用就安裝完成了。
配置 redis 動(dòng)態(tài)緩存加速:
redis 的角色,在這個(gè)案例里邊,在 wordpress 里 redis 作為一個(gè)動(dòng)態(tài)加速緩存使用,對(duì)加速網(wǎng)站訪問(wèn), 減輕數(shù)據(jù)庫(kù)壓力起到一定作用。
下載 wordpress 的 redis 插件,redis-cache。
下載后通過(guò) wordpress 的管理頁(yè)面 -plugin --addnew 直接上傳,然后依據(jù)插件操作手冊(cè)安裝配置即可。
安裝 redis-cache 以后,會(huì)在 /wp/wp-content/plugins 目錄下生成一個(gè) redis-cache 目錄。需要同時(shí)在 /wp/wp- content 下生成一個(gè) object-cache.php 文件,正常來(lái)講,需要調(diào)整一個(gè)參數(shù) host 改成 redis 的域名即可。如果配置了密碼,就需要調(diào)整這個(gè)以及 redis-cache 目錄下的配置文件把密碼配置進(jìn)去,這個(gè)因?yàn)槭?nbsp;演示環(huán)境,redis 設(shè)置 了免密,生產(chǎn)環(huán)境一定要設(shè)置密碼。
安裝配置完成后,在管理界面的 setting 里會(huì)有 redis 的配置選項(xiàng),這個(gè)和版本有關(guān)系,有些版本可能會(huì)讓 在這里做參數(shù)配置。直接改文件參數(shù)效果是一樣的。
mysql 及 redis 管理及相關(guān)登錄方式介紹:
- MySQL 的登錄,沒(méi)有安裝 client,使用了一個(gè) mysql 的 docker
- 相關(guān)命令:
- docker run --name mysql -p 3306:3306 --restart=unless-stopped -v /root/dbackup/:/db -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
- 進(jìn)入 mysql 的 docker 中:
- docker exec -it mysql bash
- 連接 wordpress 使用的數(shù)據(jù)庫(kù):
- mysql -h mysql-xxxea04fc4c52.jdcloud.com -u wordpress -p
- use wordpressbackup;
- show tables;
- select id from wpbackup_posts;
- -- 中間因?yàn)樽隽硕啻窝菥毢蛿?shù)據(jù)庫(kù)切換,中間做了 wordpress 數(shù)據(jù)庫(kù)導(dǎo)出和導(dǎo)入操作
- mysql 數(shù)據(jù)庫(kù)導(dǎo)出(均在 mysql 的 docker 容器中執(zhí)行命令):
- mysqldump -h mysql-xxxa04fc4c52.jdcloud.com -uwordpress -p --databases wordpressbackup >/db/wordpressbackup-0322.sql
- 數(shù)據(jù)導(dǎo)入:
- 進(jìn)入數(shù)據(jù)庫(kù),
- use wordpressbackup;
- source /db/wordpressbackup-0322.sql;
- ----redis 驗(yàn)證
- redis 驗(yàn)證,同樣是沒(méi)有安裝 client,通過(guò) 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 配置主頁(yè)顯示 hostname 及來(lái)源 IP
--- 讓 wordpress 獲取 hostname 并在頁(yè)面展示 + 獲取訪客地址,以增強(qiáng)演示效果,明確看到訪問(wèn)的實(shí)際主 機(jī)位置。
為了讓訪問(wèn)者看到訪問(wèn)的 IP 是哪個(gè)(證實(shí)高可用組的自動(dòng)擴(kuò)容及業(yè)務(wù)的自動(dòng)拉起),需要在所使用的 theme 目錄的 function 里加入相關(guān)代碼。 /wp/wp- content/themes/twentytwentytwo/function.php
[root@AG-wordpress- HA-group1-c8705-2 twentytwentytwo]# vim /wp/wp-content/themes/twentytwentytwo/function.php
在里邊加入以下代碼,一個(gè)是 show_ip 函數(shù),一個(gè)是 show_hostname 函數(shù)。
然后,在 wordpress 的 site 里加入短代碼實(shí)現(xiàn):
保存后,看到頁(yè)面可以顯示相關(guān)的 IP 及 hostname 信息了。
到這里, wordpress 的應(yīng)用環(huán)境配置完成。
下一步配置業(yè)務(wù)的高可用環(huán)境,實(shí)現(xiàn)跨 AZ 的高可用組及主機(jī)自動(dòng)彈性伸縮。
3.3實(shí)例模板及高可用組、LB配置
單臺(tái)主機(jī)配置完成后,重啟能自動(dòng)拉起應(yīng)用,進(jìn)行確認(rèn)后, 將現(xiàn)有主機(jī)打一個(gè)鏡像。作為高可用組的實(shí)例模板。后續(xù) LB 后端的高可用組通過(guò)這個(gè)模板創(chuàng)建主機(jī)。
其余包括數(shù)據(jù)庫(kù)配置、網(wǎng)站數(shù)據(jù)、redis 緩存配置等,均實(shí)現(xiàn)了服務(wù)及數(shù)據(jù)的分離,因此,在后期進(jìn)行動(dòng) 態(tài)彈性擴(kuò)容時(shí),使用這個(gè)模板的高可用組,可以直接拉起服務(wù),實(shí)現(xiàn)動(dòng)態(tài)彈性伸縮。
實(shí)例模板:
高可用組:
高可用組使用制作好了 wordpress 的應(yīng)用主機(jī)的鏡像。做到高可用組自動(dòng)彈性伸縮出新主機(jī) -- 新主機(jī)自動(dòng) 拉起 wordpress 應(yīng)用 -- 新主機(jī)自動(dòng)掛載到 LB 接收業(yè)務(wù)流量的模式。
LB 配置。
LB 監(jiān)聽(tīng)器選擇后端服務(wù)為高可用組,并配置健康檢查。
高可用組掛載到 LB 后端以后,應(yīng)用環(huán)境已經(jīng)搭建完成。
可以訪問(wèn) LB 入口,訪問(wèn)到網(wǎng)站,并且會(huì)輪詢到不同服務(wù)器,同時(shí),訪問(wèn)單臺(tái)服務(wù)器的外網(wǎng) IP 也可以訪問(wèn)網(wǎng)站業(yè)務(wù):
LB 訪問(wèn)截圖 (2 張,分別訪問(wèn)到了兩個(gè)主機(jī))
單臺(tái)主機(jī)訪問(wèn)截圖(直接訪問(wèn)單臺(tái)主機(jī) IP,刷新后不會(huì)輪詢主機(jī)):
演示環(huán)境就緒。
下一步,進(jìn)行破壞性演練,檢驗(yàn)高可用環(huán)境的效果。
4、應(yīng)用演示
高可用演示腳本:
驗(yàn)證項(xiàng)目 | 詳細(xì)描述 | 預(yù)期結(jié)果 | |
云主機(jī) | 模擬主機(jī)故障 - 通過(guò)底層命令 / 控制臺(tái)關(guān)閉可用區(qū) A 的應(yīng)用云主機(jī) | 站點(diǎn)訪問(wèn)正常,可以新增、刪除、修改 post | |
高可用組 | 高可用組配置彈性伸縮,設(shè)置最小最 大實(shí)例個(gè)數(shù),并配置伸縮觸發(fā)的閾值 (告警配置內(nèi)配置) | 通過(guò) stress 命令模擬高并發(fā)場(chǎng)景,高可用組通 過(guò)彈性伸縮特性創(chuàng)建新主機(jī)并掛載到 LB 后,實(shí)現(xiàn)多主機(jī)接收流量 | |
RDS | 模擬 RDS 實(shí)例故障 - 通過(guò)底層命令關(guān)閉 RDS 的主實(shí)例 | - 主從切換,業(yè)務(wù)不受影響 | |
RDS | 主從切換從控制臺(tái)可以看到切換過(guò)程 | 切換過(guò)程完成后, RDS 狀態(tài)為運(yùn)行中 | |
Redis | 模擬 Redis 實(shí)例故障 - 通過(guò)底層命令關(guān) 閉 Redis 的主實(shí)例 | - 主從切換,業(yè)務(wù)不受影響(本文未截圖) | |
Redis | redis 在模擬故障過(guò)程中,業(yè)務(wù)持續(xù)訪 問(wèn) | 從 redis 返回的數(shù)據(jù)不受切換影響(本文未截圖) |
高可用組信息,目前 LB 后端掛載的為高可用組:
測(cè)試頁(yè)面信息(所有 IP 均為非真實(shí) IP):
業(yè)務(wù)入口 (LB): http://100.126.35.4/
高可用組單臺(tái)主機(jī)訪問(wèn)入口目前為:
http://100.126.38.13/
http://100.126.38.16
主機(jī)的高可用及自動(dòng)伸縮:
演示所需的一些腳本:
一個(gè)是模擬生產(chǎn)環(huán)境,對(duì)業(yè)務(wù)主入口的 LB 持續(xù)訪問(wèn),這個(gè)在測(cè)試過(guò)程中,一直可以訪問(wèn)到,不會(huì)中斷。
一個(gè)是模擬單機(jī)環(huán)境,對(duì)業(yè)主機(jī)入口的持續(xù)訪問(wèn),這個(gè)在測(cè)試過(guò)程中,當(dāng)針對(duì)單機(jī)關(guān)機(jī)時(shí),訪問(wèn)會(huì)卡住。
演示過(guò)程中,高可用組自動(dòng)伸縮功能,能正常擴(kuò)容出新的主機(jī)并提供業(yè)務(wù)訪問(wèn)。
- 高可用組的自動(dòng)伸縮,通過(guò) stress 模擬壓力
- 安裝 stress 后,直接運(yùn)行(主機(jī)為 2C):
- stress --CPU 2
- 通過(guò) top 命令可以看到 CPU 被打滿。
- 過(guò) 2 分鐘(高可用組伸縮策略配置的時(shí)間),高可用組會(huì)自動(dòng)擴(kuò)展一臺(tái)主機(jī),并作為高可用組的一臺(tái)主機(jī)自動(dòng)掛載到 LB 的后端,可在 LB 及主機(jī)界面看到自動(dòng)擴(kuò)容的主機(jī)。
在控制臺(tái)將一臺(tái)高可用組內(nèi)主機(jī)關(guān)機(jī),然后可見(jiàn) LB 后端服務(wù)健康檢查發(fā)現(xiàn)掛載的高可用組一臺(tái)服務(wù)器異常,高可用組如配置最小的主機(jī)數(shù)量,則高可用組也自動(dòng)擴(kuò)出一臺(tái)主機(jī),繼續(xù)提供服務(wù)。在此期間,流量會(huì)轉(zhuǎn)發(fā)給后端正常主機(jī),健康檢查異常的主機(jī)不再接收流量,業(yè)務(wù)訪問(wèn)持續(xù)正常。
PAAS 服務(wù)的高可用:
本演示以 MySQL 及 redis 研發(fā)在底層直接殺 docker,然后業(yè)務(wù)訪問(wèn)不中斷,控制臺(tái)上會(huì)出現(xiàn)主從切換現(xiàn)象在這個(gè)過(guò)程中對(duì)業(yè)務(wù)的訪問(wèn)不會(huì)中斷。
云數(shù)據(jù)庫(kù)及緩存的破壞性操作,底層操作由研發(fā)操作。
底層進(jìn)行 RDS 主備切換(kill 掉 RDS 主庫(kù)),業(yè)務(wù)訪問(wèn)同樣不會(huì)中斷,研發(fā)提供截圖可以看到主從切換過(guò)程。
本文實(shí)際部署環(huán)境為京東為客戶搭建的私有云環(huán)境(JDSTACK),公有云與私有云為相同技術(shù)棧,搭建及驗(yàn)證過(guò)程相似。限于篇幅,redis 驗(yàn)證部分及主機(jī)可訪問(wèn)性腳本結(jié)果未截圖,感興趣的讀者可自行在云上通過(guò)本文指引過(guò)程搭建驗(yàn)證。?