1. 分区的分类
分区分为垂直分区(Vertical Partitioning) 和 水平分区(Horizontal Partitioning)
这两种方式普遍认为起源于关系型数据库,在设计数据库架构时十分常见
1.1垂直分区(Vertical Partitioning)
垂直分区是对表的列进行拆分,将某些列的整列数据拆分到特定的分区,并放入不同的表中。
垂直分区减小了表的宽度,每个分区都包含了其中的列所对应的行。
垂直分区也被称为“行拆分(RowSplitting)”,因为表的每一行都按照其列进行拆分。
1.2 水平分区(Horizontal Partitioning)
水平分区是对表进行拆分,将不同的行放入不同的表中,所有在表中定义的列在每个分区中都能找到,所以表的特性依然得以保留。
水平分区也通常被称为“分片(Sharding)”
1.3 特点
垂直分区和列相关,而一个表中的列是有限的,这就导致了垂直分区不能超过一定限度
而水平分区可以无限拆分,还因为,表中的数据以行为单位不断增长,而列的变动很少,因此,水平分区更常见。
行式数据库更适合联机事务处理(OLTP)
列式数据库更适合联机分析处理(OLAP)
2. 水平分区算法
2.1 范围分区
范围分区(Range Partitioning) 是指根据指定的关键字将数据集拆分为若干连续的范围,每个范围储存到一个单独的节点上。用来分区的关键字也叫分区键
范围分区的主要有点有:
-
实现起来相对简单
-
能够对用来进行范围分区的关键字进行执行范围查询
-
当使用分区键进行范围查询的范围较小且位于同一个节点上是,性能良好
-
很容易通过修改范围边界增加或减少范围数据,能够简单有效的调整范围(重新分区),以调整负载。
范围分区的主要缺点:
-
无法使用分区键之外的关键字进行范围查询。
-
当范围查询较大且位于多个节点时,性能较差。
-
可能产生数据分布不均或请求流量不均的问题,导致有些数据的热点现象,从而某些节点的负载会很高。
2.2 哈希分区
哈希分区(Hash partitioning)的策略是将之地那个的关键字经过一个哈希函数进行计算,根据计算的指来决定该数据集的分区
哈希分区的优点有:
- 数据的分布几乎是随机的,随意分布相对均匀,能在一定程度上避免热点问题。
哈希分区的缺点有:
-
在不额外存储数据的情况下,无法执行范围查询。
-
在删除节点时,由于每个节点都需要一个相应的哈希值,所以增加节点需要修改哈希函数,这回导致有许多数据都要重新映射,引起数据大规模的移动,并且在此期间系统可能无法正常工作。
2.3 一致性哈希
一致性哈希(Consistent Hash)是一种特殊的哈希分区算法,它可以在分布式存储系统中哈希分区策略里增加或删除节点时引起的大规模数据移动问题。
一致性哈希将整个哈希环组织成一个抽象的圆环,成为哈希环。哈希函数的输出值一般在0到 2 32 − 1 2^{32}-1 232−1 。再通过在哈希环上添加虚拟节点(Virtual Node)(虚拟节点也叫副本(replica))解决负载不均的问题。通常来讲虚拟节点越多数据分布就越均匀。
一致性哈希的优点有:
-
一致性哈希对于节点的增减只需要重新分配哈希环上的一部分数据,改善了哈希分区大规模迁移的缺点。
-
一致性哈希也不需要修改哈希函数,直接将新节点指定到哈希环上的某个位置即可,
一致性哈希的缺点有:
- 当系统节点太少时,还是容易产生数据分布不均的问题。
如果系统中如果有不同配置,不同性能的机器,那么虚拟节点也很有用。可以让性能不同的
机器配有不同数量的虚拟节点,让性能更好的机器承担更多负载。
3. 分区的挑战
虽然分区有助于让系统高效的处理较大的数据集,并且易于拓展,但也带来了一些限制,在一个垂直分区的数据集中将不同表的数据组合起来的查询(即join查询)会非常低效
另外分区的另一个挑战时实现事务,数据存储在单台机器上时实现事务的难度尚可,但在分布式事务中想要实现事务就比较困难。