在《一致性详解》的博文的开篇词中提到,在高并发读写数据的场景中,咱们个别会对数据进行 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,其映射关系如下图:
当初咱们须要扩容到 5 个分片,每个分片的性能都差不多,则新的映射图如下:
从图中能够看出:只迁徙了 20% 的数据。然而有同学可能会问,如果是大规模数据,比方几十亿条,那么一次迁徙也须要迁徙十分多的数据,对性能的影响还是很大。其实咱们理论利用中能够分步迁徙,一次迁徙一部分,理论拜访的时候能够先拜访旧的节点,如果命中了,那么迁徙到新的节点;如果没有命中,则拜访新的节点。如果曾经迁徙了大部分,为了性能能够反过来,先拜访新节点。