抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

数据分片

数据分片就是按照一定的规则,将数据集划分成相互独立正交的数据子集,然后将数据子集分布到不同的节点上,通过设计合理的数据分片规则,可将系统中的数据分布在不同的物理数据库中,达到提升应用系统数据处理速度的目的。

应用场景包括分库分表、缓存集群数据节点分片等。

常见的数据分片算法有:按数据范围分片、哈希分片、一致性哈希分片、哈希槽分片

按数据范围分片

按数据范围分片实现比较简单,常见场景就是按照时间区间或ID区间来划分。例如,按照日期时间将每天生成的日志数据存放在不同的表中;或者是按照用户ID划分,将ID小于10000的数据存放在表A,将ID大于等于10000的数据存放在表B。

优点:

  • 单表大小可控
  • 水平扩展方便,增加节点时无需迁移数据
  • 使用分片字段进行范围查找时,连续分片可以快速定位分片进行查询,有效减少跨分片查询问题

缺点:

  • 热点数据成为性能瓶颈。某个范围内的数据可能会被经常读写,例如按时间分片时,最近存储的数据可能会经常访问,而历史数据访问量相对比较少。

hash分片

hash分片是指利用哈希函数对数据进行运算得到hash值,再使用hash值取余得到数据存放的目标分片。
假设有3个缓存节点,我们在存放或读取数据时,需要知道此缓存应该被存放至哪个节点,我们首先要对缓存key值做哈希计算得出对应的哈希值,再使用哈希值对节点数量3取余,得到的结果就是此缓存key对应存放的目标节点。

优点:

  • 简单易理解

缺点:

  • 当缓存节点增加或减少时,取余得出的结果会变化,从而导致缓存失效不可用,如果要保持可用则需要在各个节点之间迁移大量数据,造成极大的性能损耗

一致性哈希分片

一致性哈希分片可以很好地解决增加和删减节点时,数据无法被访问或需要搬移大批量数据的问题。在一致性哈希算法中,首先要将整个hash值空间组织成一个虚拟的圆环hash环,然后计算节点的hash值,然后根据hash值模2^32将节点放在hash环上。当需要存取数据时,先对数据进行哈希运算,得到数据在hash环上的位置,再从这个位置沿着圆环按顺时针寻找,找到的第一个节点即是数据存放的目标节点。由此,当进行节点扩缩容时,只需要移动很少一部分数据。

问题:

  • 数据倾斜。各个节点在hash环上分布可能是不均衡的,导致数据的不均匀分布。
  • 缓存雪崩。当某个节点故障时,这个节点承担的所有访问都会被顺时针转移到下一个节点上,对下一个节点造成压力,导致连续故障引起雪崩效应。

改进方案:
增加虚拟节点,每个节点计算多个哈希值分布在hash环上,数据由虚拟节点映射到实际节点

哈希槽分片

redis集群中使用的哈希算法和一致性哈希算法有所区别,引入了哈希槽slot的概念。
一个redis集群包含16384个哈希槽,存储在redis集群中的所有key都会被映射到这些slot中。
各个节点上的哈希槽是平均分配的,当某个节点下线时,此节点上的哈希槽会被迁移到其他节点上,这个过程中节点不会停止服务。

评论