在大数据和物联网飞速发展的时代,数据量呈爆炸式增长,如何高效地存储、管理和分析这些数据成为了关键问题。TDengine 作为一款高性能、分布式的开源时序数据库,专为物联网、工业互联网、电力、IT 运维等场景设计,能够安全高效地处理海量时序数据,在这些领域中发挥着重要作用。
随着业务规模的不断扩大,对 TDengine 集群的可靠性和稳定性提出了更高的要求。一个高可用的 TDengine 集群可以确保在部分节点出现故障时,整个系统仍然能够正常运行,不会影响数据的读写和业务的连续性。因此,设计和实现 TDengine 集群高可用方案具有至关重要的意义。它不仅可以提高系统的可靠性和稳定性,降低运维成本,还能为企业的业务发展提供有力的支持,保障企业的核心竞争力。
TDengine 是一款开源的高性能时序数据库,专为物联网、工业互联网、电力、IT 运维等场景设计并优化。它具有以下显著特点和优势:
TDengine 的应用场景广泛,涵盖了物联网、工业互联网、能源、金融、车联网等多个领域。在物联网领域,可用于存储和分析各类传感器数据,实现设备状态监测和故障预警;在工业互联网中,能够助力企业进行生产过程监控、质量分析和设备管理;在能源行业,可对电力、石油、天然气等数据进行实时处理和分析,优化能源调度和管理;在金融领域,适用于股票、基金等行情数据的存储和分析,为投资决策提供支持;在车联网中,可处理车辆行驶数据、位置信息等,实现智能交通管理和车辆远程监控。
在 TDengine 集群中,有一些关键术语需要理解:
在理解 TDengine 集群高可用方案之前,先回顾一些分布式与集群的基础概念:
TDengine 通过多副本机制来保证数据的可靠性和系统的高可用性,这种机制涉及 vnode 和 mnode 的多副本设置 。
在 vnode 方面,其副本数与数据库(DB)相关联,一个集群中可存在多个 DB,用户能依据运营需求为每个 DB 配置不同的副本数。例如,创建数据库时可使用 CREATE DATABASE demo replica 3; 这样的语句来指定副本数为 3 。一个 DB 的数据会被切片分配到多个 vnode group 中,vnode group 里的 vnode 数量等于 DB 的副本数,且同一 vnode group 中各 vnode 的数据完全一致。为实现高可用性,vnode group 里的 vnode 会分布在不同的数据节点 dnode 上(实际部署时通常在不同物理机上),只要一个 vnode group 里超过半数的 vnode 处于工作状态,这个 vnode group 就能正常对外提供服务。例如,当一个包含三个 vnode 的 vnode group 中,即使有一个 vnode 所在的 dnode 出现故障,另外两个正常工作的 vnode 仍能保证该 vnode group 继续提供数据服务,确保数据的可用性。
在 mnode 方面,TDengine 集群由 mnode 负责管理,为保证 mnode 的高可用,可配置多个 mnode 副本。在集群启动时通常只有一个 mnode,用户可通过 create mnode 命令来增加新的 mnode,并自主决定哪些 dnode 承担 mnode 的角色。为保证元数据的强一致性,当存在多个 mnode 时,mnode 副本之间通过同步方式进行数据复制 。一个集群中有多个数据节点 dnode,但一个 dnode 至多运行一个 mnode 实例 。在 TDengine 3.0 及以后版本中,由于数据同步采用 RAFT 协议,mnode 的数量通常设置为 1 个或者 3 个。当 mnode 数量为 3 个时,即使有一个 mnode 出现故障,另外两个 mnode 仍能保证集群元数据管理的正常运行,确保集群的稳定性和可靠性。
RAFT 算法是一种分布式一致性算法,旨在解决分布式系统中多个节点如何就某个值(如数据、状态等)达成一致的问题 。它将一致性问题分解为 Leader 选举、日志同步、安全性等子问题,通过心跳机制、日志复制等方式来保证集群中数据的一致性和系统的可用性。在 RAFT 算法中,节点有三种角色:领导者(Leader)、跟随者(Follower)和候选人(Candidate) 。正常情况下,集群中只有一个 Leader,负责接收客户端请求,并向 Follower 同步请求日志,当日志同步到大多数节点上后,告诉 Follower 提交日志;Follower 接受并持久化 Leader 同步的日志,在 Leader 告之日志可以提交之后,提交日志;Candidate 则在 Leader 选举过程中作为临时角色参与竞选。
在 TDengine 集群中,RAFT 算法主要应用在以下几个方面:
TDengine 通过一系列机制来保证数据同步和一致性,不同节点角色在其中发挥着不同的作用。
在数据同步方面,以 vnode group 为例,当有数据写入时,首先由 Leader vnode 接收写入请求,并将数据写入本地的 WAL(Write-Ahead Log),然后将数据变更操作以日志的形式发送给同组的其他 Follower vnode 。Follower vnode 收到日志后,将其写入本地 WAL,并向 Leader vnode 返回确认消息。当 Leader vnode 收到超过半数 Follower vnode 的确认消息后,会将该数据变更应用到本地的状态机(即实际存储数据的地方),并通知 Follower vnode 也进行应用,从而完成数据同步过程。例如,在一个包含三个 vnode 的 vnode group 中,当 Leader vnode 收到数据写入请求后,会先将数据写入本地 WAL,然后将日志发送给另外两个 Follower vnode。这两个 Follower vnode 收到日志后写入本地 WAL,并向 Leader vnode 返回确认消息。当 Leader vnode 收到这两个确认消息后,会将数据变更应用到本地状态机,并通知 Follower vnode 也进行应用,这样就保证了三个 vnode 的数据一致性。
在一致性保障方面,除了通过上述的 RAFT 算法来保证数据在多个副本之间的一致性外,TDengine 还采取了一些其他措施。例如,在元数据管理方面,mnode 之间通过同步方式进行数据复制,保证元数据的强一致性 。同时,TDengine 对数据写入和查询操作进行严格的权限控制和事务管理,确保数据的完整性和一致性。在写入数据时,会对数据的格式、内容等进行校验,只有合法的数据才能被写入;在查询数据时,会根据数据的一致性状态来返回正确的数据结果,避免返回不一致的数据。