分佈式 | dble 沿用 jumpstringhash,移除 Mycat 一致性 hash 緣由解析

背景

  • MyCat 對於字符串類型爲分片字段的數據,有三種分片模式,分別是:模值 hash(求模法),jumpstringhash(跳躍法),一致性 hash(環割法)
  • dble 對於 hash 算法選取方面,除了繼承 MyCat 的模值 hash,並無延續使用 MyCat 的一致性 hash,而是推薦使用性能更佳、均衡性更好的「jumpstringhash」算法。

介紹

下面對於環割法(一致性 hash)及跳躍法(jumpstringhash)的原理、特性及優缺點進行簡單的介紹。git

環割法(一致性 hash)

環割法的原理以下:github

  1. 初始化的時候生成分片數量X × 環割數量 N 的固定方式編號的字符串,例如 SHARD-1-NODE-1,並計算全部 X×N 個字符串的全部 hash 值。
  2. 將全部計算出來的 hash 值放到一個排序的 Map 中,並將其中的全部元素進行排序。
  3. 輸入字符串的時候計算輸入字符串的 hash 值,查看 hash 值介於哪兩個元素之間,取小於 hash 值的那個元素對應的分片爲數據的分片。
特色 缺點
隨機性強 初始化耗時長,內存消耗較高,須要進行大量數據排序,分片消耗高

跳躍法(jumpstringhash)

跳躍法的原理以下:算法

  1. 根據公式:性能

    將數據落在每個節點的機率進行平均分配。測試

  2. 對於輸入的字符串進行計算 hash 值,經過判斷每次產生的僞隨機值是否小於當前斷定的節點 1/x,最終取捕獲節點編號最大的做爲數據的落點。spa

  3. 在實際使用中使用倒數的方法從最大節點值進行反向判斷,一旦當產生的僞隨機值大於 x 則斷定此節點 x 做爲數據的落點。3d

特色
內存消耗小,均衡性高,計算量相對較小

數據比較

下面將經過測試對環割法和跳躍法的性能及均衡性進行對比,說明 DBLE 爲什麼使用跳躍法代替了環割法。blog

  • 數據源:現場數據 350595 條排序

  • 測試通過繼承

    1. 經過各自的測試方法執行對於測試數據的分片任務。
    2. 測試方法:記錄分片結果的方差;記錄從開始分片至分片結束的時間;記錄分片結果與平均數的最大差值。
    3. 因爲在求模法 PartitionByString 的方法中要求分片的數量是 1024 的因數,因此測試過程只能使用 2 的指數形式進行測試,並在 PartitionByString 方法進行測試的時候不對於 MAC 地址進行截斷,取全量長度進行測試。
  • 測試結果

  1. 使用不一樣方法時,方差隨分片數量的狀況變化表
分片數量\方差 環割法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

  1. 在一樣分片數據量的狀況下,兩種方法的方差都會隨着分片數量的增長而減小。
  2. 在分片數量足夠多的狀況下,兩種方法並無太大的區別。
  3. 在節點數量相對較少的狀況下,跳躍法的均衡性最好。
  4. 使用環割法時,增長環切的數量可以提升分片的均衡性,可是均衡性提升的幅度會隨着分片數量的增長而減小。
  1. 使用不一樣方法時,消耗的時間隨着分片數量的狀況變化表
分片數量\耗時 環割法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

  1. 環割法相比於跳躍法有較大的性能差距,大約相差一個數量級。
  2. 跳躍法的時間消耗會隨着分片數量的增長而小幅度的上升。
  3. 環割法的時間消耗隨着環割數量的增長而小幅度的增長。
  1. 使用不一樣方法時,節點分配數據量和平均數據量的最大誤差和分片數量的狀況變化表
分片數量\最大平均數偏離 環割法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

  1. 兩種方法的最大誤差都會隨着分片數量的上升而降低,最後當分片數量足夠多的時候,兩種方法並無明顯的區別。
  2. 在分片數量少的時候,跳躍法的均衡性最好,環割法相對最差。
  3. 使用環割法時,增長環切的數量可以提升分片的均衡性,可是均衡性提升的幅度會隨着分片數量的增長而減小。

綜上測試對比:

從一致性 hash 的多種測試結果來看,都沒有很好的性能表現。所以,DBLE 在 hash 算法選取方面,使用 jumpstringhash 代替了一致性 hash。

若是您是從 Mycat 遷移過來的,使用了一致性 hash,能夠經過自定義拆分算法來實現。

自定義拆分算法相關連接:

https://github.com/actiontech/dble-docs-cn/blob/master/1.config_file/1.09_dble_route_function_spec.md

相關文章
相關標籤/搜索