下面對於環割法(一致性 hash)及跳躍法(jumpstringhash)的原理、特性及優缺點進行簡單的介紹。git
環割法的原理以下:github
特色 | 缺點 |
---|---|
隨機性強 | 初始化耗時長,內存消耗較高,須要進行大量數據排序,分片消耗高 |
跳躍法的原理以下:算法
根據公式:性能
將數據落在每個節點的機率進行平均分配。測試
對於輸入的字符串進行計算 hash 值,經過判斷每次產生的僞隨機值是否小於當前斷定的節點 1/x,最終取捕獲節點編號最大的做爲數據的落點。spa
在實際使用中使用倒數的方法從最大節點值進行反向判斷,一旦當產生的僞隨機值大於 x 則斷定此節點 x 做爲數據的落點。3d
特色 |
---|
內存消耗小,均衡性高,計算量相對較小 |
下面將經過測試對環割法和跳躍法的性能及均衡性進行對比,說明 DBLE 爲什麼使用跳躍法代替了環割法。blog
數據源:現場數據 350595 條排序
測試通過:繼承
測試結果:
分片數量\方差 | 環割法1000片 | 環割法10000片 | 跳躍法 |
---|---|---|---|
4 | 4484780 | 812418 | 315703 |
8 | 601593 | 545599 | 315587 |
16 | 453694 | 131816 | 67018 |
32 | 213856 | 74360 | 86125 |
64 | 69313 | 46618 | 37939 |
128 | 24329 | 26415 | 25429 |
summary
- 在一樣分片數據量的狀況下,兩種方法的方差都會隨着分片數量的增長而減小。
- 在分片數量足夠多的狀況下,兩種方法並無太大的區別。
- 在節點數量相對較少的狀況下,跳躍法的均衡性最好。
- 使用環割法時,增長環切的數量可以提升分片的均衡性,可是均衡性提升的幅度會隨着分片數量的增長而減小。
分片數量\耗時 | 環割法1000片 | 環割法10000片 | 跳躍法 |
---|---|---|---|
4 | 0.419 | 0.532 | 0.069 |
8 | 0.41 | 0.425 | 0.067 |
16 | 0.512 | 0.545 | 0.06 |
32 | 0.55 | 0.525 | 0.07 |
64 | 0.683 | 0.59 | 0.087 |
128 | 0.559 | 0.659 | 0.094 |
summary
- 環割法相比於跳躍法有較大的性能差距,大約相差一個數量級。
- 跳躍法的時間消耗會隨着分片數量的增長而小幅度的上升。
- 環割法的時間消耗隨着環割數量的增長而小幅度的增長。
分片數量\最大平均數偏離 | 環割法1000片 | 環割法10000片 | 跳躍法 |
---|---|---|---|
4 | 3027 | 1513 | 802 |
8 | 1530 | 1488 | 822 |
16 | 1121 | 622 | 556 |
32 | 1044 | 358 | 672 |
64 | 673 | 560 | 424 |
128 | 503 | 348 | 682 |
summary
- 兩種方法的最大誤差都會隨着分片數量的上升而降低,最後當分片數量足夠多的時候,兩種方法並無明顯的區別。
- 在分片數量少的時候,跳躍法的均衡性最好,環割法相對最差。
- 使用環割法時,增長環切的數量可以提升分片的均衡性,可是均衡性提升的幅度會隨着分片數量的增長而減小。
綜上測試對比:
從一致性 hash 的多種測試結果來看,都沒有很好的性能表現。所以,DBLE 在 hash 算法選取方面,使用 jumpstringhash 代替了一致性 hash。
若是您是從 Mycat 遷移過來的,使用了一致性 hash,能夠經過自定義拆分算法來實現。
自定義拆分算法相關連接: