1. 程式人生 > >資料庫分表、分庫及讀寫分離的基本概念

資料庫分表、分庫及讀寫分離的基本概念

最近因為專案原因一直在研究分表、分庫和讀寫分離。本來打算直接使用一款開源產品,但只開源了一部分,無奈只好自己動手豐衣足食了。



為什麼要分表、分庫和讀寫分離?
隨著網際網路應用的廣泛普及,海量資料的儲存和訪問成為了系統設計的瓶頸問題。對於一個大型的網際網路應用或者金融領域專案,日益增長的業務資料,無疑對資料庫造成了相當大的負載,同時對於系統的穩定性和擴充套件性提出很高的要求。隨著時間和業務的發展,庫中的表會越來越多,表中的資料量也會越來越大,相應地,資料操作的開銷也會越來越大;另外,無論怎樣升級硬體資源,單臺伺服器的資源(CPU、磁碟、記憶體、網路IO、事務數、連線數)總是有限的,最終資料庫所能承載的資料量、資料處理能力都將遭遇瓶頸。分表、分庫和讀寫分離可以有效地減小單臺數據庫的壓力。


分表、分庫常用策略:
1.平均進行分配
hash(object)%N(適用於簡單架構)
2.按照權重進行分配且均勻輪詢。
3.按照業務進行分配。
4.按照一致性hash演算法進行分配(適用於叢集架構,在叢集中節點的新增和刪除不會造成資料丟失,方便資料遷移)。
分表又分為單庫分表(表名不同)和多庫分表(表名相同),不管使用哪種策略都還需要自己去實現路由。


讀寫分離的基本原理:
讓主資料庫處理事務性增、刪、改操作(INSERT、DELETE、UPDATE),而從資料庫處理SELECT查詢操作。資料庫複製被用來把事務性操作導致的變更同步到叢集中的從資料庫。
讀寫分離的基本結構:
一臺主、多臺從。主提供寫操作,從提供讀操作。
讀寫分離的實現:
我們只需要實現讀寫分離,主從複製資料一般由資料庫級來實現同步,當然也可以自己去實現同步,只是需要考慮的點比較多。



什麼時候用分庫、分表?什麼時候用讀寫分離?
在實際專案中可以從以下幾個維度來考慮:
1.資料實時性是否比較高?
2.查詢複雜度是否比較高?
3.讀和寫的比例即側重點是哪一個?


作者給出的幾點建議:
1.當主鍵和分表字段為同一個欄位時適合選用分庫、分表,因為通過主鍵進行雜湊分庫、分表時,主鍵就是唯一的獲取該條資訊的主要途徑。
2.當讀大於寫且資料量增加不明顯時適合選用讀寫分離(讀寫分離+快取)