資料庫做拆分的幾種方式:
1.按功能劃分(垂直切分)
将不同功能相關的表放到不同的資料庫中,這樣做的好處是非常直覺。但當某一部分的功能其資料量或性能要求超出了可控的範圍,就需要繼續對其進行深入的再切分。
2.按表中某一字段值的範圍劃分(水準切分)
當伴随着某一個表的資料量越來越大,以至于不能承受的時候,就需要對它進行進一步的切分。一種選擇是根據key 的範圍來做切分,譬如ID 為 1-10000的放到A上,ID 為10000~20000的放到B。這樣的擴充就是可預見的。另一種是根據某一字段值來劃分,譬如根據使用者名的首字母,如果是A-D,就屬于A,E-H就屬于B。這樣做也存在不均衡性,當某個範圍超出了單點所能承受的範圍就需要繼續切分。還有按日期切分等等。
優點:單表大小可控,天然水準擴充
缺點:無法解決集中寫入瓶頸的問題
3.基于hash的切分
一般采用mod來切分,一開始确定切分資料庫的個數,通過hash取模來決定使用哪台。這種方法能夠平均地來配置設定資料,但是伴随着資料量的增大,需要進行擴充的時候,這種方式無法做到線上擴容。每增加節點的時候,就需要對hash 算法重新運算。
是以采用這種方法推薦采用mod 2^n這種一緻性哈希
以點評統一訂單庫為例,分庫分表的方案是32*32的,即通過userId後四位mod 32分到32個庫中,同時再将userId後四位div 32 mod 32将每個庫分為32個表,共計分為1024張表。其線上部署情況為8個叢集(主從),每個叢集4個庫
4.基于路由表的切分
前面的幾種方式都是根據應用的資料來決定操作的,基于路由表的切分是一種更加松散的方法。它單獨維護一張路由表,根據使用者的某一屬性來查找路由表決定使用哪個資料庫,這種方式是一種更加通用的方案
優點:id和庫的mapping算法可以随意更改
缺點:可能引入額外的單點