集群从“能用“到“高可用“:副本、选主与故障切换到底怎么配

很多用户搭 TDengine 集群时,第一步就卡在"副本数该设多少""某台机器挂了数据会不会丢""切换是自动的还是要我手动操作"。这篇文章把这几个问题讲清楚,结论都对照了源码中的实现逻辑。

副本数只能设 1、2 或 3,不是随便一个数字

创建数据库时的 REPLICA 参数(有效范围 1~3)决定了这个库的每个 vgroup 有几份数据副本。这里有几个容易被忽略的约束,都是在服务端强制校验的:

  • REPLICA 2 是一种特殊模式,必须同时配置仲裁节点(arbitrator),不能单独使用------这和很多人以为的"2 副本就是普通双机热备"不一样。
  • REPLICA 大于 1 时,WAL_LEVEL 必须至少为 1(不能设成 0),否则副本之间就没有可靠的数据来源做同步。
  • 集群里可用的 dnode(数据节点)数量必须不少于你设置的副本数,否则建库会直接报错。

建议: 生产环境如果要做高可用,直接用 REPLICA 3(需要至少 3 台 dnode),避免用 REPLICA 2 这种依赖仲裁节点的过渡形态,除非你清楚它的运维方式。

每个 vgroup 都是一个独立的"小集群",自己选主

TDengine 的多副本一致性是基于类似 Raft 的共识机制实现的(内部称为 sync 模块)。关键点是:这个选主机制不是全局一份,而是每个 vgroup 各自独立运行一套------每个 vgroup 有自己的 leader 副本和若干 follower 副本,写入只能落到 leader 上,再同步给 follower。

好处是故障影响范围是局部的:一个 vgroup 的 leader 出问题,不会影响其他 vgroup 的读写,只有这一个 vgroup 会经历短暂的重新选主过程。

mnode(管理节点)用的是同一套机制,但节点数上限是 3

集群的元数据管理节点(mnode)本质上也是跑在这套共识引擎之上的,只是它管理的是"元数据"这个特殊的逻辑分组。有一个明确的硬限制:一个集群最多只能有 3 个 mnode,超过会被服务端直接拒绝。生产环境建议部署 1 个(测试/单机场景)或 3 个(需要元数据高可用的场景), 另外企业版也支持 2 副本,最少只需要两台服务器即可形成一个集群,减少服务器数量。

节点挂了之后,切换是自动的,但前提是有副本

当某个 vgroup(或 mnode 所在分组)的 leader 副本因为宕机等原因停止响应,其他副本会在检测到心跳超时后自动发起重新选主,选出新的 leader 继续提供服务------这个过程是自动完成的,不需要人工介入触发切换。

但要注意一个边界情况:如果你的库是 REPLICA 1(单副本),这个 vgroup 就没有其他副本可以顶上,对应的 dnode 挂了之后,这部分数据在该节点恢复之前就是不可用的,谈不上"自动切换"------因为压根没有可切换的对象。

这也是为什么高可用不是"部署了集群就自动获得"的能力,而是取决于你在建库时选的副本数。 如果业务对可用性要求高,该用 REPLICA 3;如果只是想水平扩展写入/存储容量、能接受单点故障带来的短暂数据不可用,REPLICA 1 也是合理选择,但要清楚这个取舍。

小结

规划 TDengine 集群高可用时,记住三件事:副本数决定了故障时有没有"备胎"可以顶上;每个 vgroup 独立选主,故障是局部的不是全局的;mnode 最多 3 个,规划集群规模时不要超配。选主和切换的机制是自动的,用户唯一需要主动决策的是副本数这个入口参数。

相关推荐
其实防守也摸鱼4 分钟前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全
.Bryce.19 分钟前
从强化学习到Agentic RL:让Agent在“干活“中自己变聪明
服务器·网络·agent·rag·agentic rl
一线数智20 分钟前
朱鹰:人的判断力,比算力更重要
大数据·人工智能
吹什么轩32 分钟前
MySQL:数据库基础
数据库·mysql
内存漫游32 分钟前
Undo、Redo 与事务回滚
数据库
FluxDB39 分钟前
用 Rust + GPUI 重做数据库客户端
数据库·mysql
NetInside_44 分钟前
Unknown,不应该是网络分析的终点
网络
码少女44 分钟前
Linux——UDP协议和TCP协议
linux·网络·udp·tcp
优信电子44 分钟前
HC05蓝牙模块主机与从机进行连接通信
单片机·物联网·嵌入式
烬羽44 分钟前
PostgreSQL:AI 时代原生的"隐型"向量数据库 — 用 pgvector 给消息表加上长期记忆
数据库·人工智能·程序员