摘要:
亚信安慧AntDB-T是一款通用企业级、高可用、高性能的原生分布式关系型数据库,具有多种分片方式。在数据库的使用过程中,随着数据的变更和增长,需要重新修改表的分片方式。
AntDB-T数据库支持重分布命令,在内核中有两种实现方式,本文主要针对通过既有的一些SQL命令来实现重分布的内部实现进行介绍。
AntDB-T的分片方式介绍
AntDB-T目前支持以下四种分片方式:
-
复制表(replication)
-
Hash分片表
-
Modulo分片表
-
Random分片表
复制表在每个分布节点上都有一份完整的表数据,而其他三种分片表,表数据会根据相应的规则,散列在多个节点上。
AntDB-T重分布功能介绍
AntDB-T支持以下几种类型的数据重分布:
-
replication修改为hash、modulo、random
-
hash 修改为 random、modulo、replication
-
modulo 修改为 hash、random、replicaiotn
-
random 修改为 hash、modulo、replication
-
add node --增加分布节点
-
delete node --减少分布节点
-
to node (nodelist) --重新设置分布节点
对应的重分布命令如下:
-
ALTER TABLE name DISTRIBUTE BY distri_type
-
ALTER TABLE name ADD NODE (node_name[, … ])
-
ALTER TABLE name DELETE NODE (node_name[, … ])
-
ALTER TABLE name to node (node_name[, … ])
重分布的内部实现
AntDB-T内核有两种实现重分布的方式,其中一种是通过既有的一些SQL命令来实现的,本文主要就该方式进行一个说明。
在AntDB-T数据库中,表的分布方式及分布的节点信息是存储在coordinator节点的表分布元数据表中的,如图1。重分布的主要处理流程就是修改计算表分布元数据表,并按照新的分片方式,将数据重新分布到各个节点上。
图1:计算节点元数据示例
综上所述,这里是通过一些SQL命令来实现表数据的重分布,我们将这些SQL命令分为两种,一种需要在修改表分布元数据之前执行,类型是CATALOG_UPDATE_BEFORE;另一种是在修改表分布元数据之后执行,类型是CATALOG_UPDATE_AFTER。
下面针对不同的重分布方式进行内部实现的具体分析。
1、通用的做法
-
首先,首先生成一个copy to命令,在修改表分布元数据之前,将所有的表数据拷贝到coordinator节点。
-
其次,生成truncate命令,将所有节点的表数据进行删除。
-
接着,按照重分布命令,修改表分布元数据,修改为最终需要的分片方式。
-
最后,生成一个copy from命令,将拷贝到coordinator节点的数据按照新的分片规则,下发到相应的datanode节点。
图2:通用重分布流程
以上的流程适合所有的重分布命令,但是有几种情况可以简化一些流程,提高重分布的效率,对于这些场景,在下面会逐一介绍。
2、复制表增加节点
对于复制表的增加节点,没有必要truncate所有节点的数据。具体执行流程如下:
-
首先,生成一个copy to命令,在修改表分布元数据之前,将表数据拷贝到coordinator节点。
-
其次,修改表分布元数据。
-
最后,生成一个copy from命令,将拷贝到coordinator节点的数据按照下发到新增的节点。
图3:复制表增加节点
3、复制表减少节点
对于复制表的减少节点,只需要truncate掉对应节点的数据就可以了,没有必要去拷贝数据。
图4:复制表减少节点
4、复制表修改为hash、modulo分片表
复制表在所有datanode节点上都有完整的数据,当需要修改为hash或者modulo分片表时,datanode节点只需要删除不属于本节点的数据即可。
在修改表分布元数据后,我们根据新的分片方式生成每个节点对应的delete命令,datanode节点执行这些命令,就实现了重分布的目的。
图5:复制表修改为hash、modulo分片表
结论
本文介绍了AntDB-T数据库重分布命令内部实现的一种方式,内核中提供了重分布命令后,用户不需要再手动导入导出数据、重建表等操作,一个命令即可实现重分布的功能。
关于亚信安慧AntDB数据库
AntDB数据库始于2008年,在运营商的核心系统上,服务国内24个省市自治区的数亿用户,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔通信核心交易,保障系统持续稳定运行超十年,并在通信、金融、交通、能源、物联网等行业成功商用落地。