mysql異地多活方案 資料庫異地多活解決方案

2021-10-13 08:39:36 字數 3588 閱讀 1051

異地多活指分布在異地的多個站點同時對外提供服務的業務場景。異地多活是高可用架構設計的一種,與傳統的災備設計的最主要區別在於「多活」,即所有站點都是同時在對外提供服務的。

以乙個簡單的業務單元的it系統為例,整個it系統的異地多活方案如下圖所示。

整個方案將各站點分為:分流量層、應用層和資料層。

單元封閉:

應用要走向異地,首先要面對的便是物理距離帶來的延時。 如果某個應用請求需要在異地多個單元對同一行記錄進行修改,為滿足異地單元間資料庫資料的一致性和完整性,我們需要付出高昂的時間成本。此外,如果某個應用請求需要多次訪問異地單元,且各單元間服務再被服務呼叫,那物理延時將無法預估。

因此,資料庫異地多活的問題轉移到了如何避免跨單元的問題,即要做到單元內資料讀寫封閉,不能出現不同單元對同一行資料進行修改,所以我們需要找到乙個維度去劃分單元,避免資料寫衝突。

資料拆分:

選擇什麼維度來解決單點寫的問題,要從業務本身入手去分析。例如電商的業務,最重要的流程即下單交易流程,從下單業務對資料劃分單元時,改造成本最低、使用者體驗相對好的便是買家維度,即通過買家id進行下單業務拆分,如下圖所示。

買家的下單操作在買家所在的本單元內即可完成讀寫封閉。 按照上述示例劃分業務,就意味著非買家維度的就需要做一定的妥協。對於非買家維度的操作,比如賣家操作(例如商品資料的修改)就可能會跨單元,對於買家與賣家資料讀一致的問題,

可以接受「最終一致」的就通過讀寫分離的方案, 不能接受「最終一致」的則需要跨單元訪問。

資料同步:

將業務劃分多個單元以後,對於資料庫來說,面臨的最大挑戰就是資料同步,因為對於單元封閉的買家維度的資料(unit型別)需要把單元的資料全部同步到中心,對於讀寫分離型別的(copy型別),我們要把中心的資料同步到單元。

原生的資料庫複製無法滿足單元化複雜的同步需求(例如,只同步部分的資料、庫表的過濾、雙向迴圈、api服務化等定製化的需求 ),在普通業務邏輯場景下,dts的同步效能更高效、更穩定,dts也成為多活的基礎設施。具體的資料同步如下圖所示。

快取失效

實現資料層異地多活後,業務希望實時獲取資料庫變更訊息,單元的快取失效實現可通過資料訂閱實現。 通過資料訂閱提供的消費 sdk,業務層可訂閱 rds 增量資料然後觸發更新單元的快取,通過這樣的方式,應用無需實現快取更新邏輯,架構更加簡單。

核心產品

阿里雲資料庫異地多活解決方案使用以下阿里雲核心產品,按照架構設計原則提供資料層多活解決方案。

drds

按照之前說的業務資料拆分的維度,阿里雲drds有兩種集群分別支援買家維度與賣家維度:

unit 模式的drds集群:多地使用者分別在本地域讀寫本地域的資料,且本地域的資料會和中心資料做雙向同步。

copy 模式的drds集群:此集群資料在中心資料庫寫,完成後全量同步到各個單元。 需要注意的是,drds層面需要增加對資料寫入路由的判斷:如果是跨單元的寫,則判斷為非法操作並丟擲異常,確保資料不會跨單元寫。

dts資料複製是資料庫多活設計關鍵的一環,其中資料複製的正確性是第一位,同時效率也很關鍵。阿里雲dts支援多重的check ,避免迴圈複製(用事務表,或者thread_id方案),

採用並行複製(序列的分發,衝突檢測,並行的執行)、大事務切割來保證最終一致性。

資料校驗也是關鍵的一環,阿里雲dts 通過全量校驗工具(tcp)和增量校驗工具(amg)來保證實時/定時檢查中心和單元的資料準確性,確保線上資料的萬無一失。

hdm阿里雲hdm提供了drds集群的搭建、同步鏈路的建立、多活的資料庫監控、資料校驗、集群擴縮容以及自動化的容災等服務,都可通過hdm完成,通過hdm實現了異地多活場景下資料庫的管理。

兩地容災切換方案

容災是異地多活中最核心的一環, 以兩個城市異地多活部署架構圖為例:

在兩個城市(城市1位於華南1地域、城市2位於華東1地域)均部署一套完整的業務系統。

下單業務按照「user_id」% 100 進行分片,在正常情況下:

[00~49]分片所有的讀寫都在城市1的資料庫例項主庫。

