一致性hash
1.一致性hash原理
1)基础:麻省理工大学97年创建的一个数学模型,后被应用到分布式领域.实现了一个hash映射计算,可以将任意的内存数据对象通过hash散列映射到[0,2^32-1] 。
由于结果是32位二进制,0减一变成2^32-1 最大数加一变成0,这个取值区间称谓hash环
2)数据映射计算:
节点收集信息时,每个节点信息作为一个对象映射到这个环上一个整数
key值作为字符串数据也会映射到这个环上一个整数
3)KEY与节点对应原则
key的整数顺时针寻找最近节点整数做对应关系
6380:key1,key5
6379:key3,key4,key6,key7
6381:key2
4)扩容缩容时单调性保证
如果集群节点越多,hash环弧线被分配的越短,对应的数据量越小,根据上述的计算逻辑,新节点加入时,影响的数据单调性
范围越小.所以在一个频繁发生扩容缩容的集群中,分布式计算为了保证单调性一致性hash比hash取余更适合
4)数据平衡性
当节点相互映射的整数挨的比较近,必定会有某些节点对应key值远远大于其他节点,造成严重的数据倾斜,所以需要解
决这个问题,一致性hash计算逻辑中可以引入虚拟节点.
通过对虚拟节点的个数控制,还可以做到按照比例的(权重)分片数据.在jedis中实现的虚拟节点个数160*weight 其中
weight 默认是1.
5)连接池
在目前阶段不管是单个Jedis对象,还是分片对象ShardedJedis都是一个对象,应用效率不高,在实际应用中,总要从代码中new出来然后用完了要关闭close.应该引入连接池。