分布式哈希表(DHT: Distributed Hash Table)
我们将散列表放在一个机器的内存里,当散列表比较小时候,没有问题,但如果这张散列表超过了一台机器的内存时候,或者当存储在一台机器上时候,这台机器挂掉了,那所有的数据都会消失……
那现在我们又该怎么做呢?
这便需要引入DHT来处理这种情况了,说白了就是将一张哈希表分割在不同的机器上。
首先,将上面所说的散列空间0,1...9想像成一个首尾相衔的环,9之后又重新回到零,假设,这就是十台机器。
这样我们根据散列算法就可以将不同的学生映射到不同的机器上,实现了数据的分布。
一致性哈希(consistent hashing)
好了,上面我们使用DHT实现了数据的分布式存储,但再考虑深一层,分布式架构中,节点的故障是不可避免的,当添加和删除某一节点了,会导致大量散列数据失效,需要重新散列。
影响非常大,那我们用什么哈希算法来实现DHT才能尽量的避免这种情况呢,这便说到了一致性哈希。
consistent hashing 是一种 hash 算法,简单的说,在移除 / 添加一个 cache 时,它能够尽可能小的改变已存在 key 映射关系。
刚刚我们把学生散列到了hash数值空间里,现在我们需要的是,同时将机器也散列在这个hash空间,让学生和机器的散列值同处在一个数值空间。
如上图所示,如果我们将学生和机器同时散列在一个环中,那么假设小张散列后的值为6,我们顺时针寻找,寻找到的第一台机器,则将小张放入其中。
依次类推,则得到:
小王——>机器一
小明——>机器二
小红——>机器三
小张——>机器四
假设我们机器三失效了,那这时候影响到的仅仅是小红,重新散列到机器四中。
而如果重新加入一台新的机器,影响到的也仅仅是旁边的一台机器,这样便解决了添加删除机器时候的震荡问题,这便是一致性hash的大致思想。