【數據庫】分區分表分庫、讀寫分離(二)


五、分庫

什么時候考慮使用分庫?

  • 單台DB的存儲空間不夠
  • 隨着查詢量的增加單台數據庫服務器已經沒辦法支撐

分庫解決的問題

其主要目的是為突破單節點數據庫服務器的 I/O 能力限制,解決數據庫擴展性問題。

垂直拆分

將系統中不存在關聯關系或者需要join的表可以放在不同的數據庫不同的服務器中。

按照業務垂直划分。比如:可以按照業務分為資金、會員、訂單三個數據庫。

需要解決的問題:跨數據庫的事務、jion查詢等問題。

水平拆分

例如,大部分的站點。數據都是和用戶有關,那么可以根據用戶,將數據按照用戶水平拆分。

按照規則划分,一般水平分庫是在垂直分庫之后的。比如每天處理的訂單數量是海量的,可以按照一定的規則水平划分。需要解決的問題:數據路由、組裝。

讀寫分離

對於時效性不高的數據,可以通過讀寫分離緩解數據庫壓力。需要解決的問題:在業務上區分哪些業務上是允許一定時間延遲的,以及數據同步問題。

思路

垂直分庫-->水平分庫-->讀寫分離

六、拆分之后面臨新的問題

問題

  • 事務的支持,分庫分表,就變成了分布式事務
  • join時跨庫,跨表的問題
  • 分庫分表,讀寫分離使用了分布式,分布式為了保證強一致性,必然帶來延遲,導致性能降低,系統的復雜度變高。

常用的解決方案:

對於不同的方式之間沒有嚴格的界限,特點不同,側重點不同。需要根據實際情況,結合每種方式的特點來進行處理。

選用第三方的數據庫中間件(Atlas,Mycat,TDDL,DRDS),同時業務系統需要配合數據存儲的升級。

七、數據存儲的演進

單庫單表

單庫單表是最常見的數據庫設計,例如,有一張用戶(user)表放在數據庫db中,所有的用戶都可以在db庫中的user表中查到。

單庫多表

隨着用戶數量的增加,user表的數據量會越來越大,當數據量達到一定程度的時候對user表的查詢會漸漸的變慢,從而影響整個DB的性能。如果使用mysql, 還有一個更嚴重的問題是,當需要添加一列的時候,mysql會鎖表,期間所有的讀寫操作只能等待。

可以通過某種方式將user進行水平的切分,產生兩個表結構完全一樣的user_0000,user_0001等表,user_0000 + user_0001 + …的數據剛好是一份完整的數據。

多庫多表

隨着數據量增加也許單台DB的存儲空間不夠,隨着查詢量的增加單台數據庫服務器已經沒辦法支撐。這個時候可以再對數據庫進行水平拆分。

八、總結

總的來說,優先考慮分區。當分區不能滿足需求時,開始考慮分表,合理的分表對效率的提升會優於分區。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM