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