
TDengine 三副本高可用方案RAFT 一致性原理、集群部署与运维命令详解【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengineTDengine 三副本方案基于 RAFT 一致性算法将元数据与时序数据一并纳入多副本保护使集群在不超过半数节点故障时仍能持续提供读写服务。本文以三副本方案的部署与运维为主线完整覆盖集群配置、创建/修改副本的 SQL 命令、Out of dnodes与Vnodes exhausted等常见报错的成因与解决方案并结合 Mnode 副本分配源码剖析建库时的资源调度逻辑。读完本文你将能够独立完成一套 TDengine 三副本高可用集群的搭建并理解副本数据一致性的底层机制。一、三副本的一致性模型基于 RAFT 的 VGroupTDengine 的三副本方案采用 RAFT 算法来实现数据的一致性覆盖元数据和时序数据两部分。核心组织单元是虚拟节点组VGroup一个 VGroup 构成一个 RAFT 组VGroup 中的虚拟节点Vnode即该 RAFT 组的成员节点也称作副本。三副本数据库即意味着每个 VGroup 包含 3 个编号相同的 Vnode分属 3 个不同的物理节点Dnode。从官方文档与源码结构看该一致性模型包含以下要点角色划分每个 Vnode 都有自己的角色可以是 Leader领导者、Follower跟随者、Candidate候选人。Vnode 启动时角色不确定通过组内节点交换版本号、任期等信息完成选主详见 架构文档中的主从选择说明。连续日志每个 Vnode 都维护一份连续的日志记录数据写入、变更或删除等全部操作指令。日志由一系列有序日志条目组成每条日志都有唯一编号用于标识日志协商或执行的进度。高可用边界Leader 角色的 Vnode 提供读写服务在故障节点不超过半数三副本中即允许 1 个节点故障的情况下保证集群高可用。即使发生节点重启及 Leader 重新选举RAFT 协议也能保证新选出的 Leader 可以提供已经写入成功的全部完整数据的读写服务。日志同步每一次对数据库的变更请求比如数据写入都对应一条日志。持续写入过程中各成员节点上会按协议机制产生完全相同的日志记录并以相同顺序执行数据变更操作日志以 WAL 文件形式存储在数据文件目录中。提交确认只有当过半数节点把该条日志追加到 WAL 文件、并且收到确认消息之后Leader 才认为这条日志是安全的此时日志进入 committed 状态完成数据插入随后被标记为 applied 状态。完整的写入与复制流程包括 Leader/Follower 写入路径、同步复制、流水线复制、learner 角色与写请求重定向可参见 数据写入与复制流程。其中与三副本运维最相关的两点是重定向机制写入请求只有 Leader Vnode 接受客户端 taosc 维护节点组拓扑缓存被 follower 拒绝时会自动重定向到 leader应用层无需关心重试成员变更调整 VGroup 副本数如单副本改三副本时TDengine 扩展了 RAFT 引入 learner 角色——learner 只接收数据复制、不参与投票数据差距大时先做快照同步追上后再转为 follower 参与投票。这正是alter database ... replica能在集群运行中无缝调整副本的底层机制。二、集群配置三副本的最低部署要求三副本要求集群至少配置三个服务器节点基本部署与配置步骤如下确定服务器节点数量、主机名或域名配置好所有节点的域名解析DNS 或/etc/hosts各节点分别安装 TDengine 服务端安装包按需编辑好各节点taos.cfg启动各节点taosd服务其他服务可按需启动taosAdapter / taosX / taosKeeper / taosExplorer。其中在taos.cfg层面值得特别关注的是supportVnodes参数——它决定了单个 Dnode 可承载的 Vnode 上限直接影响“三副本能否建库成功”。从源码看该参数在服务端全局配置中定义tglobal.c#L62 声明了tsNumOfSupportVnodes启动时按CPU 核数 × 2 5计算默认值且最小为 2tglobal.c#L1011-L1012tglobal.c#L1061 将其注册为服务端可配置项取值范围为 01024各 Dnode 会在状态上报中携带该值dmHandle.c#L268Mnode 据此维护每个 Dnode 的numOfSupportVnodesmndDnode.c#L1312作为后续副本分配的依据。也就是说一个 4 核服务器默认支持 13 个 Vnode。如果建库所需的 VGroup 数vgroups参数乘以副本数超过了各节点可用 Vnode 余量就会触发下文“Vnodes exhausted”报错可通过调大supportVnodes或增加 CPU 核数来解决。三、运维命令创建集群、建库与调整副本数1. 创建集群首先将三台服务器节点注册进集群dnode_ep为节点地址dnode_port为通信端口默认 6030CREATE dnode dnode_ep port dnode_port; CREATE dnode dnode_ep port dnode_port; CREATE dnode dnode_ep port dnode_port;然后创建三副本的 Mnode集群元数据管理节点保证 Mnode 自身高可用CREATE mnode on dnode dnode_id; CREATE mnode on dnode dnode_id; CREATE mnode on dnode dnode_id;2. 数据库创建创建三副本数据库时通过replica参数指定副本数并可同时指定vgroups虚拟节点组数与buffer单 Vnode 内存等参数create database dbname replica 3 vgroups xx buffer xx ...3. 修改数据库副本数单副本数据库可升级为三副本反之亦然使用alter命令在线完成底层走上文提到的 learner 成员变更流程不停写alter database dbname replica 3|1四、源码剖析Mnode 如何为三副本分配 Vnode建库时 Mnode 需要为每个 VGroup 挑选replica个不同的 Dnode 来放置副本。核心分配逻辑在 mndGetAvailableDnode()mndVgroup.c其步骤如下打分排序按 Dnode 负载得分对候选节点排序得分公式为(已有 Vnode 数 其他节点数 × 0.9) / numOfSupportVnodesmndGetDnodeScore()得分低的节点优先被选中实现副本的均衡分布节点数检查若在线 Dnode 总数少于replica返回TSDB_CODE_MND_NO_ENOUGH_DNODES对应报错Out of dnodesmndVgroup.c#L1050-L1053Vnode 容量检查若目标 Dnode 已有 Vnode 数达到numOfSupportVnodes上限返回TSDB_CODE_MND_NO_ENOUGH_VNODES对应报错Vnodes exhaustedmndVgroup.c#L1062-L1064内存检查扣除本 VGroup 所需内存后若 Dnode 可用内存不足返回TSDB_CODE_MND_NO_ENOUGH_MEM_IN_DNODEmndVgroup.c#L1066-L1073初始角色分配完成后单副本 VGroup 的 Vnode 直接标记为 Leader多副本 VGroup 则全部初始为 Follower待 Vnode 启动选主后再确定真正的 LeadermndVgroup.c#L1076-L1080。对应的错误码定义见 terror.c#L249 与 terror.c#L364错误码数值0x80000334/0x800003BA可对照 errorCodeTable.ini 查询。五、常见问题与排查1. 创建三副本数据库或修改为三副本时报错DB error: Out of dnodes服务器节点数不足原因是服务器节点数少于三个。从源码看当在线 Dnode 数量小于目标副本数时分配函数即返回NO_ENOUGH_DNODESmndVgroup.c#L1050-L1053alter database ... replica 3同样受此约束。解决方案增加服务器节点数量满足最低要求三个在线 Dnode。2. 创建三副本数据库或 split vgroup 时报错DB error: Vnodes exhausted服务器可用 Vnodes 不足原因是某些服务器节点可用 Vnodes 数少于建库或 split vgroup 的需求数。源码中的触发条件是numOfVnodes numOfSupportVnodesmndVgroup.c#L1062-L1064其中numOfSupportVnodes即各节点上报的supportVnodes配置值。解决方案调整服务器 CPU 数量、或在taos.cfg中调大supportVnodes配置参数取值范围 01024默认约为 CPU 核数 × 2 5使单节点可承载的 Vnode 数满足建库要求然后重启该节点服务使配置生效。小结TDengine 三副本方案的本质是以 VGroup 为 RAFT 组、以 WAL 日志为一致性载体写入经过半数副本确认committed后方可生效applied从而在允许单节点故障的前提下保证数据完整与可用。运维落地时的关键路径是——部署不少于 3 个节点并完成域名解析与taos.cfg配置重点关注supportVnodes通过CREATE dnode/CREATE mnode搭建集群用create database ... replica 3建库必要时用alter database ... replica 3|1在线调整副本数遇到Out of dnodes应检查在线 Dnode 数遇到Vnodes exhausted应核对各节点的supportVnodes与已有 Vnode 负载。更深入的复制流程、选主与成员变更细节可继续阅读 数据写入与复制流程 及 Mnode 副本分配源码。【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考