分布式系统的数据分布在多个节点中,常用的数据分布方式有哈希分布和顺序分布。
哈希分布
哈希分布就是将数据计算哈希值之后,按照哈希值分配到不同的节点上。例如有 N 个节点,数据的主键为 key,则将该数据分配的节点序号为:hash(key)%N。
传统的哈希分布算法存在一个问题:当节点数量变化时,也就是 N 值变化,那么几乎所有的数据都需要重新分布,将导致大量的数据迁移。
一致性哈希:减少数据迁移
Distributed Hash Table(DHT):对于哈希空间 0~2^n ,将该哈希空间看成一个哈希环,将每个节点都配置到哈希环上。每个数据对象通过哈希取模得到哈希值之后,存放到哈希环中顺时针方向第一个大于等于该哈希值的节点上。
一致性哈希的优点:在加入或者删除节点时只会影响到哈希环中相邻的节点
例如:增加了机器c4,只针对c3和c4之间的数据进行迁移,即将o4数据迁移到c4中。
虚拟节点:解决增加机器时负载不均衡
一致性哈希解决了数据迁移量大的问题,但只是减轻了插入节点顺时针开始遇到的第一个机器负担,对于其他的节点并未起到减轻负载的作用。
解决办法:引入虚拟节点。将每台物理机器虚拟为一组虚拟机器,放置在hash环上。对于每一个数据对象,首先按照顺时针查找第一个虚拟节点,再通过虚拟节点找到对应的物理节点。