一致性hash分片计算(一致性hash原理、hash环)
1.概述
hash环是1997年麻省理工创建的一种数学模型,基础是hash散列.可以将任意的内存对象(二进制)转化映射到0-2^32-1整数区间.称这个区间为hash环. 0-1=最大环整数, 最大环整数+1=0(通过加一和减一在可以到最大和最小,理解上感觉是一个环)
映射:利用某种计算关系,将两边的数据对应起来
2. 一致性hash原理
2.1数据映射
读取的节点信息,和数据的key值都会在这个环找到对应的整数映射,而且节点信息不变,key值不变情况下整数映射结果不变
2.2 数据key与节点对应关系
key值要找到对应处理这个key的节点,只需要在hash环上计算:顺时针寻找最近的节点整数
如下图,key1 顺时针寻找最近的节点就是10.9.160.137.6379(因为是顺时针寻找,所以一个key只能找到一个节点,保证了单调性)
上述计算逻辑,确实可以保证key对应节点node后有单调性.他是算法的基础
节点信息和key值做映射---(给定一个key,可以指定要找那个节点处理)
2.3 扩容
当集群发生节点变化时,一致性hash能够尽可能的减小对单调性破坏范围
因为顺时针找,所以插入节点后,影响的部分是插入节点逆时针到下一个节点间的部分,如下图,当插入节点
10.9.160.137:9000 时受影响的部分是下图标记绿色的部分
2.4数据的平衡性
一致性hash的计算,只使用真实节点信息,由于真实节点有限的,所以不能保证平衡性,引入了虚拟节点的概念
当节点相互映射的整数挨的比较近,必定会有某些节点对应key值远远大于其他节点,造成严重的数据倾斜,所以需要解决这个问题,一致性hash计算逻辑中可以引入虚拟节点.
jedis实现的一致性hash,通过计算一个节点的虚拟节点 160*weight, 调整权重值,实现比例的分配,默认weight=1