极客大学架构师训练营第五周作业
一、用你熟悉的编程语言实现一致性 hash 算法。
大致思路:
定义节点抽象接口,将实际物理节点和会用到的虚拟节点抽象为节点
定义hash函数接口,便于自定义扩展更好的hash计算
虚拟节点是为优化一致性hash可能的不均衡引入,实际上第一个虚拟节点即为物理节点
利用Java集合中的TreeMap特性实现一致性hash算法
二、编写测试用例测试这个算法,测试 100 万 KV 数据,10 个服务器节点的情况下,计算这些 KV 数据在服务器上分布数量的标准差,以评估算法的存储负载不均衡性
测试代码:
1000000 个请求,10个服务器节点,每个节点平均值为:100000
方差公式:
标准差公式:
测试一:虚拟节点数 10
输出结果:
{Node-7:3306=57270, Node-4:3306=66478, Node-2:3306=110523, Node-3:3306=157893, Node-0:3306=113326, Node-8:3306=69517, Node-6:3306=113266, Node-9:3306=90051, Node-1:3306=107692, Node-5:3306=113984}
标准差= 34792.95
测试二:虚拟节点数 50
输出结果:
{Node-7:3306=124956, Node-4:3306=124726, Node-2:3306=128851, Node-3:3306=79794, Node-0:3306=95666, Node-8:3306=103824, Node-6:3306=96568, Node-9:3306=89442, Node-1:3306=90353, Node-5:3306=65820}
标准差σ= 19730.26
测试三:虚拟节点数 100
输出结果:
{Node-7:3306=104010, Node-4:3306=105443, Node-2:3306=113656, Node-3:3306=81710, Node-0:3306=108849, Node-6:3306=90082, Node-8:3306=99095, Node-9:3306=107060, Node-1:3306=101356, Node-5:3306=88739}
标准差σ= 9,605.72
测试四:虚拟节点数 200
输出结果:
{Node-7:3306=104737, Node-4:3306=105494, Node-2:3306=112146, Node-3:3306=92164, Node-0:3306=111415, Node-6:3306=94360, Node-8:3306=99012, Node-9:3306=89089, Node-1:3306=93241, Node-5:3306=98342}
标准差σ= 7,694.94
测试五:虚拟节点数 300
输出结果:
{Node-7:3306=106858, Node-4:3306=102767, Node-2:3306=112641, Node-3:3306=103470, Node-0:3306=107338, Node-8:3306=98993, Node-6:3306=83964, Node-9:3306=97082, Node-1:3306=90039, Node-5:3306=96848}
标准差σ= 8,100.67
从测试的情况来看,虚拟节点数在200-300之间负载会比较均衡
版权声明: 本文为 InfoQ 作者【井中人】的原创文章。
原文链接:【http://xie.infoq.cn/article/d470e17b61510b5da61236c9f】。未经作者许可,禁止转载。
评论