分布式系统存在一个问题,机器增加、减少时,之前存放的数据就会全部失效。因为你按照新的n值取模计算出的机器编号和当时计算得肯定不等,也就意味着大部分缓存会失效。hash环(一致性hash)可以尽可能的减少缓存失效的数目。
理论

hash环(一致性哈希)需要经过2次哈希:
- 将服务器节点hash到这个环上
- 把keyhash到这个环上,顺时针找到离自己最近的一个服务器。
增加节点

1、添加服务器4
2、计算新增服务器在环上的位置,C4
3、将C4到C2之间的数据 由C3服务器迁移到C4;
4、其他数据不变
摘除节点

1、下线服务器4
2、C2-C4环上用户数据需要迁移到C3服务器。
3、此时有个问题 服务器异常下线数据如何迁移??一次性哈希用作缓存时可以不考虑数据丢失问题。新数据会放到新的对应服务器内。但如果做分布式存储呢?
数据倾斜

1、服务器较少的时候很难出现均匀分布在环上。
2、这时会造成数据不均,某一台机器压力过大。
3、可以增加虚拟节点解决此问题。

1、确定虚拟节点规则,比如 ip1_1,ip1_2
2、一台服务器对应多态虚拟节点,虚拟节点可以比较均匀的分布在环上
数据可靠性
假如我们使用场景不是缓存服务,不允许数据丢失,我们可以做数据冗余,为了简单做2份冗余。
