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