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