本文通過一個Helloworld示例為您介紹如何接入MSHA應用雙活架構并進行功能測試。
背景信息
應用雙活容災架構如下。更多信息,請參見混合云應用雙活容災最佳實踐。
步驟一:前置準備
- Demo準備。這里用電商交易平臺Demo示例介紹。例如,該平臺包含如下應用:
- Frontend:Web應用,負責和用戶交互。
- Cartservice:購物車應用,提供購物車添加、存儲和查詢服務。
- Productservice:商品應用,提供商品、庫存服務。
技術棧:
- SpringBoot。
- 微服務框架:SpringCloud、Dubbo,注冊中心使用Nacos。
- 數據庫:Redis和MySQL。
- 網絡互通。您可以基于阿里云產品云企業網CEN實現網絡互通。
- 混合云網絡打通:您可以通過高速通道物理專線、VPN網關、智能接入網關這3種方式打通網絡。具體操作,請參見多接入方式構建企業級混合云。
- 阿里云多Region網絡互通:您可以通過云企業網實現多Region的網絡互通。具體操作,請參見使用云企業網實現跨地域跨賬號VPC互通(企業版)。
步驟二:開通MSHA并錄入多活資源
- 開通并配置MSHA。具體操作,請參見開通并配置MSHA。
- 配置業務類型、單元和命名空間。
- 登錄AHAS控制臺。
- 在控制臺左側導航欄中單擊多活容災。
- 在左側導航欄選擇基礎配置 > 業務類型和單元,然后單擊新增業務類型。
- 在新增業務類型和單元配置頁面,填寫業務類型名稱和業務類型標識,然后單擊+添加單元,在彈出的添加單元面板,填寫相關參數,完成新建業務類型和單元配置。說明 業務類型通常用于業務隔離。例如,交易業務和導購業務可能使用了不同的容災架構。
- 在左側導航欄選擇基礎配置 > 命名空間,然后單擊新增命名空間,配置架構類型、多活組件、單元下所使用的接入層集群和Nacos命令通道等。配置參數更多信息,請參見新建命名空間。說明
- 命名空間通常用于環境隔離。例如,測試環境、預發環境、生產環境。
- MSHA使用Nacos作為管控命令通道,來實現管控命令的異步并發推送、容災規則的多級緩存以及命令通道自身的高可用分布式部署能力。這里推薦直接購買阿里云MSE產品的Nacos實例,全托管且有穩定性SLA保障。
- 部署MSFE接入層集群。在MSHA控制臺,您可以將MSFE Tengine實例部署到多臺ECS上,組成MSFE接入層集群。接入層集群部署架構圖:
- 配置MSFE,包括錄入域名/IP、URI、后端應用地址。
創建好MSHA命名空間和MSFE接入層集群后,您就可以錄入接入層域名、URI、后端應用回源地址等相關資源。錄入并生效后,MSFE集群就會針對這些來源域名/IP的流量,來進行流量規則的處理和轉發。具體操作,請參見配置MSFE。
重要- 新增域名時:
若使用的是阿里云DNS,則域名解析類型選擇解析,其他情況則選擇不解析。
- 新增域名后,您還需要配置URI:
- 架構類型:默認選擇應用雙活。
- 回源應用IP:Port:需要填寫后端應用負載均衡設備的IP和端口號。例如,上海單元(cn-shanghai)的域名和URI,對應的后端應用的負載均衡設備IP和端口為1.1.xx.xx:80。
- 新增域名時:
- 部署注冊中心同步集群。在MSHA控制臺,您可以將注冊中心同步實例部署到多臺ECS上,組成同步集群。具體操作,請參見步驟二:配置注冊中心同步集群。
- 配置注冊中心同步任務。部署好注冊中心同步集群后,即可配置注冊中心服務同步任務,目前支持Nacos-Nacos、Zk-Zk。具體操作,請參見步驟四:配置注冊中心同步任務。
- 改造應用,即修改Redis/MySQL連接地址信息。
改造前
業務應用僅在杭州單元部署,應用的Redis/MySQL連接地址配置如下。#Redis連接地址 spring.redis.host=r-***.redis.rds.aliyuncs.com #MySQL連接地址 spring.datasource.url=jdbc:mysql://rm-***.mysql.rds.aliyuncs.com:3306/dbname?characterEncoding=utf8&useSSL=false&serverTimezone=GMT
說明- 以上為杭州單元的Redis/MySQL連接地址。
- 若您是SpringBoot應用,則連接地址配置在application.properties文件中。
進行應用雙活改造
您需要在第二個單元(即北京單元)對稱部署業務應用和Redis/MySQL數據庫實例。北京單元部署的Redis/MySQL實例地址如下。#Redis連接地址 r-***.redis.rds.aliyuncs.com #MySQL連接地址 rm-***.mysql.rds.aliyuncs.com
業務應用的Redis/MySQL連接地址配置中,需要添加上備數據庫地址信息(即北京單元的數據庫),以便MSHA SDK/Agent識別并實現主備切換功能。配置如下:#Redis連接地址 spring.redis.host=r-***.redis.rds.aliyuncs.com?mshaStandbyHost=r-uuu.redis.rds.aliyuncs.com #MySQL連接地址 spring.datasource.url=jdbc:mysql://r-***.redis.rds.aliyuncs.com:3306/dbname?characterEncoding=utf8&useSSL=false&serverTimezone=GMT&mshaStandbyHost=rm-***.mysql.rds.aliyuncs.com
說明 以上為北京單元的Redis/MySQL連接地址。改造后
配置改造完成后,應用還需掛載上MSHA Agent,您需要重啟應用后才會生效。具體操作,請參見步驟三:為JAVA應用安裝Agent。
- 配置Redis/MySQL數據同步和數據保護規則。
- 在MSHA控制臺的管理數據源頁面單擊添加數據源,錄入Redis/MySQL相關數據庫連接信息。具體操作,請參見步驟一:創建數據源。
- 在數據層配置頁面選擇目標同步鏈路,然后單擊添加同步任務,錄入Redis/MySQL相關DTS同步任務信息。支持在MSHA控制臺直接創建或錄入已經創建好的DTS任務。說明 建議您在DTS控制臺提前創建好Redis/MySQL(RDS/PolarDB等)同步任務,并確保同步狀態為“同步中”后再錄入到MSHA控制臺。
- 在數據層配置頁面單擊創建數據保護規則,配置數據保護禁寫、讀寫分離規則。然后分別進行灰度推送、全量推送,相應保護規則才會通過管控命令通道,推送到應用節點MSHA SDK/Agent上。
- Redis/MySQL主備切換。
- 在數據層配置頁面,查看當前生效的主數據庫。當類型列的Read和Write均顯示為圖標時則是主數據庫,否則為備數據庫。
- 單擊操作列的主備切換,進入到切換工單頁面,等待預檢查完成并提交工單后則會自動執行主備切換流程。
- 發起切流。具體操作,請參見異地應用雙活切流。
步驟三:為JAVA應用安裝Agent
為JAVA應用安裝Agent的具體操作,請參見為Java應用手動安裝探針和配置Nacos作為規則下發通道。安裝Agent之前您還需要先下載Agent并配置相關參數。具體操作如下。
- 下載Agent。
地域 下載地址 杭州單元 http://msha-agent-hangzhou.oss-cn-hangzhou.aliyuncs.com/msha-java-agent.jar 北京單元 http://msha-agent-beijing.oss-cn-beijing.aliyuncs.com/msha-java-agent.jar - 配置JVM參數。
-javaagent:${探針安裝路徑} -Dmsha.license=${當前license} -Dmsha.namespaces=${命名空間ID} -Dmsha.app.name=${應用名稱} -Dmsha.nacos.namespace=${Nacos命名空間ID} -Dmsha.nacos.server.addr=${Nacos服務器訪問地址}
配置參數說明:- ${當前license}:您可以在MSHA控制臺的探針管理頁面查看License。
- ${命名空間ID}:您可以在MSHA控制臺的命名空間頁面查看。
- ${應用名稱}:為您實際的應用名稱,暫不支持中文。
- ${Nacos命名空間ID}:您可以進入Nacos實例的命名空間頁面查看。如下圖所示:
- ${Nacos服務器訪問地址}:格式為${內網地址:內網端口}。例如,
mse-***-nacos-ans.mse.aliyuncs.com:8848
。
阿里云內應用掛載Agent JVM參數配置示例:
-javaagent:/home/admin/msha-agent/msha-java-agent.jar -Dmsha.license=aaabbbccc-d810-4f9c-b8e2-e2836*****e8 -Dmsha.namespaces=aaabbbccc-8903-4a75-b10c-89ad7*****58 -Dmsha.app.name=rpc-demo -Dmsha.nacos.namespace=aaabbbccc-27a6-4324-9ee7-4d52d*****e0 -Dmsha.nacos.server.addr=mse-aaabbbccc-nacos-ans.mse.aliyuncs.com:8848
IDC或其他云內應用掛載Agent JVM參數配置示例:
-Dregion-id=idc -Dzone-id=idc-zone-a -Dvpc-id=empty -Downer-account-id=12*****89 -javaagent:/home/admin/msha-agent/msha-java-agent.jar -Dmsha.license=aaabbbccc-d810-4f9c-b8e2-e2836*****e8 -Dmsha.namespaces=aaabbbccc-8903-4a75-b10c-89ad7*****58 -Dmsha.app.name=app-demo -Dmsha.nacos.namespace=aaabbbccc-27a6-4324-9ee7-4d52d*****e0 -Dmsha.nacos.server.addr=171.0.xx.xx:8848
配置說明:由于IDC或者其他云內,無法獲取到ECS機器所屬的位置信息,所以相比阿里云內應用掛載Agent的JVM配置,需要增加以下內容:
- -Dregion-id:地域信息。
- -Dzone-id:可用區信息。
- -Dvpc-id:VPC網絡ID。僅用于監控數據上報和MSHA控制臺探針列表頁展示,可配置為empty。
- -Downer-account-id:阿里云賬號(主賬號)ID。用于監控數據上報。IDC或者其他云與阿里云網絡打通后,監控數據會上報至阿里云。
- 重啟應用。安裝了探針的應用在啟動時,會自動上報心跳信息。在MSHA控制臺探針管理頁面,若該應用實例信息顯示在列表中且狀態列為在線,則說明探針安裝成功。
步驟四:驗證雙活能力
- 驗證MSFE路由能力。
- MSFE集群可視化運維。
驗證 說明 測試內容 MSFE集群可視化運維 測試類型 人工UAT測試 前提條件 完成FE接入層集群部署 測試步驟 可視化運維能力包括:擴縮容、Metrics監控、實例健康檢查、回源地址健康檢查、規則一致性巡檢。 測試結果 ?符合預期 - MSFE引流及驗證流量轉發能力。
驗證 說明 測試內容 MSFE引流及驗證流量轉發能力 測試類型 人工UAT測試 前提條件 - 完成FE接入層集群部署完成
- 在MSHA控制臺完成MSFE配置
測試步驟 - 本地修改Hosts文件綁定域名,本地制造測試流量引流進入MSHA FE測試。
Host綁定示例:
10.100.xx.xx ***.demo.com 10.5.xx.xx ***.demo2.com
- 變更DNS將生產環境流量引入MSHA FE。流量路徑:DNS>SLB>MSFE集群。
- 根據流量比例規則,查看FE轉發是否正常。例如,初始化時北京單元、杭州單元流量比例為100:0。
- 登錄FE集群所在的ECS機器,查看Tengine訪問日志是否正常、是否有打印訪問記錄,是否返回200,是否轉發了北京單元的后端應用回源地址。文件地址:
/home/admin/tengine/logs/tengine-access_log
- 登錄到北京單元的業務應用機器,查看應用日志是否正常,并驗證頁面功能是否能夠正常使用。
- 登錄FE集群所在的ECS機器,查看Tengine訪問日志是否正常、是否有打印訪問記錄,是否返回200,是否轉發了北京單元的后端應用回源地址。文件地址:
測試結果 ?符合預期 - MSFE比例分流及切流。
驗證 說明 測試內容 MSFE比例分流及切流 測試類型 人工UAT測試 前提條件 - 完成FE接入層集群部署完成
- 在MSHA控制臺完成MSFE配置
測試步驟 - 切流。調整北京單元、杭州單元的流量比例為0:100,然后刷新電商Demo首頁,查看調用鏈始終訪問到杭州單元的Frontend入口應用。
- 切流。調整北京單元、杭州單元流量比例為100:0,然后刷新電商Demo首頁,查看調用鏈始終訪問到北京單元的Frontend入口應用。
- 切流。調整北京單元、杭州單元流量比例為50:50,然后刷新電商Demo首頁,查看調用鏈,有一半的概率訪問到杭州單元的Frontend入口應用。
測試結果 ?符合預期
- MSFE集群可視化運維。
- 驗證數據庫禁寫、讀寫分離能力。
- 日常態讀寫主數據庫(讀寫不分離)。
驗證 說明 測試內容 日常態讀寫主數據庫(讀寫不分離) 測試類型 人工UAT測試 前提條件 - 應用掛載上MSHA-Agent。
- MSHA控制臺錄入數據層配置,包括數據源、數據同步鏈路和數據保護規則。數據保護規則狀態為生效,不允許讀寫分離,主數據庫在北京單元,且北京單元的數據庫Read及Write均顯示圖標。
北京單元的數據庫顯示如下圖:
數據保護規則如下圖:
測試步驟 - 北京單元的應用執行數據庫讀操作(即查詢商品詳情)、寫操作(即下單),應該訪問到北京數據庫。
- 杭州單元的應用執行數據庫讀操作(即查詢商品詳情)、寫操作(即下單),應該訪問到杭州數據庫。
測試結果 ?符合預期 - 日常態寫主讀本地(讀寫分離)。
驗證 說明 測試內容 日常態讀寫主數據庫(讀寫分離) 測試類型 人工UAT測試 前提條件 - 應用掛載上MSHA-Agent。
- MSHA控制臺錄入數據層配置,包括數據源、數據同步鏈路和數據保護規則。數據保護規則狀態為生效,允許讀寫分離,主數據庫在杭州單元,且杭州單元的數據庫Read及Write均顯示圖標。
測試步驟 - 兩個單元內的應用執行數據庫讀操作(即查詢商品詳情),均訪問到本單元數據庫。
- 北京單元的應用執行數據庫讀操作,應該訪問到北京數據庫。
- 杭州單元的應用執行數據庫讀操作,應該訪問到杭州數據庫。
- 兩個單元內的應用執行數據庫寫操作(即下單),均訪問到主數據庫(即杭州單元)。
- 北京單元的應用執行數據庫寫操作,應該訪問到杭州數據庫。
- 杭州單元的應用執行數據庫寫操作,應該訪問到杭州數據庫。
測試結果 ?符合預期 - 主備切換(讀寫不分離)。
驗證 說明 測試內容 讀寫不分離下的主備切換 測試類型 人工UAT測試 前提條件 - 應用掛載上MSHA-Agent。
- MSHA控制臺錄入數據層配置,包括數據源、數據同步鏈路和數據保護規則。數據保護規則狀態為生效,不允許讀寫分離,主數據庫在杭州單元,且杭州單元的數據庫Read及Write均顯示圖標。
測試步驟 - 主備切換前,2個單元內的應用執行讀操作(即查詢商品詳情)、寫操作(即下單),應該訪問到杭州數據庫。
- 主備切換后(即將主數據庫從杭州單元切換至北京單元),2個單元內的應用執行讀操作(即查詢商品詳情)、寫操作(即下單),應該訪問到北京數據庫。
測試結果 ?符合預期 - 主備切換(讀寫分離)。
驗證 說明 測試內容 讀寫分離下的主備切換 測試類型 人工UAT測試 前提條件 - 應用掛載上MSHA-Agent。
- MSHA控制臺錄入數據層配置,包括數據源、數據同步鏈路和數據保護規則。數據保護規則狀態為生效,允許讀寫分離,主數據庫在杭州單元,且杭州單元的數據庫Read及Write均顯示圖標。
測試步驟 - 主備切換前,杭州單元內的應用:
- 執行數據庫讀操作(即查詢商品詳情),應該訪問到杭州單元數據庫。
- 執行數據庫寫操作(即下單),應該訪問到杭州單元數據庫。
- 主備切換前,北京單元內的應用:
- 執行數據庫讀操作(即查詢商品詳情),應該訪問到北京單元數據庫。
- 執行數據庫寫操作(即下單),應該訪問到杭州單元數據庫。
- 主備切換后(即將主數據庫從杭州單元切換至北京單元),北京單元內的應用:
- 執行數據庫讀操作(即查詢商品詳情),應該訪問到北京單元數據庫。
- 執行數據庫寫操作(即下單),應該訪問到北京單元數據庫。
測試結果 ?符合預期 - 主備切換數據同步延遲期間禁寫。
驗證 說明 測試內容 主備切換數據同步延遲期間禁寫 測試類型 人工UAT測試 前提條件 - 應用掛載上MSHA-Agent。
- MSHA控制臺錄入數據層配置,包括數據源、數據同步鏈路和數據保護規則。數據保護規則狀態為生效,不允許讀寫分離,主數據庫在北京單元,且北京單元數據庫Write顯示,杭州單元數據庫Write顯示圖標。
測試步驟 - 主備切換前,北京單元內的應用執行寫操作(即下單),應該訪問到北京數據庫且SQL執行成功無報錯。
- 制造同步存在延遲的場景(例如,暫停DTS同步任務),然后執行主備切換。那么主備切換流程中,執行到等待同步位點追平階段后,就會長時間輪訓DTS接口判斷同步是否追平。
- 主備切換等待數據同步追平過程中:
- 杭州單元應用執行寫操作(即下單),應該會被禁寫(拋出異常)。
- 北京單元應用執行寫操作(即下單),應該會被禁寫(拋出異常)。
- 主備切換結束后(即等待同步位點追平或跳過同步位點追平)
- 杭州單元應用執行寫操作(即下單),應該訪問到杭州數據庫且SQL執行成功無報錯。
- 北京單元應用執行寫操作(即下單),應該訪問到杭州數據庫且SQL執行成功無報錯。
測試結果 ?符合預期
- 日常態讀寫主數據庫(讀寫不分離)。