場景十:分佈式數據管理問題 分佈式事務和分庫分表方法介紹與實踐經驗分享
目錄
分庫分表
爲什麼分片
分庫分表策略
按照指定字段區間,按照查詢維度來,儘量使得查詢落在單庫單表上,如時間段、ID段、區域等
-
按指定維度取模
-
一致性哈希進行分片
環形Hash 空間
把數據通過一定的Hash算法處理後映射到環上
機器的添加
機器的刪除
平衡性
平衡性- 虛擬節點
映射關係
相對均衡
進一步優化均衡
二次Hash,把負載大的節點再拆分後,對Hash值再進行二次Hash對應到拆分後的表上
分佈式事務五種方法
爲服務中數據存儲層一致性如何做到?
五種分佈式事務解決方案,按出現時間順序進行講解
兩階段提交 2PC
-
例子
-
2PC流程
應用場景相對較少了,主要超時機制影響體驗
TCC操作
-
例子
總結
- 複雜場景下不推薦使用,逆向邏輯很複雜
-
只有非常簡單的場景,非常容易提供回滾時使用
本地消息表
來源於早一代的支付公司,如ebay、支付寶。
設計思想:將遠程分佈式事務拆分成一系列的本地事務
轉賬例子
-
本地插入消息表
-
本地消息表
通過本地事務繞過遠程事務
第二步執行失敗怎麼處理?
再次重試,直到加成功爲止,比如數據庫故障導致的臨時不成功。真實場景下第一步回滾很困難
業務導致的失敗,比如對方賬戶銷戶,這需要通過一定的業務機制結合人工進行處理。
有些情況不一定在系統中實現,比如流單,有時可以從業務上解決比如贈送優惠券進行用戶補償等。
-
總結
比較經典的解決方案,依賴關係型數據庫,存在吞吐量和性能方面的瓶頸
MQ非事務消息
- 示例 僞代碼
public void trans(){
try{
//1.操作數據庫
bool result= dao.update(model);//操作數據庫失敗,會拋出異常
//2.如果第一步成功,則操作消息隊列投遞消息
}catch(Exception ex){
}
}
-
總結
缺點:MQ的可靠性,消息延遲、擠壓、丟失
做到冪等性避免消息重複消費
MQ事務消息
新出現的解決方案
本地成功後修改消息狀態爲可投遞
-
總結
2018年主流開源MQ都沒有實現對事務消息的支持
2019年RocketMQ等開源出來了事務性消息,雖然社區比較活躍,但建議核心流程暫時先不要使用事務型MQ。非核心業務可以嘗試。
分佈式事務的最佳實踐
本章小結
- 分庫分表的常用手段:指定字段區間、按指定維度取模、一致性哈希進行分片
- 介紹分佈式事務的五種方法:兩階段提交、TCC、本地消息表、MQ(非事務)、MQ(事務)
- 分佈式事務的最佳實踐介紹