分庫分表後,數據庫數據一致性問題如何解決?

前言

通過對數據的垂直拆分或水平拆分後,我們解決了數據庫容量、性能等問題,但是將會面臨數據遷移和數據一致性的問題。

在數據遷移方面,需要考慮如何快速遷移、平滑遷移、不停機的遷移等。待數據遷移完畢後,還需要校驗數據的完整性。

數據一致性方面,要根據的業務來判斷是否要必要引入分佈式事務,如果需要引入分佈式事務,需要斟酌是採用 XA,還是基於 BASE 的柔性事務。

數據遷移

數據遷移是很容易出故障的一個環節,需要考慮怎麼更加平滑的遷移舊數據到新的數據庫和系統,以及達到數據準確、快速遷移、減少停機、對業務的影響小等,特別是異構的數據結構情況下,難度更大。

全量

全量遷移的過程如下:

缺點:

全量 + 增量

全量 + 增量遷移的方式,需要依賴數據本身的創建時間,步驟如下:

全量 + 增量的同步相比全量同步的方式,大大的減少了系統停機的時間,對業務影響較小。

binlog + 全量 + 增量

binlog + 全量 + 增量是通過從數據庫的主庫或者從庫解析和重新構造數據,實現複製。

通常情況下都需要中間件等工具的支持,一般需要中間件等工具的支持。可以實現多線程、斷點續傳、全量和增量數據的同步,還可以實現自動擴容和縮容。

常見的工具有:Canal、ShardingSphere-scaling 等

分佈式事務

XA 分佈式事務

XA 分佈式事務,是數據庫本身支持的協議,具備強一致性。

XA 分佈式事務的組件:

XA 接口:

MySQL 從 5.0.3 開始支持 InnoDB 引擎的 XA 分佈式事務。

完整的 XA 事務處理流程如下:

主流的 XA 框架有:Atomikos、Narayana、Seata

XA 分佈式事務存在的問題:

柔性事務

BASE 的核心在於,保證系統基本可用的前提下,通過利用柔性狀態 (支付操作後不是支付成功,而是支付中狀態),實現數據的最終一致性,如下:

柔性事務核心理念是通過業務邏輯將互斥鎖操作從 RM 層上升到業務層,通過放寬對強一致性的要求,來換取系統吞吐量的提升。

BASE 柔性事務常見模式

TCC 介紹

TCC 模式即將每個服務業務操作分成兩個階段,第一個階段檢查並預留相關資源,第二個階段根據所有服務業務的 try 狀態來操作,如果都成功,則進行 Confirm 操作,如果任意一個 Try 發送錯誤,則全部 Cancel。

TCC 模型實際是通過業務分解來實現分佈式事務,對業務有較強的侵入性。

TCC 模型需要注意的地方:

AT

AT 模式就是兩階段提交,自動生成反向 SQL,當發生異常的時候,通過反向 SQL 回滾數據。

Seata 框架對 AT 的支持如下:

柔性事務下的事務特性

總結

分佈式事務主要目的是解決數據一致性問題,XA 強一致,但是吞吐量太低,不利於高併發場景。柔性事務不保證強一致性,但是通過補償實現最終一致性,常見的補償有重試補償、調度補償、人工補償等。

作者:小泥窪

來源:juejin.cn/post/6933003178661462023

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/5zjzO1Uk6-qKiQzol0xxZA