一致性hash
佛门广大,岂不容一癫僧!
传统hash的问题
我们在将数据库分库时,如果使用传统hash,可以使用类似stringA/4=2来映射到相应的库中。
但是如果我们的数据库不够用了,想要扩容的时候,所有的数据都要改动。
同样的如果一台缓存服务器出问题了,需要移除一个服务器时,也需要改动所有数据。
一致性hash的原理
传统的hash是对服务器的数量取模,
一致性hash是对2^32取模,形成一个hash环。
- 具体做法:
将服务器的IP或者主机名作为关键字进行hash,来确定在hash环上的位置。
将数据key使用相同的hash函数计算出哈希值,确定在hash环上的位置。从这个位置顺时针走,遇到的第一个服务器及诶单,就关联到这个节点上。
一致性hash的容错性和可扩展性
- 假设其中一个服务器节点A故障了,其余节点不受影响,只是链接到A节点的数据连接到B节点上了。
- 如果增加一个服务器节点E,也只影响新的节点到上一个节点之间的数据。
一致性hash的问题:数据倾斜
服务器节点分布不均匀的时候,容易大部分数据都到一个节点上。
为了解决这个问题,使用了虚拟节点机制。即一个服务器计算多个hash,每个hash位置都放置一个虚拟服务节点。
具体做法是在服务器的key后加编号来实现。