1.一致性Hash解决的问题
针对分布式系统中负载均衡的问题,一般使用Hash算法让固定参数(如根据userId)的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分的请求,起到负载均衡的作用。
当机器增加或减少时,使用普通的Hash算法实现的负载均衡(特别是缓存服务器),会导致几乎所有的请求到的机器发生改变。
如当前服务有2台机器:
原来userId=10 mod 2,请求到机器0;
原来userId=21 mod 2,请求到机器1。
当增加了机器2之后:
userId=10 mod 3,请求到机器1;
userId=21 mod 3,请求到机器0。
如果是缓存服务器,几乎会导致所有的缓存失效;
如果是session服务器,几乎会导致所有的session失效;
给服务带来不必要的性能损失,而且有可能导致服务不可用。
因此,当增加或者删除机器时,尽量保证原来分配到的某个机器,现在仍然应该分配到那个机器,即将数据迁移量降到最低。
1.一致性Hash原理
一致性Hash是取模232,构造一个[0,231-1]的整数Hash环,将机器放到对应的Hash环节点上。当由请求时,根据key值(如userId)计算得到Hash值,然后在Hash环上顺时针查找距离这个key的Hash值最近的服务器节点,完成key到服务器的Hash映射过程。
可能导致的问题:
1.数据倾斜问题,特别是机器数量比较少时(通过虚拟节点解决);
1.分布不均匀导致的请求热点问题。
网友评论