暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GoldenDB数据库分片设计

基础技术研究 2024-10-17
1333
点击蓝字
关注我们




引 言

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


GoldenDB数据拆分

GoldenDB支持的数据拆分主要包括垂直切分和水平切分两种模式:

垂直切分:按照不同的单节点表逻辑下分到不同的DN中,适用于业务系统之间耦合度低、可拆分出单独的业务模块且业务逻辑清晰的系统。

水平切分:按照业务表的逻辑关系,将同一个表中的数据按照某种拆分规则打散到多个DN上,对应用来说更为复杂。

GoldenDB分片特性

GoldenDB数据分片具有以下特性:

无限扩展:数据分片水平切分扩展到多个物理节点,理论上支持无限扩展。

性能提升:数据分片以后单个数据节点上的数据集变小,数据库查询的压力变小、查询更快,性能更好;同时水平切分以后查询可以并发执行,提升了系统的吞吐量。

高可用:部分分片节点宕机只会影响该部分分片的服务,不会影响整个系统的可用性。

GoldenDB表分片策略
GoldenDB支持三大类的分片策略:单节点表、多分片表、复制表。
单节点表:表数据只存储在一个分片上,设置方式为在分片子句(distributed by)中指定一个分片,分发策略固定为复制类型。例如:Create table t1(...)distributed by duplicate(g1)。

多分片表:表数据水平分布在不同分片上,数据分发策略包括: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分发,通过组合各机构号,使每个分片数据量大致相同。
复制表:表数据是全量存储在各个DB节点上,设置方式为在分片子句(distributed by)中设置DUPLICATE,并指定所有分片。复制表适用于小表且不常修改的表,或者JOIN和子查询中使用的表。主要目的是减少节点间网络数据的传输,以提高查询的性能。比如,静态参数表,适合用作复制表。例如:create table t3(...)distributed by duplicate(g1,g2,g3...g10)。
多级分片:实际使用中出于某些考虑,需要对数据进行复杂的分片。比如集团客户分在某个分片,非集团客户按照客户号HASH分片。实际上,多级分片可以看作带复杂表达式的混合分发策略。如本例中集团客户指定分片即为LIST分发,非集团客户则为HASH分发。多级分片是为了应对复杂场景下数据的分片,需要分析业务的特点制定具体的多级分片策略。
先分片再分区:对包含历史表等有日期字段的表,采用先分片再分区的策略。使用年份、月份等字段进行分区设计,将相同分片上的大表按日期将数据分散到多个分区。
 
GoldenDB表设计原则

单节点表适用于下面几种场景:

1) 中等表和小表(通常百万级)建议采用单节点存储。

2) 需要进行JOIN的表要考虑放到同一个DN节点上。

3) 建表时要考虑各个DN节点的数据均衡,单分片表总数据量不要超过该分片总数据量的20%,建议控制在10%以内。
分片表适用于下面几种场景:

1) 大表数据采用HASH/RANGE/LIST分片分发策略。

2) 保持各数据分片上的数据量均衡,业务增长过程中数据变化也保持相对均衡。

3) 面向用户的主档表(客户、账号、用户)优先考虑用HASH分发策略。分片键字段少的大表,采用RANGE/LIST分片策略,例如面向机构编码或地市字段大表采用LIST分片策略。

4) 对包含日期的流水表,采用先分片再分区。

5) 每个分片的数据总量不超过2~3TB,推荐不超过2TB。

6) 单台服务器的数据总量不超过6~9TB,推荐不超过6TB。

7) 单个分片的表记录行总数不超过1亿条。

8) 单个分区的表记录行总数不超过2千万条。

9) 关联性强的表(比如JOIN、批量迁移等)尽采用相同的分片策略,例如客户的主档表和流水表,使用相同的分片策略,使得相同客户的多个表数据落在相同的分片上,减少跨分片关联。

10) 避免热点数据的过分集中,如果因为分发策略的原因导致热点数据,可通过增加分发字段的方式,使数据分布进一步细化,热点的判断可通过各个分片的各项指标综合判断。

复制表适用于下面几种场景:

1) 小表且更新不频繁才使用复制表。

2) 在JOIN或者子查询中频繁使用的表才使用复制表。

