天天看點

資料庫拆分的幾種方式

資料庫做拆分的幾種方式:

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算法可以随意更改

缺點:可能引入額外的單點