关于java:hash算法与一致性hash

1次阅读

共计 903 个字符,预计需要花费 3 分钟才能阅读完成。

hash 算法的利用很宽泛,如平安加密、数据校验、惟一标识、散列函数、负载平衡、数据分片、分布式存储。这里简略聊一下 hash 算法在分布式下的数据存储,如果咱们有三台 redis 集群节点 A、B、C:
1,一般 hash+ 取模算法
我在对数据进行查问的时候,会进行这样的运算:hash(key)%3 来找到对应的机器。不过当咱们数据质变大须要减少一台机器的时候,那这里相应会调整为:hash(key)%4,这样的话会将之前三个节点上所存储的数据与机器的对应关系都会影响到,同样某个节点出了故障进行了下线也会有同样的问题,这就会给前面的数据库造成很大的压力。显然这种路由算法在机器经常增减的场景下是不能承受的。咱们接着看应答策略:
2,一致性 hash 算法
具体过程是这样的:先应用 2 的 32 次方结构一个虚构环,而后将机器节点散布在这个环上:hash(节点 ip)%2^32, 这里是对 2^32 进行取模而不是对机器节点个数进行取模,当进行数据查找时进行 hash(key)运算而后顺时针找到第一个遇到的机器节点。同样当咱们减少一台机器时,也只会影响到 1 / 3 节点的数据而不至于像第一种形式影响到的有节点数据。解决了动静增减节点造成的影响但还是会存在数据分布不平均的状况,可能会呈现 80% 的数据都集中在其中一台机器上而另两台机器上的数据很少,这个时候的策略:
3,一致性 hash+ 虚构节点思维
在第 2 种思维的根底上,咱们再对所有节点进行屡次 hash 运算生成多个虚构节点,只有 hash 运算的次数适合,那么每个实在节点对应的虚构节点会交错散布的很平均,如此一来数据在节点上的散布也会很平均。这里的过程就是数据再定位到虚构节点、虚构节点再对应实在节点。
最初再提一下 redis 的 hash slot 算法
redis 定位 key 的过程是:CRC16(key)%16384 找到对应的 slot,而每个 slot 有相干的 node, 每个 node 会记录本身所属的 slot 也会记录其它 node 所属的 slot,如果 key 就在本身 node 上则返回对应的 value, 如果不在则返回 MOVED 并返回这个 key 所在的 node。也就是 CRC16(key)%16384 -> slot -> node

正文完
 0