如何利用京東云建設(shè)高可用業(yè)務(wù)架構(gòu)
?作者:京東云 張久志
本文以 2022 年一個(gè)實(shí)際項(xiàng)目為基礎(chǔ),來演示在京東云上構(gòu)建高可用業(yè)務(wù)的整個(gè)過程。公有云及私有云客戶可通過使用京東云的彈性 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è)通過公網(wǎng) IP/ 域名訪問的高可用的 web 網(wǎng)站,包含通用應(yīng)用的標(biāo)準(zhǔn)框架,包括訪問接入層、APP 層、緩存層、數(shù)據(jù)庫層。整體業(yè)務(wù)架構(gòu)設(shè)計(jì)提供可用區(qū) (AZ) 級(jí)別的高可用等級(jí)。
本文演示場景包括單 AZ 出現(xiàn)故障導(dǎo)致的主機(jī)故障、數(shù)據(jù)庫故障、緩存故障場景下,業(yè)務(wù)能夠提供持續(xù)訪問能力。并保障數(shù)據(jù)的完整性和一致性,同時(shí),能夠在無人干預(yù)的條件下,實(shí)現(xiàn)業(yè)務(wù)的彈性擴(kuò)展,保障業(yè)務(wù)高并發(fā)的場景下有良好的響應(yīng)時(shí)間。
說明:
本文的架構(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)行壓測,確保能夠滿足實(shí)際業(yè)務(wù)需求,同時(shí),通過域名訪問的 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ǎng),其余主機(jī)及數(shù)據(jù)庫等,創(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ù)量 | 說明 | |
主機(jī) | 2C8G 50G 系統(tǒng)盤 | 2~3 | 為保障驗(yàn)證效果,主機(jī)能臨時(shí)綁定公網(wǎng) IP (生產(chǎn)環(huán)境無需綁 定) 100.126.38.2 (公) 10.0.1.16 100.126.38.3 (公) 10.0.1.13 10.0.1.16 演示過程中會(huì)有新主機(jī)生成 | |
高可用組 | 使用應(yīng)用主機(jī) 模板 | 1 | 配置彈性伸縮,配置告警條件,在業(yè)務(wù)壓力大導(dǎo)致 CPU 觸發(fā) 閾值后,自動(dòng)擴(kuò)容主機(jī),提升負(fù)載能力 | |
數(shù)據(jù)庫 | 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è)場景下,主要調(diào)整了幾個(gè)位置:
1、掛載 CFS 為 wordpress 的工作目錄,這樣,調(diào)整頁面內(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 等,不過不同版本可能有區(qū)別,改成 777 相對(duì)穩(wěn)妥), 否則掛載后,docker 內(nèi)部的 wordpress 無法獲取目錄讀寫權(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 部署。通過 docker 部署,并實(shí)現(xiàn)高可用組主機(jī)自動(dòng)伸縮自動(dòng)化拉起。
通過 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)聽器,監(jiān)聽器后端暫時(shí)配置一個(gè)已經(jīng)拉起了 docker 的這臺(tái)主機(jī)
前置準(zhǔn)備工作 - 數(shù)據(jù)庫:
在配置網(wǎng)站前,需要首先在云控制臺(tái)的 RDS 那里為 wordpress 創(chuàng)建一個(gè)賬戶:wordpress,并設(shè)置密碼,建立一個(gè)庫:wordpress(因?yàn)楹罄m(xù)演示方案有調(diào)整,我又創(chuàng)建了一個(gè)新庫 wordpressbackup,實(shí)際正常來講一個(gè)庫就可以了),并授權(quán) wordpress 庫給 wordpress 用戶。
前置準(zhǔn)備工作 - redis:
在控制臺(tái)購買一個(gè) redis,記錄 redis 的 URL,為后續(xù)配置 redis 緩存做準(zhǔn)備。
這樣,基本的應(yīng)用環(huán)境就緒了。
通過瀏覽器訪問負(fù)載均衡 (注意訪問 LB,不直接訪問主機(jī)) 的 IP 的 80 端口,即可進(jìn)入 wordpress 的配置 頁面, wordpress 的配置,主要是數(shù)據(jù)庫的地址以及數(shù)據(jù)庫前綴的配置,輸入正確的數(shù)據(jù)庫的 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ù)庫查看創(chuàng)建的表,后續(xù) MySQL 高可用演示時(shí),也可以登錄到數(shù)據(jù)庫做些常規(guī) 操作,不受高可用切換影響。
到此,基本的應(yīng)用就安裝完成了。
配置 redis 動(dòng)態(tài)緩存加速:
redis 的角色,在這個(gè)案例里邊,在 wordpress 里 redis 作為一個(gè)動(dòng)態(tài)加速緩存使用,對(duì)加速網(wǎng)站訪問, 減輕數(shù)據(jù)庫壓力起到一定作用。
下載 wordpress 的 redis 插件,redis-cache。
下載后通過 wordpress 的管理頁面 -plugin --addnew 直接上傳,然后依據(jù)插件操作手冊(cè)安裝配置即可。
安裝 redis-cache 以后,會(huì)在 /wp/wp-content/plugins 目錄下生成一個(gè) redis-cache 目錄。需要同時(shí)在 /wp/wp- content 下生成一個(gè) object-cache.php 文件,正常來講,需要調(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 的登錄,沒有安裝 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ù)庫:
- mysql -h mysql-xxxea04fc4c52.jdcloud.com -u wordpress -p
- use wordpressbackup;
- show tables;
- select id from wpbackup_posts;
- -- 中間因?yàn)樽隽硕啻窝菥毢蛿?shù)據(jù)庫切換,中間做了 wordpress 數(shù)據(jù)庫導(dǎo)出和導(dǎo)入操作
- mysql 數(shù)據(jù)庫導(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ù)庫,
- use wordpressbackup;
- source /db/wordpressbackup-0322.sql;
- ----redis 驗(yàn)證
- redis 驗(yàn)證,同樣是沒有安裝 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 并在頁面展示 + 獲取訪客地址,以增強(qiáng)演示效果,明確看到訪問的實(shí)際主 機(jī)位置。
為了讓訪問者看到訪問的 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):
保存后,看到頁面可以顯示相關(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 后端的高可用組通過這個(gè)模板創(chuàng)建主機(jī)。
其余包括數(shù)據(jù)庫配置、網(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)聽器選擇后端服務(wù)為高可用組,并配置健康檢查。
高可用組掛載到 LB 后端以后,應(yīng)用環(huán)境已經(jīng)搭建完成。
可以訪問 LB 入口,訪問到網(wǎng)站,并且會(huì)輪詢到不同服務(wù)器,同時(shí),訪問單臺(tái)服務(wù)器的外網(wǎng) IP 也可以訪問網(wǎng)站業(yè)務(wù):
LB 訪問截圖 (2 張,分別訪問到了兩個(gè)主機(jī))
單臺(tái)主機(jī)訪問截圖(直接訪問單臺(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ī)故障 - 通過底層命令 / 控制臺(tái)關(guān)閉可用區(qū) A 的應(yīng)用云主機(jī) | 站點(diǎn)訪問正常,可以新增、刪除、修改 post | |
高可用組 | 高可用組配置彈性伸縮,設(shè)置最小最 大實(shí)例個(gè)數(shù),并配置伸縮觸發(fā)的閾值 (告警配置內(nèi)配置) | 通過 stress 命令模擬高并發(fā)場景,高可用組通 過彈性伸縮特性創(chuàng)建新主機(jī)并掛載到 LB 后,實(shí)現(xiàn)多主機(jī)接收流量 | |
RDS | 模擬 RDS 實(shí)例故障 - 通過底層命令關(guān)閉 RDS 的主實(shí)例 | - 主從切換,業(yè)務(wù)不受影響 | |
RDS | 主從切換從控制臺(tái)可以看到切換過程 | 切換過程完成后, RDS 狀態(tài)為運(yùn)行中 | |
Redis | 模擬 Redis 實(shí)例故障 - 通過底層命令關(guān) 閉 Redis 的主實(shí)例 | - 主從切換,業(yè)務(wù)不受影響(本文未截圖) | |
Redis | redis 在模擬故障過程中,業(yè)務(wù)持續(xù)訪 問 | 從 redis 返回的數(shù)據(jù)不受切換影響(本文未截圖) |
高可用組信息,目前 LB 后端掛載的為高可用組:
測試頁面信息(所有 IP 均為非真實(shí) IP):
業(yè)務(wù)入口 (LB): http://100.126.35.4/
高可用組單臺(tái)主機(jī)訪問入口目前為:
http://100.126.38.13/
http://100.126.38.16
主機(jī)的高可用及自動(dòng)伸縮:
演示所需的一些腳本:
一個(gè)是模擬生產(chǎn)環(huán)境,對(duì)業(yè)務(wù)主入口的 LB 持續(xù)訪問,這個(gè)在測試過程中,一直可以訪問到,不會(huì)中斷。
一個(gè)是模擬單機(jī)環(huán)境,對(duì)業(yè)主機(jī)入口的持續(xù)訪問,這個(gè)在測試過程中,當(dāng)針對(duì)單機(jī)關(guān)機(jī)時(shí),訪問會(huì)卡住。
演示過程中,高可用組自動(dòng)伸縮功能,能正常擴(kuò)容出新的主機(jī)并提供業(yè)務(wù)訪問。
- 高可用組的自動(dòng)伸縮,通過 stress 模擬壓力
- 安裝 stress 后,直接運(yùn)行(主機(jī)為 2C):
- stress --CPU 2
- 通過 top 命令可以看到 CPU 被打滿。
- 過 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ī),然后可見 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ù)訪問持續(xù)正常。
PAAS 服務(wù)的高可用:
本演示以 MySQL 及 redis 研發(fā)在底層直接殺 docker,然后業(yè)務(wù)訪問不中斷,控制臺(tái)上會(huì)出現(xiàn)主從切換現(xiàn)象在這個(gè)過程中對(duì)業(yè)務(wù)的訪問不會(huì)中斷。
云數(shù)據(jù)庫及緩存的破壞性操作,底層操作由研發(fā)操作。
底層進(jìn)行 RDS 主備切換(kill 掉 RDS 主庫),業(yè)務(wù)訪問同樣不會(huì)中斷,研發(fā)提供截圖可以看到主從切換過程。
本文實(shí)際部署環(huán)境為京東為客戶搭建的私有云環(huán)境(JDSTACK),公有云與私有云為相同技術(shù)棧,搭建及驗(yàn)證過程相似。限于篇幅,redis 驗(yàn)證部分及主機(jī)可訪問性腳本結(jié)果未截圖,感興趣的讀者可自行在云上通過本文指引過程搭建驗(yàn)證。?