
TDengine 高可用方案完全指南三副本、双副本与双活架构详解【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengineTDengine 作为分布式时序数据库内置了完整的高可用体系。本文基于官方运维文档系统讲解 TDengine 提供的三种高可用方案——基于 Raft 协议的标准三副本方案、基于 Raft 改造的双副本方案以及面向双机环境的 WAL 数据同步双活方案。读完本文你将掌握三种方案的选型依据、集群搭建步骤、运维 SQL 命令、故障场景应对策略以及 taosX 双活数据同步任务的一整套命令行操作。三种高可用方案概览TDengine 默认的高可用方案为基于 Raft 协议的标准三副本方案为适应不同场景提供基于 Raft 改造的双副本方案为满足传统双机主备架构提供基于 WAL 数据同步的双活方案。三副本方案01-replica3.md时序数据副本数为 3可用性最高成本也最高。双副本方案02-replica2.md时序数据副本数为 2节点数至少为 3含仲裁在显著降低成本的同时保持较高可用性与一致性。双活方案03-dual.md可仅部署两个节点可用性较好数据为最终一致性。三种方案的特点对比如下表#三副本双副本双活集群数目部署一个集群部署一个集群部署两个不同集群最小节点数三个数据节点两个数据节点一个仲裁节点两个数据节点选主原理Raft 协议管理节点仲裁选主无需选主同步原理Raft 协议Raft 协议通过 taosX 进行数据同步同步延迟无延迟无延迟依赖于 taosX 的同步速度秒级延迟数据安全性无数据丢失无数据丢失依赖于 WAL 的保存时长数据一致性Raft 一致性Raft 一致性最终一致性高可用性任一节点宕机不影响服务任一节点宕机不影响服务但不能处理连续宕机场景一个实例存活即可提供服务从表中可以看出三副本与双副本均为单集群内多副本架构通过 Raft 协议保证强一致性与无延迟同步双活则是双集群架构借助 taosX 工具跨集群复制数据牺牲一部分一致性与实时性换取仅需两台服务器的部署自由度。三副本方案工作原理基于 Raft 协议的多副本三副本方案采用 Raft 算法来实现数据的一致性包括元数据和时序数据。一个虚拟节点组VGroup构成一个 Raft 组VGroup 中的虚拟节点Vnode便是该 Raft 组的成员节点也称之为副本。其核心机制如下每个 Vnode 都有自己的角色可以是 Leader领导者、Follower跟随者、Candidate候选人。每个 Vnode 都维护一份连续的日志用于记录数据写入、变更或删除等操作的所有指令。日志由一系列有序的日志条目组成每条日志都有唯一的编号用于标识日志协商或执行的进度。Leader 角色的 Vnode 提供读写服务在故障节点不超过半数的情况下保证集群的高可用性。此外即使发生了节点重启及 Leader 重新选举等事件Raft 协议也能够始终保证新产生的 Leader 可以提供已经写入成功的全部完整数据的读写服务。每一次对数据库的变更请求比如数据写入都对应一条日志。在持续写入数据的过程中会按照协议机制在每个成员节点上产生完全相同的日志记录并且以相同的顺序执行数据变更操作以 WAL 文件的形式存储在数据文件目录中。只有当过半数的节点把该条日志追加到 WAL 文件并且收到确认消息之后这条日志才会被 Leader 认为是安全的此时该日志进入 committed 状态完成数据的插入随后该日志被标记为 applied 状态。多副本工作原理可进一步参考 数据写入与复制流程对应文件 docs/zh/15-internals/01-arch.md。数据写入与复制流程结合 docs/zh/15-internals/01-arch.md 中对数据写入与复制流程的描述可以更深入地理解三副本方案的落地机制在一个具有 N 个副本的数据库中相应的 VGroup 将包含 N 个编号相同的 Vnode其中只有一个被指定为 Leader其余充当 Follower。当应用程序尝试将新记录写入集群时只有 Leader Vnode 能够接受写入请求如果 Follower Vnode 意外收到写入请求集群会立即通知 taosc 重新定向到 Leader Vnode确保所有写入都发生在正确的节点上。Leader Vnode 写入流程见 docs/zh/15-internals/01-arch.mdLeader 收到写入请求并验证有效后先将原始数据包写入 WAL若wal_level为 2 且wal_fsync_period为 0则立即落盘随后将带版本号的数据包转发给同组的 Follower Vnodes写入内存并更新 skip list未达成一致会触发回滚最后向应用返回确认。任一步骤失败都会直接返回错误。同步复制见 docs/zh/15-internals/01-arch.mdLeader 需要等待超过半数的副本包括自身达成一致后才会向应用确认写入成功同时引入流水线复制算法让不同连接的写入确认过程并行进行在保证一致性的前提下显著提升写入吞吐。主从选择见 docs/zh/15-internals/01-arch.md每个 Vnode 维护数据的版本号并在持久化时一并保存Vnode 启动时角色未定需与同组节点建立 TCP 连接并交换版本号、任期等信息再通过标准 Raft 一致性算法完成选主。集群配置三副本要求集群至少配置三个服务器节点基本部署与配置步骤如下确定服务器节点数量、主机名或域名配置好所有节点的域名解析DNS 或/etc/hosts。各节点分别安装 TDengine 服务端安装包按需编辑好各节点taos.cfg。启动各节点taosd服务其他服务可按需启动taosAdapter / taosX / taosKeeper / taosExplorer。运维命令创建集群——创建三节点的集群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 database dbname replica 3 vgroups xx buffer xx ...修改数据库副本数——创建了单副本数据库后如果希望改为三副本可通过 alter 命令实现反之亦然alter database dbname replica 3|1常见问题1. 创建三副本数据库或修改为三副本时报错DB error: Out of dnodes原因服务器节点数少于三个。解决方案增加服务器节点数量满足最低要求。2. 创建三副本数据库或 split vgroup 时报错DB error: Vnodes exhausted原因某些服务器节点可用 Vnodes 数少于建库或 split vgroup 的需求数。解决方案调整服务器 CPU 数量、SupportVnodes配置参数满足建库要求。双副本方案部分用户期望在保证一定可靠性、可用性条件下尽可能压缩部署成本。为此TDengine 提出基于 Arbitrator 的双副本方案可提供集群中只有单个服务故障且不出现连续故障的容错能力。双副本方案是 TDengine TSDB Enterprise 特有功能在 3.3.0.0 版本中第一次发布建议使用最新版本。工作原理Mnode 仲裁 AssignedLeader双副本选主由高可用的 Mnode 提供仲裁服务不由 Raft 组内决定Arbitrator仲裁服务不存储数据。VGroup 因某一 Vnode 故障而无法提供服务时Arbitrator 可根据数据同步情况指定 VGroup 内另一 Vnode 成为 Assigned Leader。AssignedLeader被强制设置为 Leader 的 Vnode无论其他副本 Vnode 是否存活均可一直响应用户请求。从源码看仲裁选主逻辑由管理节点Mnode侧的模块实现涉及SArbAssignedLeader结构体记录assignedDnodeId、token 等见 mndDef.h以及SArbGroup中保存的assignedLeader字段mndArbGroup.csource/dnode/mnode/impl/src/mndArbGroup.c负责在 VGroup 故障时通过mndSendArbSetAssignedLeaderReq向相应 Vnode 下发设置 AssignedLeader 的请求同时配合消息序列化结构SVArbSetAssignedLeaderReqtmsg.c完成跨节点通信。由此可以推断双副本的选主并不依赖 VGroup 内部的 Raft 多数派投票而是由 Mnode 这一外部仲裁者根据数据同步状态直接指派。集群配置双副本要求集群至少配置三个节点基本部署与配置步骤如下确定服务器节点数量、主机名或域名配置好所有节点的域名解析DNS 或/etc/hosts。各节点分别安装 TDengine企业版服务端安装包按需编辑好各节点taos.cfg。可选择其中一个节点仅提供仲裁服务部署 Mnode将SupportVnodes参数设置为 0表示不存储时序数据该节点占用资源较少仅需 1~2 核且可与其他应用共用。启动各节点taosd服务其他服务可按需启动taosAdapter / taosX / taosKeeper / taosExplorer。关于supportVnodes参数可从配置实现确认该参数在 tglobal.c 中以cfgAddInt32(pCfg, supportVnodes, tsNumOfSupportVnodes, 0, 1024, ...)注册取值区间为 0~1024默认值为CPU 核数 * 2 5见 tglobal.c。将其设置为 0 即表示该 dnode 不承载任何时序数据 Vnode仅扮演仲裁角色。约束条件最小配置的服务器节点数为 21 个其中两个数据节点一个仲裁节点。双副本为数据库建库参数不同数据库可按需选择副本数。支持 TDengine 集群的完整特性包括读缓存、数据订阅、流式计算等。支持 TDengine 所有语言连接器以及连接方式。支持单副本与双副本之间切换前提是节点数量满足需求、各节点可用 Vnode 数量/内存/存储空间足够。不支持双副本与三副本之间的切换。不支持双副本切换为双活除非另外部署一套实例与当前实例组成双活方案。运维命令创建集群——创建三节点的集群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 database dbname replica 2 vgroups xx buffer xx ...修改数据库副本数——创建了单副本数据库后希望改为双副本时可通过 alter 命令实现反之亦然alter database dbname replica 2|1查看 Vgroups 的状态——通过以下 SQL 命令查看双副本数据库中各 vgroup 的状态show arbgroups; select * from information_schema.ins_arbgroups;输出示例db_name | vgroup_id | v1_dnode | v2_dnode | is_sync | assigned_dnode | assigned_token | db | 2 | 2 | 3 | 0 | NULL | NULL | db | 3 | 1 | 2 | 0 | 1 | d1#g3#1714119404630#663 | db | 4 | 1 | 3 | 1 | NULL | NULL |各字段含义is_sync有以下两种取值0vgroup 数据未达成同步。在此状态下如果 vgroup 中的某一 vnode 不可访问另一个 vnode 无法被指定为AssignedLeaderrole该 vgroup 将无法提供服务。1vgroup 数据达成同步。在此状态下如果 vgroup 中的某一 vnode 不可访问另一个 vnode 可以被指定为AssignedLeaderrole该 vgroup 可以继续提供服务。assigned_dnode标识被指定为 AssignedLeader 的 vnode 的 DnodeId未指定 AssignedLeader 时该列显示 NULL。assigned_token标识被指定为 AssignedLeader 的 vnode 的 Token未指定 AssignedLeader 时该列显示 NULL。最佳实践1. 全新部署双副本的主要价值在于节省存储成本的同时能够有一定的高可用和高可靠能力。在实践中推荐配置为N 节点集群其中 N3其中 N-1 个 dnode 负责存储时序数据第 N 个 dnode 不参与时序数据的存储和读取即其上不保存副本可以通过supportVnodes这个参数为 0 来实现这个目标不存储数据副本的 dnode 对 CPU/Memory 资源的占用也较低可以使用较低配置服务器2. 从单副本升级假定已经有一个单副本集群其结点数为 NN1欲将其升级为双副本集群升级后需要保证 N3且新加入的某个节点的supportVnodes参数配置为 0。在集群升级完成后使用alter database replica 2的命令修改某个特定数据库的副本数。异常情况处理异常场景集群状态没有 Vnode 发生故障Arbitrator 故障Mnode 宕机节点超过一个导致 Mnode 无法选主持续提供服务仅一个 Vnode 故障VGroup 已经达成同步后某一个 Vnode 才发生故障的持续提供服务仅一个 Vnode 故障2 个 Vnode 同时故障故障前 VGroup 达成同步但是只有一个 Vnode 从故障中恢复服务另一个 Vnode 服务故障通过下面的命令强制指定 leader继续提供服务仅一个 Vnode 故障离线 Vnode 启动后VGroup 未达成同步前另一个 Vnode 服务故障的无法提供服务两个 Vnode 都发生故障无法提供服务对应强制指定 Leader 的 SQL 命令ASSIGN LEADER FORCE;从源码看ASSIGN LEADER FORCE命令会进入 Mnode 的仲裁组处理逻辑当已存在的 AssignedLeader 尚未确认assignAcked false或需要强制覆盖时会以forcetrue调用mndSendArbSetAssignedLeaderReq重新下发设置请求见 mndArbGroup.c并在审计记录中登记assignLeader操作mndArbGroup.c。常见问题1. 创建双副本数据库或修改为双副本时报错DB error: Out of dnodes原因数据服务器节点数少于两个。解决方案增加服务器节点数量满足最低要求。2. 创建双副本数据库或 split vgroup 时报错DB error: Vnodes exhausted原因某些服务器节点可用 Vnodes 数少于建库或 split vgroup 的需求数。解决方案调整服务器 CPU 数量、SupportVnodes数量满足建库要求。双活方案部分用户因为部署环境的特殊性只能部署两台服务器同时希望实现一定的服务高可用和数据高可靠。TDengine 双活系统基于数据复制和客户端 Failover两项关键技术实现。双活既可以用于资源受限的两机环境也可用于在两套 TDengine 集群不限资源之间的灾备场景。双活是 TDengine TSDB Enterprise 特有功能在 3.3.0.0 版本中第一次发布建议使用最新版本。目前3.4.x 版本暂不支持双活功能。双活系统的定义是业务系统中有且仅有两台服务器其上分别部署一套服务在业务层看来这两台机器和两套服务是一个完整的系统对其中的细节业务层不需要感知。双活中的两个节点通常被称为 Master-Slave意为主从或主备。架构与关键技术TDengine 双活系统的部署架构中涉及到三个关键点客户端 Failover由 Client Driver 实现对双系统的 Failover即主节点宕机时的主从切换。taosX 数据复制由 taosX 从当前的主节点到从节点实现数据复制。WAL 特殊标记防循环由数据订阅的写接口在写入复制过来的数据时在 WAL 中加入特殊标记由数据订阅的读接口在读取数据时自动过滤掉带有该特殊标记的数据避免重复复制形成 infinite loop。注架构图中仅以一个单机版 TDengine 作为示例但在实际部署中图中的一个 Host 也可以被任意节点数量的 TDengine 集群代替。集群配置双活对 TDengine 集群本身的配置没有任何要求但对要在双活系统之间同步的数据库的WAL 保留时长有一定要求WAL 保留时长越大双活系统的容错率越高。如果备节点宕机时长超过主节点上的 WAL 保留时长必定会导致备节点上有数据缺失如果备节点宕机时长虽未超过主节点上的 WAL 保留时长也有一定概率丢失数据取决于接近的程度以及数据同步的速度。从实现看WAL 保留时长对应建库参数WAL_RETENTION_PERIOD单位为小时该参数贯穿数据库创建、同步的消息编解码流程见 tmsg.c、tmsg.c并通过消息在集群间传递。因此在实际部署双活前应结合备机可能的停机时长合理设置主库的WAL_RETENTION_PERIOD。客户端配置Java 连接器目前只有 Java 连接器在 WebSocket 连接模式下支持双活其配置示例如下url jdbc:TAOS-WS:// host :6041/?userrootpasswordtaosdatavarcharAsStringtrue; Properties properties new Properties(); properties.setProperty(TSDBDriver.PROPERTY_KEY_SLAVE_CLUSTER_HOST, 192.168.1.11); properties.setProperty(TSDBDriver.PROPERTY_KEY_SLAVE_CLUSTER_PORT, 6041); properties.setProperty(TSDBDriver.PROPERTY_KEY_ENABLE_AUTO_RECONNECT, true); properties.setProperty(TSDBDriver.PROPERTY_KEY_RECONNECT_INTERVAL_MS, 2000); properties.setProperty(TSDBDriver.PROPERTY_KEY_RECONNECT_RETRY_COUNT, 3); connection DriverManager.getConnection(url, properties);其中的配置属性及含义如下表属性名含义PROPERTY_KEY_SLAVE_CLUSTER_HOST第二节点的主机名或者 ip默认空PROPERTY_KEY_SLAVE_CLUSTER_PORT第二节点的端口号默认空PROPERTY_KEY_ENABLE_AUTO_RECONNECT是否启用自动重连。仅在使用 WebSocket 连接时生效。true: 启用false: 不启用。默认为 false。双活场景下请设置为 truePROPERTY_KEY_RECONNECT_INTERVAL_MS重连的时间间隔单位毫秒默认 2000 毫秒也就是 2 秒最小值为 0表示立即重试最大值不做限制PROPERTY_KEY_RECONNECT_RETRY_COUNT每节点最多重试次数默认值为 3最小值为 0表示不进行重试最大值不做限制约束条件应用程序不能使用订阅接口如果配置了双活参数会导致创建消费者失败。不建议应用程序使用参数绑定的写入和查询方式如果使用应用需要自己解决连接切换后的相关对象失效问题。在双活场景下不建议用户应用程序显式调用use database应该在连接参数中指定 database。双活的两端集群必须同构即数据库的命名和所有配置参数以及用户名密码和权限设置等完全相同。只支持 WebSocket 连接模式。运维命令taosx replicaTDengine 双活系统提供了一些运维工具能够自动化 taosX 的配置、一键启动、重启和停止单机环境上的所有双活组件。启动双活任务taosx replica start该命令用于启动双活中的数据复制任务其所指定的两台主机上的 taosd 和 taosX 均为在线状态。方法一——指定源端与目标端taosx replica start -f source_endpoint -t sink_endpoint [database...]在本机器所在的 taosx 服务中建立从source_endpoint到sink_endpoint的同步任务。运行该命令成功后将打印 replica ID 到控制台后续记为 id。其中输入参数source_endpoint和sink_endpoint为必须形如td2:6030示例如下taosx replica start -f td1:6030 -t td2:6030该示例命令会自动创建除information_schema、performance_schema、log、audit库之外的同步任务并持续监听新增的数据库当 td1 和 td2 中新增同名数据库时可自动启动新增数据库的数据复制任务。需要说明的是可以使用http://td2:6041指定该 endpoint 使用 websocket 接口默认是原生接口。可以使用--new-database-checking-interval SECONDS指定新增数据库的检查间隔默认为 30 分钟。可以使用--no-new-databases禁用监听行为。也可以指定数据库同步taosx replica start -f td1:6030 -t td2:6030 db1仅创建指定的数据库同步任务。此时相当于配置了--no-new-databases不会开启新增数据库自动同步。方法二——基于已有 replica id 增加数据库taosx replica start -i id [database...]使用上面已经创建的 Replica ID (id) 以在该同步任务中增加其它数据库。注意多次使用该命令不会创建重复任务仅将所指定的数据库增加到相应任务中。replica id 在一个 taosX 实例内是全局唯一的与 source/sink 的组合无关。为便于记忆replica id 为一个随机常用单词系统自动将 source/sink 组合对应到一个词库中取得一个唯一可用单词。查看任务状态taosx replica status [id...]返回当前机器上创建的双活同步任务列表和状态。可以指定一个或多个 replica id 获取其任务列表和状态。输出示例如下-------------------------------------------------------------------------- | replica | task | source | sink | database | status | note | -------------------------------------------------------------------------- | a | 2 | td1:6030 | td2:6030 | opc | running | | | a | 3 | td2:6030 | td2:6030 | test | interrupted | Error reason |停止双活任务taosx replica stop id [db...]该命令作用如下停止指定 Replica ID 下所有或指定数据库的双副本同步任务。使用taosx replica stop id1 db1表示停止 id1 replica 下 db1 的同步任务。--no-new-databases选项启用时不停止新增数据库监听任务仅停止当前同步中的数据库。重启双活任务taosx replica restart id [db...]该命令作用如下重启指定 Replica ID 下所有或指定数据库的双副本同步任务。使用taosx replica start id1 db1仅重启指定数据库 db1 的同步任务。查看同步进度taosx replica diff id [db....]该命令能够输出当前双副本同步任务中订阅的 Offset 与最新 WAL 的差值不代表行数例如-------------------------------------------------------------------------- | replica | database | source | sink | vgroup_id | current | latest | diff | -------------------------------------------------------------------------- | a | opc | td1:6030 | td2:6030 | 2 | 17600 | 17600 | 0 | | a | opc | td2:6030 | td2:6030 | 3 | 17600 | 17600 | 0 |删除双活任务taosx replica remove id [--force]删除当前所有双活同步任务。正常情况下要想删除同步任务需要先 stop 该任务但当--force启用时会强制停止并清除任务。--no-new-databases选项启用时不会删除新增数据库同步任务仅删除当前数据库的同步任务。当 taosx 重启后如果删除的数据库任务对应的数据库仍然存在则会继续创建同步任务不重启 taosx 或者不更新双活监听任务时也不会再新建这些数据库的同步任务。更新双活新增数据库检查间隔taosx replica update id --new-database-checking-interval SECONDS更新双活新增数据库的检查间隔单位为秒。推荐使用步骤假定在机器 A 上运行需要首先使用taosx replica start来配置 taosX其输入参数是待同步的源端和目标端服务器地址在完成配置后会自动启动同步服务和任务。此处假定 taosx 服务使用标准端口同步任务使用原生连接。在机器 B 上的步骤相同。在完成对两台机器的服务启动后双活系统即可提供服务。在已经完成配置后如果想要再次启动双活系统请使用 restart 子命令。双活异常情况如果宕机恢复时间超出了 WAL 的保存时长可能会出现丢数据的情况。此时双活系统中自带的 taosX 服务的自动数据同步无法处理。需要人工判断出哪些数据丢失然后启动额外的 taosX 任务来复制丢失的数据。方案选型建议结合三种方案的特性可以给出如下选型建议追求最高可用性与零数据丢失、节点资源充足选择三副本方案任一节点宕机不影响服务Raft 强一致、无同步延迟。成本敏感但要求高可用与强一致选择双副本方案企业版以 21 的最小节点配置获得单故障不影响服务的能力并通过supportVnodes 0让仲裁节点占用极低资源。环境受限只有两台服务器、或需要跨集群灾备选择双活方案企业版当前 3.4.x 暂不支持通过 Java 连接器 WebSocket 模式的自动重连实现 Failover配合taosx replica系列命令管理数据同步并务必根据备机停机时长配置好主库的 WAL 保留时长。需要特别留意的是双副本支持与单副本互切、但不支持与三副本互切双活两端集群必须完全同构且仅支持 WebSocket 连接。在实际生产环境中建议先在测试集群中验证故障切换流程再应用到生产环境。延伸阅读三副本方案文档docs/zh/12-operations-and-tooling/02-operations/11-ha/01-replica3.md双副本方案文档docs/zh/12-operations-and-tooling/02-operations/11-ha/02-replica2.md双活方案文档docs/zh/12-operations-and-tooling/02-operations/11-ha/03-dual.md架构总览与数据写入复制流程docs/zh/15-internals/01-arch.md双副本仲裁选主实现source/dnode/mnode/impl/src/mndArbGroup.csupportVnodes参数定义source/common/src/tglobal.c【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考