[50~99]分片所有的讀寫都在城市2的資料庫例項主庫。

「城市1的資料庫例項主庫」和 「城市2的資料庫例項主庫」建立dts雙向複製。

當出現異常時,需要進行容災切換。可能出現的場景有以下4種:

序號異常情況

操作城市1資料庫主庫故障

資料庫引擎完成主備切換

dts自動切換到城市1新主庫讀取新的增量更新,然後同步到城市2的資料庫例項

有兩種處理方案:

城市1所有資料庫故障

有兩種處理方案:

城市1的全部數庫流量切換到城市2

城市1資料庫到城市2資料庫的dts資料同步鏈路停止

在城市2中,dts啟動,儲存[00-49]分片的變更

城市1故障恢復後,[00-49]的增量資料同步到城市1的資料庫例項

同步結束後,將[00-49]的資料庫流量從城市2切回到城市1啟動[00-49]分片從城市1到城市2的dts同步

server、資料庫切換到到另乙個城市。

多城異地多活

多城市異地多活模式指的是3個或者3個以上城市間部署異地多活。該模式下存在中心節點和單元節點:

中心節點:指單元節點的增量資料都需要實時的同步到中心節點,同時中心節點將所有分片的增量資料同步到其他單元節點。

單元節點:即對應分片讀寫的節點,該節點需要將該分片的增量同步到中心節點,並且接收來自於中心節點的其他分片的增量資料。

下圖是3城市異地多活架構圖,其中華東1就是中心節點,華南1和華北1是單元節點。

單元城市級故障

當單元城市出現故障,業務需要切換時,以華北1城市級故障為例:

容災華北1(單元)的全部數庫流量切換到華東1(中心);

華北1(單元)資料庫到華東1(中心)資料庫的dts資料同步鏈路停止,並記錄同步位點

分片[70-99]的讀寫切換到華東1(中心)

恢復重建華北1(單元);

華北1(單元)資料遷移和同步完成後,停止分片[70-99]在華東1(中心)的讀寫;

停止華東1(中心)到華北1(單元)分片[70-99]的資料同步;

建立華北1(單元)到華東1(中心)的資料同步;

將分片[70-99]的讀寫切換到華北1(單元);

華北1(單元)的資料庫主庫開啟寫入;

檢查;中心城市級故障

當中心城市出現故障,業務需要切換時,以華東1城市級故障為例:

容災華東1(中心)的全部數庫流量切換到華南1(單元);

華東1(中心)資料庫到華南1(單元)資料庫的dts資料同步鏈路停止;

華東1(中心)資料庫到華北1(單元)資料庫的dts資料同步鏈路停止;

華南1(單元)資料庫到華東1(中心)資料庫的dts資料同步鏈路停止;

華北1(單元)資料庫到華東1(中心)資料庫的dts資料同步鏈路停止;

新增華南1(單元)資料庫到華北1(單元)分片[30~99]的dts資料同步鏈路;

恢復重建華東1(中心);

華東1(中心)資料遷移和同步完成後,停止分片[30-69]在華南1(單元)的讀寫;

停止華東1(中心)到華南1(單元)分片[00-29]的資料同步;

建立華東1(中心)到華南1(單元)的資料同步;

建立華東1(中心)到華北1(單元)的資料同步;

將分片[00-29]的讀寫切換到華南1(單元);

華南1(單元)的資料庫主庫開啟寫入;

檢查;

mysql異地多活方案 最易懂的資料庫異地多活方案

前言 今天我們將嘗試 資料庫的異地多活高可用。注意,我們討論的都是超大資料量 50tb 級別 的資料庫。第一種直接上分布式資料庫,目前市面上常見的有 3 種,tidb,阿里雲 polardb,亞馬遜 aurora。雖然 tidb 可以將資料 sharding 到各個城市,但由於各個城市的物理距離導致...

mysql異地多活方案 最易懂的資料庫異地多活方案

今天我們將嘗試 資料庫的異地多活高可用。注意,我們討論的都是超大資料量 50tb 級別 的資料庫。直接上分布式資料庫,目前市面上常見的有 3 種,tidb,阿里雲 polardb,亞馬遜 aurora。雖然 tidb 可以將資料 sharding 到各個城市,但由於各個城市的物理距離導致的網路消耗,...

mysql異地多活方案 最易懂的資料庫異地多活方案

今天我們將嘗試 資料庫的異地多活高可用。注意,我們討論的都是超大資料量 50tb 級別 的資料庫。直接上分布式資料庫,目前市面上常見的有 3 種,tidb,阿里雲 polardb,亞馬遜 aurora。雖然 tidb 可以將資料 sharding 到各個城市,但由於各個城市的物理距離導致的網路消耗,...