在《一致性详解》的博文的开篇词中提到,在高并发读写数据的场景中,我们一般会对数据进行hash分片,从而分布到不同的服务器中,那么本文就谈谈常用的hash分片。

数据分片原则

数据均匀发布

数据均匀分布指的是数据需要尽可能均匀的发布在不同的节点上,不能其中一个或几个节点占有大部分数据,这样分片的作用就大打折扣了。

请求均匀分布

与数据均匀分布类似,请求均匀分布是指获取数据的请求,能够大体均匀的分布在各个节点上,不能请求大部分落在其中几个分片上面。

数据稳定性

数据稳定性是指当分片的容量不够,扩容分片的时候,数据不会大范围的从某些节点迁移到其他节点。缩容时也一样。

节点异构性

如果分片的各个节点的服务器性能不一样,那么性能差的节点应该少分配一些数据与请求;性能好的节点应该多分配一些请求。如果性能不同的节点,分配的数据与请求都差不多,其本质上就是一种不均匀。

故障隔离

故障隔离我们一般是通过备份节点数据实现的,但是如果节点都备份到同样的服务器,如果服务器故障了那么那个节点就不可用了。故我们一般把备份的数据分布到不同的机房,至少分布到不同的机架。

性能稳定性

性能稳定性是指,数据存储和查询的效率要有保证,不能因为节点的添加或者移除,造成存储或访问性能的严重下降。

数据分片方法

哈希

哈希hash分片是指通过hash函数把数据映射到不同的节点上面,如果hash函数选的比较好的话,数据可以比较均匀的分片到不同的节点上面。但是如果节点是异构的,那么每个节点都均匀分布,那么就不符合上文的节点异构性原则。而且如果节点扩容或者缩容,那么就要扫描所有的数据,重新hash节点,此时需要迁移大量的节点,稳定性不好。比如原先有3个节点,如果扩容到了4个节点。那么哈希函数就变成了hash(key)%3变成hash(key)%4。假设hash(key)的值为0,1,2,3,4,5,6,7,8,9,那么节点1分布的数据是hash(key)值为0,3,6,9,节点2为1,4,7,节点3为2,5,8。但如果扩容到4个节点了节点1分布的是0,4,8,节点2为1,5,9,节点3为2,6,节点4为3,7。可以看到迁移了大量的数据。
由于一致性有如上缺陷,故只适合于节点性能都差不多,数据变化不大的情况。

带虚拟节点的一致性哈希

带虚拟节点的一致性哈希方法,核心思想是根据每个节点的性能,为每个节点划分不同数量的虚拟节点,并将这些虚拟节点映射到哈希环中,然后再按照一致性哈希算法进行数据映射和存储。为了演示方便,假设有20个虚拟节点,4个分片每个分片的性能都差不多,实际我们一般使用较多的虚拟节点如10240,其映射关系如下图:
image.png
现在我们需要扩容到5个分片,每个分片的性能都差不多,则新的映射图如下:
image.png
从图中可以看出:只迁移了20%的数据。但是有同学可能会问,如果是大规模数据,比如几十亿条,那么一次迁移也需要迁移非常多的数据,对性能的影响还是很大。其实我们实际应用中可以分步迁移,一次迁移一部分,实际访问的时候可以先访问旧的节点,如果命中了,那么迁移到新的节点;如果没有命中,则访问新的节点。如果已经迁移了大部分,为了性能可以反过来,先访问新节点。


aidanzheng
6 声望1 粉丝

毕业于西北大学数学系,12年软件开发经验的老程序员。10000小时定律是我的座右铭,不断的学习,不断突破自我


« 上一篇
一致性详解
下一篇 »
TCP报文格式