去范式化原则:
在分布式系统中,通常去范式化以空间换时间来提升系统性能,即在“不影响数据唯一化”原则下,去范式化后的冗余数据字段在数据库中只能唯一属于一张表,否则无法确保数据一致性。当查询语句中出现表的JOIN操作时,尤其是针对分布式表间出现关联查询时,建议首先考虑采用去范式化设计来规避JOIN操作,达到提高查询效率的目的。特别适合于需要冗余的字段很少更新的业务场景。
统一分片主题:
统一分片主题,在应用架构设计、应用开发和日常维护中减少分片设计带来的系统复杂度。同一个系统工程中,涉及大量应用以及每个应用下的大量表需要进行分片设计,选择表的分片策略和分片键(依据表的哪个字段进行分片),并且数据库表策略与表数据规模、关联关系、SQL操作等要素紧密相关,如果从每个表逐一考虑分片设计会陷入技术细节中,工作量较庞大。为了快速和合理进行表分片设计,在启动分片设计之前,理清各实体之间的关系至关重要,从实体关系中提炼业务的分片主题,比如围绕用户(客户、账号、用户)的表,采用用户主题,使用相同的分片策略,以及相同的分片字段作为分片键。围绕机构的表,采用机构主题进行分片。将整个工程中分片主题控制在围绕其中一个主题为主,少量主题为辅助(3~5个)的规模。比如在CRM/BOSS中,采用HASH分片策略,用户编号作为分片键作为主要的分片主题。


GoldenDB分片优缺点

分片设计在数据库应用中的优势主要体现在以下几个方面:

  • 提高系统的可扩展性:

通过将数据分散到不同的服务器上,可以实现系统的水平扩展。当数据量超过单个服务器的处理能力时,可以简单地添加新的分片服务器,从而提高整个系统的性能。

数据分片支持无限扩展,理论上可以随着业务需求和数据量的增长而不断增加服务器节点。

  • 提高系统的可用性:

通过数据的冗余存储和备份,可以提高系统的可用性。当某一台服务器发生故障时,其他分片服务器依然可以提供服务,保障部分用户的正常访问。
  • 提高系统的性能:

将数据分散到多个节点上进行并行处理,可以提高系统的性能和吞吐量。
  • 提高数据的安全性:

将数据划分到多个分片中可以降低数据泄露和攻击的风险,提高数据的安全性。

分片设计的缺点主要包括以下几个方面:
  • 增加系统的复杂性:

分片设计需要定义清晰的数据分片规则,包括选择分片键、确定分片策略等,这增加了系统设计的复杂性。

分布式系统需要处理多个节点之间的通信和协调,增加了系统的复杂性。

分片设计还需要考虑数据一致性、事务管理、数据迁移和恢复等复杂问题。
  • 数据一致性问题:

分片设计可能导致数据在多个节点上复制,增加了数据一致性的维护难度。

在分布式系统中,需要采取额外的措施来确保数据在各个节点之间的一致性,例如使用分布式事务管理器、分布式锁等。
  • 跨分片查询困难:

当查询涉及多个分片时,需要将查询请求发送到多个节点上执行,然后将结果合并返回给客户端。这增加了查询的复杂性和延迟。

跨分片查询可能需要更多的网络传输和计算资源,影响系统的性能和效率。
  • 数据再均衡:
在分片数据库架构中,有时一个分片会超过其他分片并变得不均衡,这称为数据库热点。
  • 分布式事务管理困难:
在分片环境中,跨多个分片的事务管理变得更加复杂。分布式事务管理器需要确保数据在各个分片之间的一致性,这需要额外的协调和通信开销。
  • 网络开销增加:

由于数据分布在不同的分片上,查询操作可能需要通过网络进行通信,增加了网络开销和延迟。对于大数据量的查询,这可能会成为性能瓶颈。

综上所述,分片设计在数据库应用中具有显著的优势,包括提高系统的可扩展性、可用性、提高性能、安全性和可靠性、支持更高的并发访问等方面。这些优势使得分片设计成为处理大规模数据和高并发访问场景下的重要技术手段。分片设计虽然带来了许多优势,但也存在一些缺点,需要在设计和实施时仔细考虑和权衡。


参考资料

[1]《ZXCLOUD_GoldenDB_分布式数据库SQL规范》





文章转载自基础技术研究,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论