一般的做法是对key进行hash,比如有4台机器,就对4取模。
这样的坏处是增加或者减少机器的时候,会有大量数据进行迁移。
业界做法是用一致性哈希算法,将机器节点的ip值,对一个很大的数取模比如2^32,
用一个环去维护它,如图
节点A与节点B之间的key-2,就存在节点B里面,(两个节点之间的数据,交给顺时针的后一个节点存储),这样的好处是即使有节点(机器)变化,最多也会影响一个节点数据的迁移,不会影响其他节点的数据,(具体实现,可以维护一个节点数据(有序的),拿到一个key的hash我们可以通过二分查找来知道具体存在哪个节点上)。
优化:真实场景我们没有那么多节点放在环上,有可能出现一个节点存了许多的数据,而其他节点确存的很少数据(数据分布不均匀),此时就可以用虚拟节点技术,创建许多虚拟节点,维护好虚拟节点与真实节点的映射关系,增加环上节点的数量,来达到数据分布均匀的效果。
参考:9.4 什么是一致性哈希? | 小林coding (xiaolincoding.com)