弹性扩缩容
TDSQL Boundless 的核心特性之一是实现业务无感知的扩缩容,确保在扩缩容过程中业务请求不受性能抖动影响。下面详细解析数据分片与复制组的调度机制如何实现这一目标。
扩缩容就是数据分片 - 复制组 - 物理节点三者关系的重组,存在以下几种事件:
数据逻辑关系变化
数据分片(Region)的分裂和合并。
数据分片(Region)在复制组(Replication Group)上的转移。
复制组(Replication Group)创建和删除。
数据物理关系变化
复制组(Replication Group)迁移,即复制组的成员变更。
无感知调度流程

1. 初始状态:系统包含一个复制组(RG),该复制组内包含两个连续 Region(Region1、Region2)。
2. 复制组分裂:将 Region2 从原复制组中拆分出来,创建新的复制组专门管理 Region2 的数据。
3. 数据迁移:将新复制组的数据迁移到其他物理节点,通过 Raft 协议完成数据同步与切主。
业务价值
业务:腾讯计费平台发票流水业务,主要为外部用户和腾讯内部系统提供实时交易订单查询及发票开具服务。数据量30T (三副本),单表80+亿行。写入峰值为1w/s;查询平均300 - 400笔/s,数据量增长迅速。
诉求:需要方便、快速进行扩容。
效果:在线水平扩容从月缩短至分钟级,业务无须感知。
弹性扩缩容:分裂
分裂是将单个 Replication Group 拆分成两个,拆分得到的两个 Replication Group 各自管理拆分前的一半数据。
1. 初始状态:3个 TDStore 节点(TDStore1、2、3);新增 TDStore4 节点,分摊系统压力;TDStore1、2、3 上存在数据量大的 RG3。
2. Replication Group 分裂:
Replication Group 分裂时,将一部分 Key Range Region 划分到新 Replication Group 上。
Replication Group 分裂时会构建一个新 Raft Group,但是不会对本地数据做修改。
如下所示,对 RG3 副本执行分裂;将 RG3 上未提交的事务上下文按拆分范围同步迁移至新创建的 RG4 副本,确保所有未提交数据完整迁移,避免事务中断或数据丢失。

3. 分裂得到的两个 Replication Group,将热点分散到多个 Replication Group 上,分别承担分裂前一部分的压力。
分裂流程仅在上层逻辑模块进行复制组拆分,底层 KV 数据未发生物理变动,对系统 IO 的影响较为有限。

弹性扩缩容:迁移
迁移是指将 Raft Group 的某个 follower 副本转移到新节点的过程,核心价值在于:
数据分散:通过迁移 Replication Group,实现数据在不同 TDStore 节点间的均衡分布
读写无感:follower 的创建与销毁不影响 leader 的正常读写操作
MC 下发迁移任务流程如下:
1. 在目标节点为待迁移的复制组创建新副本。
2. Leader 执行 install snapshot 流程,将完整 RG 数据同步至新副本,确保新副本数据达到最新状态

3. 删除待迁移的旧副本,通过"先增后减"策略实现平滑迁移。将 TDStore1、TDStore2、TDStore3 的计算压力均衡分配至 TDStore4,减轻 leader 副本的读写压力,实现集群整体负载的均衡分布。

所有迁移过程对业务无感知。所有增减副本操作仅在 follower 进行,迁移全程对访问 leader 的业务完全透明。
弹性扩缩容:切主
切主是指将 Raft Group 中的 Leader 角色切换到另一个 Raft 副本的过程。核心目的是通过分散 Leader 热点,实现负载均衡。
如下所示, TDStore3 节点同时承担两个 Leader 副本和一个 Follower 副本,读写压力集中,可通过切主将部分 Leader 转移至其他节点(如 TDStore4),从而均衡集群负载。切主执行流程:
1. 将原 Leader(如 TDStore3 上的 RG3)的未完成活跃事务上下文信息提前发送给目标节点(如 TDStore4),确保事务状态无缝迁移。

2. 在事务信息同步完成后,于 Raft 层触发正式的 Leader 切换操作。
由于提前同步了事务信息,切主过程中不会终止任何进行中的事务,保证了业务的连续性。
