数据分片
数据分片就是按照一定的规则,将数据集划分成相互独立正交的数据子集,然后将数据子集分布到不同的节点上,通过设计合理的数据分片规则,可将系统中的数据分布在不同的物理数据库中,达到提升应用系统数据处理速度的目的。
应用场景包括分库分表、缓存集群数据节点分片等。
常见的数据分片算法有:按数据范围分片、哈希分片、一致性哈希分片、哈希槽分片
按数据范围分片
按数据范围分片实现比较简单,常见场景就是按照时间区间或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环
上,数据由虚拟节点映射到实际节点