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

虚拟节点:解决增加机器时负载不均衡
一致性哈希解决了数据迁移量大的问题,但只是减轻了插入节点顺时针开始遇到的第一个机器负担,对于其他的节点并未起到减轻负载的作用。
解决办法:引入虚拟节点。将每台物理机器虚拟为一组虚拟机器,放置在hash环上。对于每一个数据对象,首先按照顺时针查找第一个虚拟节点,再通过虚拟节点找到对应的物理节点。
例如:插入节点4时,对应的一组虚拟节点是C41,C42,C43,减轻了C31,C22,C11的负担,实现了负载均衡

顺序分布
哈希分布式破坏了数据的有序性,顺序分布则不会。
顺序分布的数据划分为多个连续的部分,按一定策略分布到不同节点上。

User 表的主键范围为 1 ~ 7000,使用顺序分布可以将其划分成多个子表,对应的主键范围为 1 ~ 1000,1001 ~ 2000,…,6001 ~ 7000。
其中 Meta 表是为了支持更大的集群规模,它将原来的一层索引结分成两层,使用 Meta 表来维护 User 子表所在的节点,从而减轻 Root 节点的负担。
本文探讨了分布式系统中数据分布的两种常见方式:哈希分布和顺序分布。哈希分布通过计算哈希值分配数据到节点,而一致性哈希和虚拟节点则用于解决数据迁移和负载均衡问题。顺序分布则保持数据的有序性,通过Meta表支持更大规模的集群。
168万+

被折叠的 条评论
为什么被折叠?



