分布式 | 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

相关文章
相关标签/搜索