背景信息
數據雙活架構
數據雙活架構采用基于業務數據分片的單元化模式,不受數據中心距離限制,流量在單元內閉環,單元故障影響不外溢。
相比基于數據主備模式的應用雙活架構業務體驗更好、故障爆炸半徑更小、容災切換更平滑,但應用改造成本更高,要求業務數據拆分、流量帶標和標記傳遞。
架構示意如圖:
推薦業務場景:
- 單個中心數據負載過高,需要水平拆分(要求業務數據能夠拆分)。
- 數據中心距離較遠,異地調用成本過高。
- 技術投入和技術棧能夠支撐應用改造。
示例應用架構
示例業務應用由下列微服務共同組成,依賴關系如下圖箭頭所示。
- lilishop-front:MVC服務,負責和用戶交互。
- lilishop-goods:商品應用,提供商品、庫存服務。
- lilishop-cart:購物車應用,提供購物車添加、存儲和查詢服務。
- lilishop-order:訂單應用,提供下單、物流、訂單查詢服務。
采用SpringBoot技術棧,RPC框架為Dubbo,使用Nacos作為注冊中心,數據庫使用MySQL。
接入步驟
1、準備好資源、環境與應用
1.1、資源開通
應用容災多活是構建在已有應用之上的管控,協同其他云產品,但不負責其他云產品的生命周期,需要您提前規劃與創建。
您可以根據規劃的物理架構,在指定區域或可用區提前開通與創建應用部署所需的資源與服務,例如虛擬私有云VPC、微服務云應用平臺MSAP和彈性云主機ECS等。
1.2、網絡互通
數據雙活架構可能存在跨數據中心調用的場景,需要您提前打通兩個數據中心之間的網絡。
您可以根據選定的物理架構,選擇合適粒度的網絡連通方案,例如連通兩個區域的云間高速產品和連通兩個VPC的對等連接產品等。
1.3、應用準備
在這個示例中,對應用的部署方式沒有強制要求,可以開通彈性云主機ECS實例自行部署應用服務,也可以開通微服務云應用平臺MSAP進行應用部署管理,本示例使用微服務云應用平臺MSAP 。
還需要您開通:
- 關系型數據庫MySQL版實例,并結合數據傳輸服務DTS進行業務數據跨中心同步。
- 微服務引擎注冊配置中心用于注冊中心和管控通道。
- 微服務引擎云原生網關用于前端服務轉發。
本示例將以上應用進行單元化改造,改造后云上部署架構如下。
圖 部署架構
2、開通應用容災多活服務,創建多活應用系統
2.1、創建應用
- 登錄應用高可用控制臺,單擊左側菜單欄應用容災多活,在應用容災多活菜單下單擊數據雙活。
- 進入數據雙活管理頁面,然后單擊創建應用系統,輸入lilishop商城系統,勾選應用系統需要開通的模塊(微服務引擎注冊配置中心、微服務引擎云原生網關、Dubbo、關系數據庫MySQL版)、勾選“我已閱讀,理解并接受《應用容災多活計費規則》”,單擊確定按鈕完成創建。
2.2、架構管理
2.2.1、單元配置
- 在應用容災多活菜單下單擊數據雙活, 在應用系統列表頁面,單擊lilishop商城系統, 進入應用系統概覽頁面。
- 單擊左側菜單欄系統架構配置,單擊站點管理的創建按鈕,依次創建廣州站點和北京站點。
- 單擊左側菜單欄系統架構配置,單擊單元管理的創建按鈕,依次創建廣州單元和北京單元。
2.2.2、路由配置
- 在應用容災多活菜單下單擊數據雙活,在應用系統列表頁面,單擊lilishop商城系統,進入應用系統概覽頁面。
- 單擊左側菜單欄路由規則配置,單擊創建,依次創建四個單元組,前端模塊,商品模塊、購物車模塊和訂單模塊。
- 解析規則支持header和parameter的排列組合方式,本示例先從HTTP#header中查找,如未命中再從DUBBO#parameter第一個參數中提取userId。
2.3、資源管理
2.3.1、接入層配置
- 在應用容災多活菜單下單擊數據雙活,在應用系統列表頁面,單擊lilishop商城系統,進入應用系統概覽頁面。
- 單擊左側導航欄容災配置,在容災配置菜單下單擊接入層配置,進入容災配置-接入層配置頁面。
- 在站點網關列表,單擊所選站點操作列選擇網關按鈕,彈出接入層網關選擇頁面。在接入層網關實例列表,單擊所選網關實例操作列選擇按鈕,選擇已開通的網關實例,完成站點網關實例綁定。
- 單擊URI配置列表上方創建按鈕,彈出新增URI配置頁面,依次填入各個單元組URI、應用入口地址等信息完成配置。
2.3.2、數據層配置
- 在應用容災多活菜單下單擊數據雙活,在應用系統列表頁面,單擊lilishop商城系統, 進入應用系統概覽頁面。
- 單擊左側導航欄容災配置,在容災配置菜單下單擊數據層配置,進入容災配置-數據層配置頁面。
- 單擊數據源配置列表上方創建按鈕,依次創建各個單元組不同站點的數據源。
- 單擊數據同步任務列表上方創建按鈕,以創建數據同步任務。
- 選擇創建的同步任務,點擊配置鏈路,彈出配置數據同步鏈路頁面,在配置數據同步鏈路頁面點擊綁定,彈出綁定同步鏈路信息頁面。
- 在綁定同步鏈路信息頁面依次選擇同步工具實例并根據需求選擇關聯方式,在本示例中選擇創建任務,進一步填寫需要同步的庫表配置和同步配置,完成所有必要信息填寫后,點擊確定保存配置。
- 在數據同步任務列表頁面,找到剛剛創建的任務,選擇創建的任務,點擊批量啟動按鈕,開啟同步。
- 若同步任務的服務狀態為全量同步中或增量同步中,則說明開啟同步成功。
2.3.3、基線推送
- 在應用容災多活菜單下單擊數據雙活,在應用系統列表頁面,單擊lilishop商城系統,進入應用系統概覽頁面。
- 在左側導航欄選擇容災配置,在容災配置菜單下單擊總覽,在總覽頁面單擊基礎配置推送按鈕進入基礎配置推送列表頁面。
- 在基礎配置推送列表頁面,點擊左側推送配置按鈕,查看任務下方各個單元組配置變更內容,確認無誤后,輸入任務名稱。
- 單擊確定按鈕,自動跳轉到基礎配置推送任務列表頁面,選擇剛剛創建的任務名稱,點擊狀態列,可以查看任務的各個步驟詳情以及任務進度。
- 在任務處理結果列,點擊任務結果,可以查看任務詳情信息。
3、改造數據面
3.1 表主鍵改造
需要確保應用數據所有主鍵全局唯一,推薦使用UUID或者雪花ID,以避免數據在跨地域雙向同步中產生寫入沖突。
本示例以雪花ID為例做改造,如下:
@ApiModelProperty(value = "購物車表ID")
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;
...
@Configuration
public class MyBatisPlusConfig {
@Bean
public IdentifierGenerator identifierGenerator() {
return new SnowflakeIdGenerator();
}
}
3.2、服務注入改造
部分RPC框架支持優先本地調用策略,可能與單元化路由糾錯相沖突,需要進行改造。
以Dubbo為例,需要在DubboReference和Reference中將injvm參數設置為false,示例代碼如下:
...
@DubboReference(injvm = false)
private CrmebStoreCartService storeCartService;
...
@Reference(injvm = false)
private CrmebOrderService orderService;
...
3.3、路由標透傳改造
應用在單元組設置DUBBO服務的路由標時,可以設置路由標從方法參數或請求上下文中取值。
本示例以通過參數傳遞方式,配置第一個參數為路由標,代碼如下:
@DubboReference(injvm = false)
private CrmebStoreCartService storeCartService;
...
/**
* 修改商品數量
*
* @param id
* @param number 修改的產品數量
*/
@ApiOperation(value="修改") @RequestMapping(value="/num", method=RequestMethod.POST) public CommonResult<String>update(@RequestParam Long id, @RequestParam Integer number) {
// 傳遞用戶id
if (storeCartService.updateCartNum(UserContext.currentUser().getId(), id, number)) {
return CommonResult.success();
} else {
return CommonResult.failed();
}
}
3.4、定時任務改造
在數據雙活架構下,定時任務本身可能無法根據路由規則進行調度,可以通過數據過濾的方式讓每個單元的任務只處理本單元的數據。
首先引入多活SDK:
...
<dependency>
<groupId>com.ctg.amss</groupId>
<artifactId>amss-agent</artifactId>
<version>${版本號}</version>
</dependency>
...
其次在處理數據前增加數據歸屬判斷:
...
// 獲取需要處理的數據
List<User> businessData = new ArraList<>();
...
for (Object data : businessData) {
// 從數據中提取路由標
String routerId = data.getTenantId();
// 計算路由命中
if (AmssAgentManager.sdk().isInLocalUnit(routerId)) {
// 執行任務
}
}
...
4、應用接入
4.1、 應用安裝探針
- 登錄應用高可用控制臺。
- 單擊左側菜單欄應用容災多活,在應用容災多活菜單下單擊數據雙活,進入數據雙活管理頁面。
- 在應用系統列表中找到需要配置的應用系統,單擊應用系統名稱,進入應用系統概覽頁面。
- 單擊左側導航欄容災配置,在容災配置菜單下單擊服務層配置,進入容災配置-服務層配置頁面。
- 在彈出應用接入頁面,點擊查看密鑰,獲取密鑰。
- 為應用配置JVM參數,根據應用所屬單元組和單元,將參數模板中的各個變量替換為實際的值。
-javaagent:${探針JAR所在路徑}
-Damss.application.group=${單元組編碼}
-Damss.application.name=${應用名稱}
-Damss.service.ip=${應用IP,可選}
-Damss.commander.servers=${管控通道地址}
-Damss.commander.secret=${管控通道密鑰}
配置參數說明:
- ${管控通道地址}:您可以在應用容災多活控制臺的應用接入頁面查看管控通道地址。
- ${管控通道密鑰}:您可以在應用容災多活控制臺的應用接入頁面點擊管控通道密鑰。
您需要根據實際參數為每個應用配置JVM啟動參數,應用通過JavaAgent的方式植入管控邏輯,將應用納入應用容災多活系統。
啟動腳本示例如下:
- 前端模塊廣州站點啟動腳本
-javaagent:/app/mall/agent/amss-agent-${版本號}.jar
-Damss.application.name=lilishop_front
-Damss.application.group=front
-Damss.command.servers=###
-Damss.command.secret=###
- 前端模塊北京站點啟動腳本
-javaagent:/app/mall/agent/amss-agent-${版本號}.jar
-Damss.application.name=lilishop_front
-Damss.application.group=front
-Damss.command.servers=###
-Damss.command.secret=###
4.2、重啟應用
安裝了探針的應用在啟動時,會自動上報心跳信息。在控制臺服務層配置頁面,若該應用實例信息顯示在列表中且狀態列為在線,則說明探針安裝成功。
4.3、開啟注冊配置中心服務同步
- 登錄注冊配置中心控制臺,選擇本應用所使用的注冊中心Nacos實例,點擊實例ID,進入實例詳情頁面。
- 在左側導航欄選擇遷移上云,在遷移上云菜單下點擊概覽查看同步工具狀態。
- 若未安裝,點擊安裝按鈕進行安裝。
- 若已安裝,選擇遷移集群管理,點擊新增集群,填寫跨站點注冊中心所屬集群名稱、命名空間、用戶名、密碼和連接地址信息。
- 選擇同步任務管理,點擊新增任務,填寫任務名稱、源集群、目標命名空間,選擇所有需要同步的服務。
- 在左側導航欄選擇服務管理,點擊服務列表,查看注冊命名空間下的服務數量由1變成2,代表服務同步開啟成功。
5、功能驗證
5.1、驗證流量分發能力
| 驗證 | 說明 |
|---|---|
| 測試內容 | 驗證網關流量分發。 |
| 測試類型 | 人工UAT測試。 |
| 前提條件 | - 完成微服務引擎云原生網關組件的訂購。 - 登錄云原生網關控制臺,選擇該應用的云原生網關實例,點擊功能設置中可觀測性配置,啟用鏈路追蹤功能。 - 在應用控容災多活制臺完成網關配置。 |
| 測試步驟 | 1. 根據流量比例規則,查看網關轉發是否正常。例如,初始化時北京單元、廣州單元的流量比例為0:100。 2. 登錄lilishop商城系統首頁,在云原生網關控制臺查看鏈路追蹤,請求始終訪問到廣州單元入口。 3. 登錄lilishop商城系統進行添加購物車和下訂單操作,在云原生網關控制臺查看鏈路追蹤,請求始終訪問到廣州單元入口。 |
| 測試結果 | 符合預期。 |
5.2、驗證雙向同步能力
| 驗證 | 說明 |
|---|---|
| 測試內容 | 驗證雙向同步能力。 |
| 測試類型 | 人工UAT測試。 |
| 前提條件 | - 應用掛載上應用容災多活探針。 - 完成微服務引擎云原生網關組件的訂購。 - 登錄云原生網關控制臺,選擇該應用的云原生網關實例,點擊功能設置中可觀測性配置,啟用鏈路追蹤功能。 -?在應用控容災多活制臺完成接入層配置。 - 在應用容災多活控制臺完成數據層配置。 |
| 測試步驟 | 1. 準備賬號A和B,配置精確路由規則,通過網關鏈路追蹤功能,確認A和B的請求分別落到北京和廣州單元。 2. 暫停數據同步任務,A和B分別進行添加購物車操作,確認A和B的購物車數據分別存儲到北京和廣州數據源。 3. 啟動數據同步任務,等待數據追平,確認A和B的購物車數據均存儲到兩個數據源。 4. 發起路由切換任務,將A和B的請求分別調整到不同單元。 5. 切換成功后,通過網關鏈路追蹤功能,確認A和B的請求已到不同單元,并能正常查看前述購物車信息。 6. A和B進行購物車修改操作,確認購物車數據正常存儲到兩個數據源。 7. 重復步驟4-6,確認流量多次輪換不影響數據存儲。 |
| 測試結果 | 符合預期。 |
5.3、驗證數據保護能力
| 驗證 | 說明 |
|---|---|
| 測試內容 | 驗證數據保護能力。 |
| 測試類型 | 人工UAT測試。 |
| 前提條件 | - 應用掛載上應用容災多活探針。 |
| 測試步驟 | 1. 初始化配置北京單元、廣州單元的流量比例為0:100。 2. 跳過接入層,直接訪問北京訂單服務進行下單操作,提示操作失敗。 3. 查看探針日志,確認數據層將請求攔截。 4.?發起切流任務,調整北京單元、廣州單元的流量比例為100:0。 5. 跳過接入層,直接訪問北京訂單服務進行下單操作,提示操作成功。 |
| 測試結果 | 符合預期。 |