哈希与一致性哈希

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

数据分片原则

数据均匀发布

数据均匀分布指的是数据须要尽量均匀的发布在不一样的节点上,不能其中一个或几个节点占有大部分数据,这样分片的做用就大打折扣了。服务器

请求均匀分布

与数据均匀分布相似,请求均匀分布是指获取数据的请求,可以大致均匀的分布在各个节点上,不能请求大部分落在其中几个分片上面。并发

数据稳定性

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

节点异构性

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

故障隔离

故障隔离咱们通常是经过备份节点数据实现的,可是若是节点都备份到一样的服务器,若是服务器故障了那么那个节点就不可用了。故咱们通常把备份的数据分布到不一样的机房,至少分布到不一样的机架。性能

性能稳定性

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

数据分片方法

哈希

哈希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。能够看到迁移了大量的数据。
因为一致性有如上缺陷,故只适合于节点性能都差很少,数据变化不大的状况。blog

带虚拟节点的一致性哈希

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

相关文章
相关标签/搜索