1、问题引入:
集群新增机器时,有一部分流量会打到新机器上,如果这些流量的处理依赖之前应该处理的那台机器上的历史数据,那么没做数据同步就会处理失败。有机器宕机时,会出现同样的问题。
2、解决思路:
每次服务器数量变动时,都先全部停止服务,根据新的路由做数据迁移,然后恢复服务。但显然这样成本很高。
3、更好的解决思路:
如果服务器数量变动时,根据新的散列算法,可以让旧请求打到原来的服务器,而新请求有一部分打到新的服务器,这样就可以只迁移宕机的机器上的数据,而不必全部机器重新做数据分配。
具体实现是,假设有2^32个虚拟节点,有n台机器(n很小)分布在其中的n个节点上,每个请求数据根据2^32取模,根据就近原则分配流量,当有机器变动时,流量自动重新分配。
4、新的问题:
上述方案中,每当有机器挂掉,相邻机器就会承担它的压力,也就是承担2台机器的压力,那么之后这台机器的宕机概率就高很多;如果已增加负荷的这台机器又挂了,那么它相邻机器就会承担3台机器的压力,然后更容易挂掉,这会引起连锁反应,导致雪崩。
5、新的解决思路:
如果每次有机器宕机时,如果原本路由到这台机器上的请求可以平均分配到其他机器上,就不会导致一连串的宕机。这就是一致性Hash算法。
具体实现是,在上述方案的基础上,每台机器不是占在一个节点上,而是占在一群节点上,如果这台机器挂了,那么这群节点上的流量会分配到相邻的2台机器而不是1台机器上。
总结:一致性hash算法通过减少影响范围的方式解决了增减服务器导致的数据散列问题,从而解决了分布式环境下负载均衡问题,如果存在热点数据,那么通过增添节点的方式,对热点区间进行划分,将压力分配至其他服务器,重新达到负载均衡的状态。
一致性哈希算法常用在分布式缓存系统中,每台机器都会热备上一台机器的数据。
参考资料: