分布式数据库的分片与单体数据库的分区非常相似,区别在于:分区虽然可以将数据表按照策略切分成多个数据文件,但这些文件仍然存储在单节点上;而分片则可以进一步根据特定规则将切分好的文件分布到多个节点上,从而实现更强大的存储和计算能力。
分片策略:hash和range 调度机制:静态和动态
PGXC
hash分片
Hash 分片,就是按照数据记录中指定关键字的 Hash 值将数据记录映射到不同的分片中。 本质上,Hash 分片是一种静态分片方式,必须在设计之初约定分片的最大规模。同时,因为 Hash 函数已经过滤掉了业务属性,也很难解决访问业务热点问题。
range静态分片
与 Hash 分片不同,Range 分片的特点恰恰是能够加入对于业务的预估。
相对 Hash 分片,Range 分片的适用范围更加广泛。其中一个非常重要的原因是,Range 分片可以更高效地扫描数据记录,而 Hash 分片由于数据被打散,扫描操作的 I/O 开销更大。
但是,PGXC 的 Range 分片受限于单体数据库的实现机制,很难随数据变动和负载变化而调整。
NewSQL
CockroachDB 和 YugabyteDB 同时支持两种方式,TiDB 仅支持 Range 分片。
Range动态分片
- 分片可以自动完成分裂与合并
- 可以根据访问压力调度分片
NewSQL 与 PGXC 的区别在于,对于 NewSQL 来说,分片是高可靠的最小单元;而对于 PGXC,分片的高可靠要依附于节点的高可靠。
NewSQL 的实现方式是复制组(Group),通常由一个主副本和若干个副本组成,通过 Raft 或 Paxos 等共识算法完成数据同步。PGXC 的最小高可靠单元由一个主节点和多个备节点组成,Set 的主备节点间复制,多数采用半同步复制,平衡可靠性和性能。这意味着,所有分片的主副本必须运行在 Set 的主节点上。
我们说 Range 是更好的分片策略,就是因为 Range 分片有条件做到更好的动态调度,只有动态了,才能自适应各种业务场景下的数据变化,平衡存储、访问压力、分布式事务和访问链路延时等多方面的诉求。
此文章为6月Day8学习笔记,内容来源于极客时间《分布式数据库30讲》