
引 言
GoldenDB的分片设计是分布式数据库横向扩展的基础,旨在提高系统的并发处理能力和数据存取效率。本文介绍了GoldenDB分片设计的关键要点,并对表分片策略、设计原则及优缺点进行归纳总结。

GoldenDB支持的数据拆分主要包括垂直切分和水平切分两种模式:
垂直切分:按照不同的单节点表逻辑下分到不同的DN中,适用于业务系统之间耦合度低、可拆分出单独的业务模块且业务逻辑清晰的系统。

GoldenDB数据分片具有以下特性:
无限扩展:数据分片水平切分扩展到多个物理节点,理论上支持无限扩展。
性能提升:数据分片以后单个数据节点上的数据集变小,数据库查询的压力变小、查询更快,性能更好;同时水平切分以后查询可以并发执行,提升了系统的吞吐量。

多分片表:表数据水平分布在不同分片上,数据分发策略包括:HASH分片策略、RANGE分片策略、LIST分片策略等;设置方式为分片子句(distributed by)中设置分发字段和分发策略,设置多个分片。例如:create table t2(...)distributed by hash(acc_id)(g1,g2,g3...g10)。
针对多节点分布存储的表,在采用HASH/RANGE/LIST分发策略时,尽量保持各个DB节点上的数据量均衡,均衡的数据分布在多节点并行计算时会有更高的性能表现。
HASH分片策略:适用于将数据均匀的分布到预先定义的各个分片上,保证各分片的数据数量大体一致,一般情况下不需要关心分发字段的值的具体含义。HASH分发键适用于等值条件查询,且分散粒度较细,例如客户号、账号、手机号码等字段,HASH计算后结果较均匀,不适合地区编号、月份等数值小的字段,由于数值范围小,HASH计算后结果不均衡。
RANGE分片策略:适用于指定一个给定的列值或列值集合应该保存在哪个分片上,常用于时间字段上,比如数据按照自然月或天来分布存储。通常适用于连续值或一系列可以按值域划分范围的离散值,对其值域指定分片的场景。RANGE的分发键不仅可以使用等值限定,也可以使用偏序(大于、小于、大于等于等)限定。常用于时间字段上,比如数据按照自然月或天来分布存储。
LIST分片策略:适用于含有一系列限定性值的列的场景,常用于机构代码、地区代码和国家代码字段上。适用于一组数值较少的枚举值、且该枚举值的取值范围很少变化。LIST的分发键仅可以使用等值限定。比如对机构号使用LIST分发,通过组合各机构号,使每个分片数据量大致相同。

单节点表适用于下面几种场景:
1) 中等表和小表(通常百万级)建议采用单节点存储。
2) 需要进行JOIN的表要考虑放到同一个DN节点上。
1) 大表数据采用HASH/RANGE/LIST分片分发策略。
2) 保持各数据分片上的数据量均衡,业务增长过程中数据变化也保持相对均衡。
3) 面向用户的主档表(客户、账号、用户)优先考虑用HASH分发策略。分片键字段少的大表,采用RANGE/LIST分片策略,例如面向机构编码或地市字段大表采用LIST分片策略。
4) 对包含日期的流水表,采用先分片再分区。
5) 每个分片的数据总量不超过2~3TB,推荐不超过2TB。
6) 单台服务器的数据总量不超过6~9TB,推荐不超过6TB。
7) 单个分片的表记录行总数不超过1亿条。
8) 单个分区的表记录行总数不超过2千万条。
10) 避免热点数据的过分集中,如果因为分发策略的原因导致热点数据,可通过增加分发字段的方式,使数据分布进一步细化,热点的判断可通过各个分片的各项指标综合判断。
1) 小表且更新不频繁才使用复制表。
2) 在JOIN或者子查询中频繁使用的表才使用复制表。

分片设计在数据库应用中的优势主要体现在以下几个方面:
提高系统的可扩展性:
数据分片支持无限扩展,理论上可以随着业务需求和数据量的增长而不断增加服务器节点。
提高系统的可用性:
提高系统的性能:
提高数据的安全性:
将数据划分到多个分片中可以降低数据泄露和攻击的风险,提高数据的安全性。
增加系统的复杂性:
分片设计需要定义清晰的数据分片规则,包括选择分片键、确定分片策略等,这增加了系统设计的复杂性。
分布式系统需要处理多个节点之间的通信和协调,增加了系统的复杂性。
数据一致性问题:
分片设计可能导致数据在多个节点上复制,增加了数据一致性的维护难度。
跨分片查询困难:
当查询涉及多个分片时,需要将查询请求发送到多个节点上执行,然后将结果合并返回给客户端。这增加了查询的复杂性和延迟。
数据再均衡:
分布式事务管理困难:
网络开销增加:
由于数据分布在不同的分片上,查询操作可能需要通过网络进行通信,增加了网络开销和延迟。对于大数据量的查询,这可能会成为性能瓶颈。
参考资料
[1]《ZXCLOUD_GoldenDB_分布式数据库SQL规范》




