一致性 hash 算法
概述:
Java实现一致性hash算法,比较 取模hash、没有虚拟节点一致性hash、有虚拟节点一致性hash的优缺点。
作业一:
用你熟悉的编程语言实现一致性 hash 算法。
项目结构:
类图:
hash算法相关:
存储相关:
Cache相关:
测试用例相关:
git 地址:
https://github.com/changtaizhao/consistent-hash
编写测试用例测试这个算法,测试 100 万 KV 数据,10 个服务器节点的情况下,计算这些 KV 数据在服务器上分布数量的标准差,以评估算法的存储负载不均衡性。
一致性hash测试结果:
每服务器虚拟节点数:1
服务器1 有 43227 个元素
服务器2 有 162560 个元素
服务器3 有 173999 个元素
服务器4 有 241283 个元素
服务器5 有 84944 个元素
服务器6 有 29856 个元素
服务器7 有 140652 个元素
服务器8 有 21711 个元素
服务器9 有 13409 个元素
服务器10 有 88359 个元素
平均值是 100000
标准差是 72894.30422056308
每服务器虚拟节点数:10
服务器1 有 77811 个元素
服务器2 有 78215 个元素
服务器3 有 89686 个元素
服务器4 有 122221 个元素
服务器5 有 119967 个元素
服务器6 有 75684 个元素
服务器7 有 97824 个元素
服务器8 有 84698 个元素
服务器9 有 181443 个元素
服务器10 有 72451 个元素
平均值是 100000
标准差是 31918.386798207706
每服务器虚拟节点数:100
服务器1 有 93366 个元素
服务器2 有 98423 个元素
服务器3 有 111819 个元素
服务器4 有 104389 个元素
服务器5 有 97374 个元素
服务器6 有 89372 个元素
服务器7 有 115807 个元素
服务器8 有 97820 个元素
服务器9 有 89860 个元素
服务器10 有 101770 个元素
平均值是 100000
标准差是 8281.69895613213
每服务器虚拟节点数:150
服务器1 有 101328 个元素
服务器2 有 99261 个元素
服务器3 有 107727 个元素
服务器4 有 99915 个元素
服务器5 有 83171 个元素
服务器6 有 89148 个元素
服务器7 有 111212 个元素
服务器8 有 103692 个元素
服务器9 有 107004 个元素
服务器10 有 97542 个元素
平均值是 100000
标准差是 8108.280902879475
每服务器虚拟节点数:200
服务器1 有 100015 个元素
服务器2 有 95075 个元素
服务器3 有 105460 个元素
服务器4 有 98936 个元素
服务器5 有 87417 个元素
服务器6 有 88452 个元素
服务器7 有 101578 个元素
服务器8 有 102327 个元素
服务器9 有 114410 个元素
服务器10 有 106330 个元素
平均值是 100000
标准差是 7762.150166030029
每服务器虚拟节点数:300
服务器1 有 98960 个元素
服务器2 有 98255 个元素
服务器3 有 110390 个元素
服务器4 有 91912 个元素
服务器5 有 99064 个元素
服务器6 有 96504 个元素
服务器7 有 106162 个元素
服务器8 有 95821 个元素
服务器9 有 100982 个元素
服务器10 有 101950 个元素
平均值是 100000
标准差是 5007.930610541644
每服务器虚拟节点数:500
服务器1 有 102749 个元素
服务器2 有 102107 个元素
服务器3 有 101832 个元素
服务器4 有 97176 个元素
服务器5 有 93783 个元素
服务器6 有 98392 个元素
服务器7 有 98563 个元素
服务器8 有 101065 个元素
服务器9 有 99840 个元素
服务器10 有 104493 个元素
平均值是 100000
标准差是 2966.0789942279016
每服务器虚拟节点数:1000
服务器1 有 96968 个元素
服务器2 有 106384 个元素
服务器3 有 99051 个元素
服务器4 有 98573 个元素
服务器5 有 92606 个元素
服务器6 有 100638 个元素
服务器7 有 103492 个元素
服务器8 有 101825 个元素
服务器9 有 101592 个元素
服务器10 有 98871 个元素
平均值是 100000
标准差是 3567.877296096378
每服务器虚拟节点数:2000
服务器1 有 98349 个元素
服务器2 有 97230 个元素
服务器3 有 99094 个元素
服务器4 有 101444 个元素
服务器5 有 96241 个元素
服务器6 有 102745 个元素
服务器7 有 102966 个元素
服务器8 有 100363 个元素
服务器9 有 101939 个元素
服务器10 有 99629 个元素
平均值是 100000
标准差是 2186.231140570457
每服务器虚拟节点数:5000
服务器1 有 99988 个元素
服务器2 有 98921 个元素
服务器3 有 97474 个元素
服务器4 有 101020 个元素
服务器5 有 99390 个元素
服务器6 有 100698 个元素
服务器7 有 100509 个元素
服务器8 有 100879 个元素
服务器9 有 101088 个元素
服务器10 有 100033 个元素
平均值是 100000
标准差是 1079.875918798081
每服务器虚拟节点数:10000
服务器1 有 100408 个元素
服务器2 有 99115 个元素
服务器3 有 100106 个元素
服务器4 有 100213 个元素
服务器5 有 98736 个元素
服务器6 有 100813 个元素
服务器7 有 100622 个元素
服务器8 有 100443 个元素
服务器9 有 100155 个元素
服务器10 有 99389 个元素
平均值是 100000
标准差是 651.5702571480684
每服务器虚拟节点数:15000
服务器1 有 100584 个元素
服务器2 有 99859 个元素
服务器3 有 98939 个元素
服务器4 有 100352 个元素
服务器5 有 100004 个元素
服务器6 有 99062 个元素
服务器7 有 100450 个元素
服务器8 有 100774 个元素
服务器9 有 99721 个元素
服务器10 有 100255 个元素
平均值是 100000
标准差是 586.0771280300913
每服务器虚拟节点数:20000
服务器1 有 100443 个元素
服务器2 有 100321 个元素
服务器3 有 99072 个元素
服务器4 有 100238 个元素
服务器5 有 99271 个元素
服务器6 有 100205 个元素
服务器7 有 100888 个元素
服务器8 有 99559 个元素
服务器9 有 99980 个元素
服务器10 有 100023 个元素
平均值是 100000
标准差是 526.7388347179274
每服务器虚拟节点数:100000
服务器1 有 99673 个元素
服务器2 有 99481 个元素
服务器3 有 100264 个元素
服务器4 有 100186 个元素
服务器5 有 100357 个元素
服务器6 有 99947 个元素
服务器7 有 99119 个元素
服务器8 有 100578 个元素
服务器9 有 100079 个元素
服务器10 有 100316 个元素
平均值是 100000
标准差是 427.455494759396
趋势图如下:
总结:
理论来说,虚拟节点越多,标准差越小,数据分布也是越均衡
实际上虚拟节点越多,系统的复杂性也越高,虚拟节点100-500是比较合理的范围
取模hash测试结果:
服务器1 有 99991 个元素
服务器2 有 99545 个元素
服务器3 有 99921 个元素
服务器4 有 99952 个元素
服务器5 有 100339 个元素
服务器6 有 99995 个元素
服务器7 有 100235 个元素
服务器8 有 100052 个元素
服务器9 有 99976 个元素
服务器10 有 99994 个元素
平均值是 100000
标准差是 197.26581051971476
添加一个节点缓存命中率:9%
没有虚拟节点一致性hash测试结果:
服务器1 有 110589 个元素
服务器2 有 24875 个元素
服务器3 有 149689 个元素
服务器4 有 78130 个元素
服务器5 有 30297 个元素
服务器6 有 139371 个元素
服务器7 有 71770 个元素
服务器8 有 265079 个元素
服务器9 有 56154 个元素
服务器10 有 74046 个元素
平均值是 100000
标准差是 67643.07872206882
添加一个节点缓存命中率:98%
有虚拟节点一致性hash测试结果(200个虚拟节点):
服务器1 有 100285 个元素
服务器2 有 94565 个元素
服务器3 有 105066 个元素
服务器4 有 99358 个元素
服务器5 有 86738 个元素
服务器6 有 88554 个元素
服务器7 有 101951 个元素
服务器8 有 102614 个元素
服务器9 有 114636 个元素
服务器10 有 106233 个元素
平均值是 100000
标准差是 7913.853119688285
添加一个节点缓存命中率:91%
总结:
取模hash是数据分布最均衡的,但是一旦有数据节点的变化,缓存命中率会急速下降
没有虚拟节点一致性hash数据分布非常不均衡
有虚拟节点一致性hash是比较折中的方案,数据分布相对平衡,添加、删除节点,命中率也不会有太大影响
评论