五、分庫
什么時候考慮使用分庫?
- 單台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的存儲空間不夠,隨着查詢量的增加單台數據庫服務器已經沒辦法支撐。這個時候可以再對數據庫進行水平拆分。
八、總結
總的來說,優先考慮分區。當分區不能滿足需求時,開始考慮分表,合理的分表對效率的提升會優於分區。