AntDB 如何合理选择分片键


本文主要探讨AntDB 分片键设计规则。

通过本文阐述下列功能:

  • AntDB 分片介绍
  • AntDB 分片要解决的问题
  • 常用分片字段优缺点分析

AntDB 分片

分片键(sharding Key)

分片是将一张分布式表按照指定的分片键(sharding Key)和分片模式(sharding Mode)水平拆分成多个数据片,分散在多个数据存储节点中。对于分片的表,要选取一个分片键。一张分布式表只能有一个分片键,分片键是用于划分和定位表的列,不能修改。

分片模式(sharding Mode)

  • 散列Hash
    即按表的分片键(sharding Key)来计算哈希值,并将取模后的值(哈希值%1024)与数据节点建立映射关系,从而将哈希值不同的数据分布到不同的数据节点上。

分片目的

解决数据库扩展性问题,突破单节点数据库服务器的 I/O 能力限制。

分片策略

  1. 1000万以内的表,不建议分片. 通过合适的索引,可以更好地解决性能问题。
  2. 分片键不能修改。
  3. 分片键选择时,尽量保证数据能够均匀分布。
  4. 分片键选择时,尽量保证事务控制在分片范围内(本节点),避免出现跨分片(跨节点)。
  5. 继承表的分片键,子表保持和父表一致。

总体上来说,分片键盘的选择是取决于最频繁的查询 SQL 的条件。找出每个表最频繁的 SQL,分析其查询条件,以及相互的关系,就能比较准确的选择每个表的分片策略。

分片要解决的问题

跨节点join问题

只要是进行切分,跨节点Join的问题是不可避免的。但是良好的设计和切分可以减少此类情况的发生。

解决这一问题,要求分片字段和join连接字段保持一致,当查询可以下推至节点运算时,可以有效解决此类问题。

如果运算不允许下推至节点,可以将数据量较小的表修改为复制表后(数据量不超过1000万),也能实现本节点运算的能力。

跨节点order by,group by,count等聚合函数问题

这些是一类问题,因为它们都需要基于全部数据集合进行计算。

解决这一问题,要求分片字段和聚合字段保持一致,当聚合可以下推至节点运算时,可以有效解决此类问题。

常用分片字段优缺点分析

考虑使用 phone-number(唯一值) 字段作为分片键

每个人通常都有自己独一无二的电话号码,这类重复率低的字段作为分片键 能够保证集群中数据的均匀分布,是一种推荐的分片方式。

考虑使用 areacode(区号) 字段作为分片键

这个字段的取值范围是给定的一个列表,由于总的区号的个数并不多,所有areacode相同的数据都会分布在同一个数据节点中.由于各个地区的数据量不均匀,导致数据分布产生不均衡,这会带来一些影响:

当按区号聚合查询时,SQL整体执行效率完全取决于 数据量较大的区号 的响应时间,产生圆桶效应。

考虑使用 date(日期) 字段作为分片键

这个字段和 areacode 类似,也是一个范围区间,但是可以有效避免数据分布不均匀的问题。但当查询的日期区间不是数据节点倍数的时候,查询目标结果集的数据量却产生了不均匀,也会产生圆通效应。

如一个8节点的集群,某表按日期分片后,只查询连续12天的数据,此类场景,将产生计算不均匀的现象。