当前位置: 首页 > news >正文

TDengine 集群高可用方案设计(一)

一、引言

在大数据和物联网飞速发展的时代,数据量呈爆炸式增长,如何高效地存储、管理和分析这些数据成为了关键问题。TDengine 作为一款高性能、分布式的开源时序数据库,专为物联网、工业互联网、电力、IT 运维等场景设计,能够安全高效地处理海量时序数据,在这些领域中发挥着重要作用。

随着业务规模的不断扩大,对 TDengine 集群的可靠性和稳定性提出了更高的要求。一个高可用的 TDengine 集群可以确保在部分节点出现故障时,整个系统仍然能够正常运行,不会影响数据的读写和业务的连续性。因此,设计和实现 TDengine 集群高可用方案具有至关重要的意义。它不仅可以提高系统的可靠性和稳定性,降低运维成本,还能为企业的业务发展提供有力的支持,保障企业的核心竞争力。

二、TDengine 集群基础概念

2.1 TDengine 简介

TDengine 是一款开源的高性能时序数据库,专为物联网、工业互联网、电力、IT 运维等场景设计并优化。它具有以下显著特点和优势:

  • 高性能:通过创新的存储结构引擎,TDengine 在数据写入和查询方面性能卓越,比通用数据库快 10 倍以上 ,单核每秒能处理 2 万次以上的请求。例如,在物联网场景中,大量传感器数据需要实时写入和查询,TDengine 能够轻松应对高并发的写入操作,确保数据的及时存储和快速检索。
  • 分布式架构:采用原生分布式设计,提供水平扩展能力,可通过增加节点来提升数据处理能力。同时,利用多副本机制保证系统的高可用性,当部分节点出现故障时,仍能正常提供服务。以大型工业互联网项目为例,随着设备数量的增加和数据量的增长,可通过添加节点来扩展集群,满足不断增长的业务需求。
  • 支持 SQL:使用标准 SQL 作为数据查询语言,降低了学习成本,方便开发人员进行数据操作。同时,还提供了针对时序数据的 SQL 扩展,能够更高效地处理时序数据的特有分析。
  • 全栈时序数据加工:集数据库、缓存、消息队列、流式计算等功能于一体,应用无需再集成 Kafka、Redis、HBase、Spark 等软件,大大简化了技术架构,降低了开发和维护成本。

TDengine 的应用场景广泛,涵盖了物联网、工业互联网、能源、金融、车联网等多个领域。在物联网领域,可用于存储和分析各类传感器数据,实现设备状态监测和故障预警;在工业互联网中,能够助力企业进行生产过程监控、质量分析和设备管理;在能源行业,可对电力、石油、天然气等数据进行实时处理和分析,优化能源调度和管理;在金融领域,适用于股票、基金等行情数据的存储和分析,为投资决策提供支持;在车联网中,可处理车辆行驶数据、位置信息等,实现智能交通管理和车辆远程监控。

2.2 集群相关术语解析

在 TDengine 集群中,有一些关键术语需要理解:

  • dnode:即数据节点(Data Node),是集群中实际存储数据的节点,负责数据的写入、存储和读取操作 。每个 dnode 都有自己的存储资源和计算资源,多个 dnode 协同工作,共同完成集群的数据存储和处理任务。
  • vnode:虚拟节点(Virtual Node),是 TDengine 为了实现数据的分布式存储和负载均衡而引入的概念。一个 vnode 是一个数据分片,它存储了一部分数据。vnode 可以在不同的 dnode 之间进行迁移和复制,以实现数据的高可用性和负载均衡。
  • vgroup:虚拟节点组(Virtual Node Group),由多个 vnode 组成。vgroup 是数据复制和管理的基本单位,每个 vgroup 中的 vnode 会在不同的 dnode 上进行复制,以保证数据的可靠性。例如,当一个 dnode 出现故障时,其所在 vgroup 中的其他 vnode 可以继续提供数据服务,确保数据的可用性。
  • Mnode:管理节点(Management Node),负责集群的管理和元数据的存储 。Mnode 维护着集群的拓扑结构、节点状态、数据分布等信息,协调各个 dnode 之间的工作,确保集群的正常运行。

2.3 分布式与集群基础概念回顾

在理解 TDengine 集群高可用方案之前,先回顾一些分布式与集群的基础概念:

  • 单点:指系统中只有一个服务器或组件提供服务。单点系统架构简单,但存在严重的单点故障问题,一旦该服务器或组件出现故障,整个系统将无法正常工作。例如,早期的小型网站可能只使用一台服务器来提供服务,若这台服务器硬件故障或软件出错,网站就会无法访问。
  • 主从机制:主从模式下,有一个主服务器(Master)和多个从服务器(Slave)。主服务器负责处理写操作,并将数据同步到从服务器,从服务器主要负责读操作。这种机制实现了数据的备份和读写分离,提高了系统的读性能和数据安全性。但主服务器仍存在单点故障问题,如果主服务器宕机,需要手动或通过一些自动化工具将从服务器提升为主服务器,才能保证系统的正常运行。
  • 集群:由多个服务器组成,这些服务器协同工作,对外呈现为一个整体。集群可以提高系统的性能、可用性和扩展性。例如,大型电商网站会使用服务器集群来应对高并发的访问请求,通过将请求分发到不同的服务器上进行处理,提高系统的处理能力和响应速度。当集群中的某个服务器出现故障时,其他服务器可以接管其工作,确保系统的持续运行。
  • 负载均衡:是一种将负载(工作任务、访问请求)分摊到多个服务器或组件上执行的技术,旨在解决高性能、单点故障(高可用)和扩展性(水平伸缩)问题。常见的负载均衡算法有轮询、随机、最少连接、Hash 等。例如,Nginx 作为常用的负载均衡软件,可以根据配置的算法将客户端的请求分发到后端的多个服务器上,使各个服务器的负载相对均衡,避免单个服务器因负载过高而性能下降。

