分庫分表架構方案設計
本文就分庫分表的產生背景、一些通用的分庫分表的涉及記錄做一下簡要的理解和闡述。
為什麼的需要分庫分表
在分散式架構中,隨著資料量的不斷上升和使用者量的不斷累加,原先資料庫的單點(很多為了資料庫的高可用只是做了簡單的讀寫分離)設計早就已經不夠用使用資料庫的三個階段
第一階段:單庫單表
第二階段:單庫多表
比如一個User 表,當資料量增加的時候,查詢出現很慢的情況,增加和刪除索引的代價太大,就可以考慮把User表分為 User_1 ,User_2 ....這時候可以放在不同的例項裡面,也可以放在同一個例項裡面。第三階段:多庫多表
微服務的設計思路里面就是每個服務有自己的資料庫。
分而治之
資料庫拆分的兩個方式就是
垂直拆分:一個資料庫例項多個表組成,需要按照業務的使用不同把表拆分成多個分類,分佈到多個資料庫例項,達到負載均衡的效果。專人幹專事。
水平拆分 :同一個表中的資料分散到多個資料庫例項裡面。簡單來說就是拆分成User_1 ,User_2 .... 與原有結構相同。多個人幹一件事。
冷熱分離的角度去拆分
冷資料:查詢多,變更少,推薦使用引擎MyISAM,可配置多個從庫緩解讀取的壓力
熱資料:查詢和變更都多 推薦使用引擎InnoDB,對於活躍資料,在某些場景下適合使用redis等快取,比如點贊系統,等到累積一定的量再去跟新資料庫。。
讀寫分離的也是一個拆分角度
分庫分表存在的問題
- 存在分散式事務的問題
- 跨界點Join問題
- 跨界點合併資料和分頁的問題
- 多個資料來源的管理的問題
水平切分的維度選擇
- 一致性Hash
為什麼使用一致性Hash而不是簡單的Hash,為了解決縮容和擴容的問題,
缺點很明顯,很難做資料聚合的處理。 - 按照時間切邊
在一些場景下面存在資料傾斜的問題,資料的二次查詢也存在問題。
垂直切分更加偏向於業務拆分的過程,水平拆分的技術難度相對於比較高。
分片後的查詢問題
例如: 使用者購買了商品,需要將交易記錄儲存下來,那麼如果按照買家的緯度分表,則每個買家的交易記錄都被儲存在同一表中,我們可以很快、很方便地查到某個買家的購買情況,
但是某個商品被購買的交易資料很有可能分佈在多張表中,查詢起來比較麻煩。反之,按照商品維度分表,則可以很方便地查詢到該商品的購買情況,但若要查詢到買家的交易記錄,則會比較麻煩。
- 分片資料聚合,但是這樣的效率很低 。
2.記錄兩份資料,比如在商品服務中,一份買家的維度拆分,一份商品維度拆分。
3.在搜尋實時性比較高的情況下,考慮使用搜尋引擎,例如採用大資料工具Elasticsearch。
當然查詢還有其他變相的方案
電商系統的訂單和商品價格的問題
分片後事務處理機制
柔性事務和剛性事務
柔性事務滿足BASE理論(基本可用,最終一致)
剛性事務滿足ACID理論
二階段提交協議(2PC)
分為準備階段和提交階段
對應技術上的XA、JTA/JTS
缺點比較明顯,在準備的時候需要鎖定資源,參與者較多的情況下,等待的時間差拉長,影響響應時間,出現死鎖的可能性比較大。所以很少使用這個方案
最大努力保證模式
例如商戶交易結果通知重試、補單重試
這種模式適用於一致性要求不高但是對效能要求高的場景
1.開始訊息事物
2.開始資料庫事物
3.接收訊息
4.跟新資料庫
5.提交資料庫事務
6.提交訊息事務
如果5失敗了那麼資料庫和訊息佇列全部回滾,保持一致。
5成功但是6超時失敗,這時候出現不一致的現象。可以配合事務補償模式完成,也就是訊息佇列的重試機制
事物補償模式(TCC)
TCC型事務(Try/Confirm/Cancel)可以歸為補償型。補償型的例子,在一個長事務(long-running)中,一個由兩臺伺服器一起參與的事務,伺服器A發起事務,伺服器B參與事務,B的事務需要人工參與,所以處理時間可能很長。如果按照ACID的原則,要保持事務的隔離性、一致性,伺服器A中發起的事務中使用到的事務資源將會被鎖定,不允許其他應用訪問到事務過程中的中間結果,直到整個事務被提交或者回滾。這就造成事務A中的資源被長時間鎖定,系統的可用性將不可接受。WS-BusinessActivity提供了一種基於補償的long-running的事務處理模型。還是上面的例子,伺服器A的事務如果執行順利,那麼事務A就先行提交,如果事務B也執行順利,則事務B也提交,整個事務就算完成。但是如果事務B執行失敗,事務B本身回滾,這時事務A已經被提交,所以需要執行一個補償操作,將已經提交的事務A執行的操作作反操作,恢復到未執行前事務A的狀態。這樣的SAGA事務模型,是犧牲了一定的隔離性和一致性的,但是提高了long-running事務的可用性。
非同步確保型
將一些同步阻塞的事務操作變為非同步的操作,避免對資料庫事務的爭用,典型例子是熱點賬戶非同步記賬、批量記賬的處理。
相關文章
- .NET 5 全自動分表元件,.NET 分表方案 ,分表架構與設計元件架構
- 常用分庫分表方案
- 分庫分表的框架如何設計自動路由框架路由
- Android官方架構元件Paging:分頁庫的設計美學Android架構元件
- MySQL 分庫分表方案,總結太全了。。MySql
- Java後端微服務架構下的資料庫分庫分表:Sharding-SphereJava後端微服務架構資料庫
- 分庫分表系列:分庫分表的前世今生
- 資料倉儲架構分層設計架構
- MySQL 常用分庫分表方案,都在這裡了!MySql
- 分庫分表
- MySQL資料庫之分庫分表方案MySql資料庫
- 10億級別訂單的分庫分表方案
- 一種簡單易懂的 MyBatis 分庫分表方案MyBatis
- 使用TiDB把自己寫分庫分表方案推翻了TiDB
- 分庫分表注意
- [Mysql]分庫分表MySql
- MySQL 資料庫之網際網路常用分庫分表方案MySql資料庫
- 徹底搞清MySQL分庫分表(垂直分庫,垂直分表,水平分庫,水平分表)MySql
- 前後端分離架構中的介面設計後端架構
- 如何設計分層架構和互動介面 API ?架構API
- 嵌入式軟體架構設計-程式分層架構
- 基因法分庫分表
- Mycat分庫分表(一)
- mycat配置分庫分表
- Mycat分庫分表配置
- 分庫分表總結
- [資料庫][分庫分表]分庫分表之後,id主鍵如何處理資料庫
- MySQL:網際網路公司常用分庫分表方案彙總!MySql
- 徹底搞清分庫分表(垂直分庫,垂直分表,水平分庫,水平分表)
- oracle分表效率,資料庫分庫分表是什麼,什麼情況下需要用分庫分表Oracle資料庫
- MyCat分庫分表、讀寫分離
- 資料庫怎麼分庫分表資料庫
- 【架構設計】你的應用該如何分層呢?架構
- 讀寫分離 & 分庫分表 & 深度分頁
- shrding_jdbc分表分庫JDBC
- 輕鬆理解分庫分表
- 分庫分表插入資料
- 分庫分表後的分頁查詢