TiDB作为分布式数据库,水平弹性扩展是它核心优势之一,业务从日活10万涨到100万时,很多人第一反应是加节点,但如果不做好数据一致性保障,扩容缩容就会变成“拆东墙补西墙”——比如刚加的节点数据不全,或者缩容时误删了未同步的数据,轻则导致查询结果异常,重则引发业务事故(比如电商超卖、用户资金数据错乱)。下面我们就一步步拆解扩容缩容时的风险规避方法。
一、为什么TiDB弹性扩展会有数据一致性风险?
1.1 典型应用场景
最常见的场景就是业务突发流量:比如大促前扩容,应对瞬间上涨的请求;或者活动结束后缩容,节省服务器成本。但这时候如果操作不当,比如直接删节点、加节点不等待数据同步,就会出问题。比如某电商平台618前扩容TiKV节点,运维直接用命令加了节点,结果新节点没同步到旧节点的订单数据,导致活动时查询订单出现“漏单”,用户投诉量暴增。
1.2 风险的本质是什么?
TiDB是分布式存储,数据会分成多个“分片”(Region)存在不同节点上,每个分片用Raft协议保证一致性。扩容缩容时,相当于调整这些分片的存放位置,要是调整过程中没等分片数据完全同步,或者误删了正在同步的分片,就会导致数据不一致——比如A节点的分片数据,一半同步到新节点,一半没同步,查询时就会出现结果错乱。
二、TiDB扩容缩容时保障数据一致的核心方法
2.1 扩容前先做“数据快照”,稳扎稳打
扩容前不能直接加节点,要先把当前集群的所有数据状态“拍个照”,确保所有分片都处于“同步完成”的稳定状态,再开始扩容。这样就算扩容时出问题,也能回滚到这个快照状态。
2.2 缩容时先“引流再下线”,不能硬删
缩容时,要先把目标节点上的所有分片转移到其他健康节点(也就是“引流”),确认分片全部转移完成后,再下线这个节点,不然直接删节点会导致分片数据丢失。
2.3 扩容后做“一致性验证”,堵死漏洞
扩容完成后,不能直接投用,要验证新节点的数据和旧节点完全一致,没有缺失。比如用TiDB内置工具对比新旧节点的Key值(对应数据),或者查询全量数据的统计值,确认无误后再开放业务流量。
三、TiDB技术栈下的完整实操示例
# TiDB 集群操作示例:扩容TiKV节点并保障数据一致性(适配TiDB 5.x及以上版本)
# 前置准备:已安装TiUP,集群名为test-prod,当前集群正常运行无告警
# -------------------- 步骤1:确认集群健康状态(必做) --------------------
tiup cluster display test-prod --status # 输出所有节点状态,需确认所有节点Status为Up,没有PENDING状态
old_region_count=$(tiup pd-ctl region count) # 记录当前集群分片总数,用于后续验证
# -------------------- 步骤2:生成数据快照,记录当前数据状态 --------------------
tiup pd-ctl store balance --snapshot # 生成当前所有分片的分布快照,用于后续对比
# -------------------- 步骤3:准备扩容配置文件(扩容2个TiKV节点) --------------------
# 创建scale-out.yaml,指定新节点信息,示例如下:
cat << EOF > tikv-scale.yaml
host: 10.20.30.15
port: 20160
status_port: 20180
data_dir: "/tidb-data/tikv-20160"
EOF
# -------------------- 步骤4:执行扩容并等待同步完成 --------------------
# --wait-ready 表示等待新节点数据完全同步后才完成扩容,--timeout设置超时时间(根据数据量调整)
tiup cluster scale-out test-prod tikv-scale.yaml --wait-ready --timeout 600s
# -------------------- 步骤5:扩容后验证数据一致性 --------------------
new_region_count=$(tiup pd-ctl region count)
if [ $new_region_count -eq $old_region_count ]; then
echo "扩容成功,分片数量一致"
# 进一步验证数据完整性:用TiDB客户端查询核心业务表总行数
tiup tidb-client test-prod -u root -p'your_password' -e "SELECT COUNT(*) FROM orders;" > before_count.txt
tiup tidb-client test-prod -u root -p'your_password' -e "SELECT COUNT(*) FROM orders;" > after_count.txt
diff before_count.txt after_count.txt || echo "数据一致,可正常投用"
else
echo "扩容失败,分片数量变化,请检查同步状态"
fi
四、技术优缺点分析
4.1 优点
这套方法完全基于TiDB官方提供的工具,不需要额外开发,操作标准化,不会引入自定义脚本的风险;同时利用TiDB原生的Raft协议和Region管理机制,扩容缩容时的数据同步是自动完成的,保障了一致性;而且验证步骤简单,即使是新手也能跟着操作,降低了运维门槛。
4.2 缺点
如果集群的数据量特别大(比如TB级),生成快照和同步数据的时间会很长,会占用一定的集群资源,可能对业务产生轻微影响;另外,缩容时转移分片需要占用网络带宽,如果带宽不足,分片转移的时间会变长,可能影响其他业务流量。
五、实操注意事项
5.1 扩容缩容时机选对
尽量选业务低峰期(比如凌晨)操作,避开业务高峰,减少对业务的影响;绝对不能在数据同步高峰期操作,比如大促前1小时,这个时候分片同步会占用大量资源。
5.2 避免误删节点
缩容前一定要执行“转移分片”操作,不能直接用删除命令,比如tiup cluster offline之前,必须先确认节点上没有正在处理的分片;另外,不要把TiDB的Leader节点(负责写操作的节点)作为缩容目标,一定要先把Leader转到其他节点。
5.3 提前备份数据
哪怕做了所有的一致性保障,也要提前备份集群数据,比如用tiup backup工具全量备份,万一扩容时出问题,能快速回滚,减少业务损失。
5.4 监控集群状态
操作全程要监控TiDB的监控面板(Prometheus+Grafana),看节点的CPU、内存、磁盘IO、网络带宽的使用情况,要是某个指标超过阈值,就暂停操作,排查问题后再继续。
六、总结
TiDB的水平弹性扩展不是简单的“加机器”,而是要关注数据在节点间的流转过程,核心是确保每一步操作都等数据完全同步再往下走,这样才能避免数据一致性风险。这套方法适用于绝大多数TiDB集群的扩容缩容场景,从准备到验证的每一步都很关键,新手照着做就能规避大部分坑。记住,扩容缩容的“慢”是为了业务的“稳”,不要贪图速度跳过关键步骤,不然引发的业务事故会带来更大的损失。
评论
围绕“TiDB水平弹性扩展的风险规避:节点扩容缩容过程中数据一致性保障方法”参与讨论