三、TDengine 集群高可用原理

3.1 多副本机制保障数据可靠性

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 仍能保证集群元数据管理的正常运行,确保集群的稳定性和可靠性。

3.2 RAFT 算法在 TDengine 中的应用

RAFT 算法是一种分布式一致性算法,旨在解决分布式系统中多个节点如何就某个值(如数据、状态等)达成一致的问题 。它将一致性问题分解为 Leader 选举、日志同步、安全性等子问题,通过心跳机制、日志复制等方式来保证集群中数据的一致性和系统的可用性。在 RAFT 算法中,节点有三种角色:领导者(Leader)、跟随者(Follower)和候选人(Candidate) 。正常情况下,集群中只有一个 Leader,负责接收客户端请求,并向 Follower 同步请求日志,当日志同步到大多数节点上后,告诉 Follower 提交日志;Follower 接受并持久化 Leader 同步的日志,在 Leader 告之日志可以提交之后,提交日志;Candidate 则在 Leader 选举过程中作为临时角色参与竞选。

在 TDengine 集群中,RAFT 算法主要应用在以下几个方面:

  • 选主:当集群启动或者 Leader 节点出现故障时,需要进行选主操作。在 TDengine 中,每个 vnode group 构成一个 RAFT 组,组内的 vnode 通过 RAFT 算法的选举机制来选出 Leader vnode。例如,当一个 Follower vnode 在选举超时时间内没有收到 Leader vnode 的心跳时,会变成 Candidate vnode 并发起选举请求,向其他 vnode 发送投票请求。如果它获得了半数以上 vnode 的投票,就可以成为新的 Leader vnode,从而保证集群的正常运行。
  • 数据同步:TDengine 通过 RAFT 算法保证数据在多个副本之间的同步。当有数据写入请求时,Leader vnode 会将数据变更操作记录在日志中,并向其他 Follower vnode 同步该日志。只有当过半数的 Follower vnode 确认收到并写入日志后,Leader vnode 才会将该数据变更应用到自己的状态机,并通知 Follower vnode 也进行应用,从而确保数据在各个副本之间的一致性。例如,在一个包含三个 vnode 的 vnode group 中,当 Leader vnode 收到数据写入请求后,会将相关日志发送给另外两个 Follower vnode,当这两个 Follower vnode 都确认写入日志后,Leader vnode 就可以将数据变更应用到自身,并通知 Follower vnode 完成应用,保证数据的一致性。
  • 日志管理:RAFT 算法中的日志是保证数据一致性的关键。在 TDengine 中,每个 vnode 都维护一份连续的日志,用于记录数据写入、变更或删除等操作的所有指令 。日志由一系列有序的日志条目(Log Entry)组成,每个 Log Entry 都有唯一的编号(Index),用于标识日志协商或执行的进度。通过日志的顺序性和一致性,TDengine 能够在节点故障恢复、数据同步等情况下,保证数据的完整性和一致性。例如,当一个节点出现故障后重新启动,它可以通过日志来恢复到故障前的状态,确保数据的正确性。

3.3 数据同步与一致性保障

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 对数据写入和查询操作进行严格的权限控制和事务管理,确保数据的完整性和一致性。在写入数据时,会对数据的格式、内容等进行校验,只有合法的数据才能被写入;在查询数据时,会根据数据的一致性状态来返回正确的数据结果,避免返回不一致的数据。

相关文章:

  • 零基础学Python——第八章:实战项目(1-3)
  • 黑阈免激活版:智能管理后台,优化手机性能
  • 数据库对象与权限管理-视图与索引管理
  • 广东食品销售初级考试主要考什么
  • 深度解析 Linux 内核中 fork 工作原理与实现机制
  • 如何让 vscode jupyter 访问 terminal 的环境变量?
  • 【数字图像处理】立体视觉基础(1)
  • CONDA:用于 Co-Salient 目标检测的压缩深度关联学习(翻译)
  • TM2SP-Net阅读
  • 一个关于相对速度的假想的故事-4
  • Buffer of Thoughts: Thought-Augmented Reasoningwith Large Language Models
  • 软考-高项,知识点一览十九 配置和变更管理
  • 数据结构:循环双链表的基本操作(不带头结点)C语言
  • Spark与Hadoop之间有什么样的对比和联系
  • vant之 cell+picker+ popup 的踩坑
  • 优化提示词方面可以使用的数学方法理论:信息熵,概率论 ,最优化理论
  • MySQL 启动报错:InnoDB 表空间丢失问题及解决方法
  • C语言高频面试题——嵌入式系统中中断服务程序
  • 监控页面卡顿PerformanceObserver
  • 用Go语言正则,如何爬取数据
  • 科克托是说真话的骗子,而毕加索是一言不发、让大家去猜的人
  • 受折纸艺术启发可移动可变形的新型超材料问世
  • 新华视点丨广西抗旱一线调查
  • 陕西全省公开征集涉企行政执法问题线索,切实减轻企业负担
  • 大理洱源4.8级地震致442户房屋受损,无人员伤亡
  • 特朗普:泽连斯基的言论对和平谈判非常有害