1.散列算法在分布式中分片计算出现的问题
1.1 所有的散列算法都存在数据倾斜;
假设1000条数据存储
node1:338
node2:321;
node3:341;
少量数据可以接受,上亿条数据的存储需要,这一点点的数据倾斜,或造成其中某台机器承受大于其他服务器上千万的数据
1.2 哈希取余的缺点
会造成服务器节点扩容,减少节点时的数据迁移量过大的问题;
如果使用hash取余算法完成分片计算,集群节点越多的情况下做扩容删除操作,数据未命中概率越大,雪崩越有可能发生
2.jedis实现了hash一致性的散列算法;
介绍:1997出现的算法,由麻省理工学院的大二学生在数据竞赛中发明的;引入了一个43亿的正整数区间;被称之为hash环;利用散列算法,将节点信息,key值同事映射到这个区间之内,判断key与节点的对应关系,一旦对应上,key值将会保存在这个节点;
![hash散列算法](https://img-blog.csdnimg.cn/20190826150400267.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTkwMjk0,size_16,color_FFFFFF,t_70)
记录中间结果后,利用key值做顺时针寻找最近的节点映射,把key对应到该节点:
hash散列算法得出的结论
node1保存key1
node2保存key2
node3保存key 3 4 5
集群在扩容时,数据的迁移情况
![集群扩容时的情况](https://img-blog.csdnimg.cn/20190826150847326.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTkwMjk0,size_16,color_FFFFFF,t_70)
哈希环上绿色弧线对应的所有key需要迁移
当集群的节点越多的时候,扩容的时候迁移数据量越小,未命中概率越小,小到一定程度时,无需关心
解决数据平衡问题
引入虚拟节点;不同实现hash一致性算法的语言,实现的过程不同
jedis中,收集节点信息时,构造方法中有一个叫weight(权重值);权重值越大,节点保存的数据越多
默认情况下,每一个真是节点对应160*weight个虚拟节点,默认weight=1
node1是真实节点
node1:10.9.17.153:6379
node1-1:10.9.17.153:6379#1
node1-2:10.9.17.153:6379#2
node1-3:10.9.17.153:6379#3
虚拟节点的信息字符串也会进行散列计算,投影到hash环上
![虚拟节点投影到hash环上](https://img-blog.csdnimg.cn/20190826152407482.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTkwMjk0,size_16,color_FFFFFF,t_70)
jedis实现的hash一致性,如果想要更好的平衡存储的keyzhi,可以在创建信息对象时,将weight值变大;
企业中将key值平衡性,将key值本身也做散列计算;
hash一致性
最新推荐文章于 2022-11-11 15:38:14 发布