如何用好强大的 TDengine 集群 ? 先了解 RAFT 在 3.0 中的应用

news2024/12/23 20:40:58

大家都知道:由于单机数据库在数据规模、并发访问量等方面存在瓶颈,无法满足大规模应用的需求。因此才有了把数据切割分片,分布存储分布处理在多个节点上的数据库,也就是分布式数据库的由来。

而为了实现数据库的高可用,又有了多副本的概念,副本之间的数据需要用特定算法保持一致,从而可以随时切换身份对外提供高可用服务——TDengine 就是一款这样的分布式时序数据库(Time Series Database)。

选择什么样的一致性或者共识算法,可以直接代表一款数据库的产品思路。

一.Why RAFT

在 3.0 之前,结合时序数据的十大特点(《我为何要开发一个专用的物联网大数据平台,还开源它?》),我们针对性地创造了多项时序数据处理专利,使得 TDengine 对大时序数据的处理能力与当时世界上的同类型产品拉开了巨大的性能优势。而在 3.0 ,我们则引入了标准的 RAFT 算法,以更通用标准的实现方式,去适用更广泛的应用场景。

通过 RAFT 算法所保障数据一致的多个节点,被称为一个 RAFT 组(group);这些节点,被称为这个RAFT组的成员(member)节点。

在 RAFT 组中,每个节点都维护了一份连续的日志(Log),用于记录数据写入、变更、或删除等操作的所有指令。日志是由一系列有序的日志条目 (Log Entry) 组成,每个 Log Entry 都有唯一的编号(Index),用于标识日志协商或执行的进度。

此外,每个 RAFT 节点都有自己的角色,它们可以是 Follower(跟随者)、Candidate(候选人)、Leader(领导者)。

 

二. Raft in TDengine

对于 TDengine 来说,一个虚拟节点组(vgroup)就构成了一个 RAFT 组;而这个虚拟节点组的虚拟数据节点(vnode),便是该 RAFT 组的成员节点,我们也称之为副本(全部管理节点(mnode)也构成一个 RAFT 组)。Leader 角色的 vnode/mnode 按照协议机制负责提供读写服务,在容忍故障节点不超过半数的情况下保证集群的高可用性;此外,即使发生了节点重启及 Leader 节点重新选举等事件后,RAFT 也能够始终保证新产生的 Leader 节点可以提供已经写入成功的全部完整数据的读写服务。

对于 TDengine 来说,每一次对数据库的变更请求( 比如 insert into test.d1 values(now,1,2,3) ),都对应一个 RAFT 日志记录(Log Entry)。在持续写入数据的过程中,TDengine 会按照协议机制在每个成员节点上产生完全相同的日志记录,并且以相同的顺序执行数据变更操作,以 WAL 的形式,存储在数据文件目录中。

而每一个 Log Entry 携带的 Index ,就代表此前讲过的数据或数据变更的版本号(从 TDengine 存储引擎的变化探讨——为何大家应尽快切换 3.0 版本?)。

 当一个数据写入请求发出后,必定至少过半数节点上完成写入才会把“写入成功”返回给客户端。这部分涉及 Log entry 的两种重要的状态,committed 和 applied。

对应到 TDengine 中,只有当过半数的节点把该条 SQL 的写入信息追加到文件系统上的 WAL(即图中的步骤 2),并且收到确认消息之后,这条 Log entry 才会被 Leader 认为是安全的。此时该日志进入 committed 状态,并通知 Follower 节点,完成数据的插入(即图中的步骤 4),随后该 Log Entry 便被标记为 applied 的状态。

applied——表示数据变更已经被应用,即该 SQL 执行完毕。

 数据的整体写入流程可以参考官方文档 整体架构 | TDengine 文档 | 涛思数据。如果需要更多了解 RAFT 细节可以参考论文《 In Search of an Understandable Consensus Algorithm 》

三. 注意事项

对于用户而言,数据的同步方式其实是无需感知的,大家只需要关心最终结果即可。但是关于选主流程大家有必要了解一些,因为它涉及到服务的压力负载是否均衡,以及到遇到突发情况后解决问题的思路。

在 RAFT 的标准实现下,每个节点都拥有随机的选举超时时间(election timeout),当任意一个 Follower 超过这个时间没有收到 Leader 发来的心跳后,便会变成 Candidate 并发起申请成为 Leader 的选举请求。

可见,每一个 Vgroup 的选举结果都完全随机的,所以这样会低概率出现很多 Leader Vnode 集中在某一个节点的场景,比如在集群启动时、滚动升级时(企业版)。由于 RAFT 的读写全部只能由 Leader 节点来提供(2.0 版本 TDengine 的 Follower 也可提供查询服务),因此这会导致单个节点的工作压力较大。

为了优化这种特殊情况,企业版 TDengine 提供了一种简便易用的命令,能够使集群的负载再次实现均衡。

balance vgroup Leader;

开源版则可以通过重启服务重新选主刷新选举结果。(相比 2.0 版本,优化后的 3.0 即便是体量很大的集群也可以迅速启停)

此外,由于 RAFT 的选举流程规定只需得到半数以上节点的投票就可以选出 Leader,所以在 3.0 版本,原则上讲,只需要半数以上节点正常便可以提供服务。(2.0 需要节点全部启动才可从无到有选出 Leader ,后续才会按照半数以上的多数派原则提供高可用服务)

 四.常见问题:

问题 1 :“Sync leader is unreachable”(3.0.3.1 版本之前,该错误码为 sync not Leader )

该报错的具体逻辑是:由于 RAFT 要求只有 Leader 才可以提供读写服务,一个请求发现自己访问的 vnode/mnode 不是 Leader 后,会把请求重定向到新的 vnode/mnode 上 。 如果最终还是没有找到Leader 才会返回客户端错误: “Sync leader is unreachable ”,所以本质上这个报错是由于 Leader 不存在导致的。

 问题现象及处理思路:

  1. 数据库/mnode 在没有设置 3 副本的情况下出现故障:这时需要打开debugFlag 143 , 生成高级别日志,通过日志信息判断问题所在,或者检查硬件。
     
  2. 多副本情况无法选出 Leader :同样需要打开debugFlag 143 , 生成高级别日志,通过日志信息判断问题所在,或者检查硬件。
     
  3. 数据库主程序出现bug导致程序无法启动,因此无法选出 Leader :这种情况需要通过微信群或 github 联系官方团队协助处理。

除此之外,但凡在日志中发现 “not leader ” 相关字样的报错信息,都可以按照上述思路排查。

常见问题 2 : Sync leader is restoring。

 该报错的具体逻辑是:假如数据库节点出现了断电,或其他原因导致数据库进程异常中止。这样内存中的数便会被清空,数据库需要把已经写入磁盘的 WAL 数据再次执行,使内存恢复到异常发生之前的状态。(上图红色箭头部分)

这个时候,该 vnode 便处于 restoring 的状态,需要完全恢复后才可以正常提供服务,在恢复完成之前如果访问了这个 vnode 数据就会报错 “Sync leader is restoring”。

通常我们不认为这是一个异常情况,而是数据库的正常恢复行为,此时我们可以观察日志中该条输出的 “items”,直到归 0 即可恢复正常使用,如果恢复较慢,或中途出现其它问题,通过微信群或 github 联系我们官方即可。

 五.结语

RAFT 的引入是 3.0 大规模重构中最大的亮点之一,在保住了 TDengine 的性能优势的前提下,使得 TDengine 能以更标准的方式处理数据的一致性问题。

在存储引擎,一致性协议,查询引擎全部做了大规模重构之后,TDengine 3.0 将会在更广泛的时序数据处理场景中发挥作用,欢迎大家加入我们一起探索可能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/727481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新装Ubuntu虚拟机环境--基本配置流程

新装Ubuntu虚拟机环境--基本配置流程 安装vmware tools修改源 安装vmware tools 点击菜单栏–>虚拟机–>安装VMwaretools桌面上有个图标,点进去 打开这个压缩包–>Extract到桌面(or别的文件夹都可以,如果提示空间不足就换其它文件夹…

手把手写一个LED驱动(1)

目录 1.开启驱动开发之路 1.1、驱动开发的准备工作 1.2、驱动开发的步骤 1.3、实践 2.最简单的模块源码分析 2.1、常用的模块操作命令 2.2、模块的安装 2.3、模块的版本信息vermagic 2.4、模块卸载 2.5、模块中常用宏(MODULE_xxx这种宏的作用是用来添加模块描述信息) …

2023年仪器仪表行业研究报告

第一章 行业概况 仪器仪表行业是指专门从事研究、设计、制造、销售和服务于科学研究、生产和生活中所需的各种仪器、仪表和自动化设备的行业。这些仪器和仪表可以用于测量、指示、记录、调节和控制物理、化学和生物过程中的各种参数。这个行业涵盖了广泛的设备和系统&#xff…

今日分享:Midjourney巧妙地用参考图/垫图来绘画图

大家都知道AI绘画工具每次生成的效果都是随机的,但是现在很多AI绘图工具都提供了利用参考图/垫图的方式出图,这样就可以让让AI画作生成自己想要的布局、场景、色彩等等。 国内的AI绘图工具一般都好操作,国外主流的Midjourney也可以添加参考图…

利用for循环和innerHTML在div中再填入多个div

目录 棋盘给每个小格子加上不同的id加上不同的参数传入 我们设置小格子的点击触发事件 循环填充元素 棋盘 先做棋盘&#xff0c;点击出现 <!DOCTYPE HTML> <html><head><meta charset"utf-8"><style>.sty1{background-color:#aaa;he…

旅游网站制作搭建,为旅行业务带来新机遇

旅游业在全球范围内一直都是蓬勃发展的行业之一。随着互联网的普及以及人们对旅行需求的增加&#xff0c;拥有一个精美而功能强大的旅游网站已经成为了旅行从业者的必备条件。本文旨在简单介绍旅游网站是什么&#xff0c;旅游网站的好处&#xff0c;并提供一些快速制作搭建旅游…

10亿上下文!微软新作,引入LongNet将Transformers上下文长度扩充到10亿

夕小瑶科技说 原创 作者 | python, ZenMogre Transformer处理长序列时较为吃力。因为global attention的存在&#xff0c;模型的时间复杂度是序列长度的2次方级。为了建模更长的上下文&#xff0c;人们也提出了各种稀疏注意力机制。而这次&#xff0c;微软卷到家了&#xff0…

word免费转为pdf怎么转,分享这几个方法给大家!

将Word文档转换为PDF格式是一种常见的需求&#xff0c;因为PDF文件具有广泛的兼容性和安全性。本文将介绍三种免费转换Word为PDF的方法&#xff0c;包括记灵在线工具、使用Word自带功能以及使用Smallpdf。这些方法简单易行&#xff0c;帮助您轻松完成转换&#xff0c;方便与他人…

【尚医通】vue3+ts前端项目开发笔记——项目分析

尚医通开发笔记 一、项目分析 项目在线地址&#xff1a;http://syt.atguigu.cn测试帐号&#xff1a;17720125002 首页 home header 全局组件布局 左&#xff1a;logo 、title中&#xff1a;初始隐藏 搜索框 公共组件显示条件&#xff1a;在页面滚动到页面内搜索框的位置显示…

Go语言中的运算符

Golang 内置的运算符 算术运算符 关系运算符 逻辑运算符 位运算符&#xff08;不常用&#xff09; 赋值运算符 算数运算符 运算符描述相加-相减*相乘/相除%求余 a : 10b : 9fmt.Printf("ab的值为%v\na-b的值为%v\na*b的值为%v\n",ab,a-b,a*b) 除法注意&#xff1a;…

uniapp:粘性布局(吸顶:u-sticky)生效的注意事项

使用场景&#xff1a;要求首次渲染时不需要固定在页面顶部&#xff08;正常布局&#xff09;&#xff0c;当随着页面的滚动&#xff0c;需要将起固定在页面顶部&#xff0c;会使用到可能的有&#xff1a;tab、搜索框、导航、标题、头图…工具&#xff1a;用了uview2的组件<u…

手撕spring04源码(A依赖B)

概述 本章节优化上一章节通过构造方法实例化对象属性填充问题的痛点&#xff0c;并解决A bean依赖B bean的问题 整体设计 知识点补充 spring生命周期 在Spring中&#xff0c;Bean的生命周期包括实例化、初始化和销毁三个阶段。下面是对每个阶段的解释&#xff1a; 实例化…

河南企业级泛域名SSL证书

电脑的普及让网络可以快速发展&#xff0c;紧随网络的发展各个CA认证机构推出了泛域名SSL证书、多域名SSL证书等可以用一张SSL证书保护多个域名网站的SSL数字证书。泛域名SSL证书也叫通配符SSL证书&#xff0c;可以用一张SSL证书保护主域名以及主域名下所有的子域名网站&#x…

NR PDCP(三) data transfer

这篇看下PDCP的data transfer过程&#xff0c;如NR RLC(三) TM and UM mode所述&#xff0c;在UL grant充足的情况下&#xff0c;UM RLC 一直在传输完整的RLC SDU&#xff0c;通过log只能知道UE有在收发data&#xff0c;并不能像LTE似的通过SN去判断UE DL data是否有序接收以及…

平板触控笔要原装的吗?apple pencil的平替笔推荐

如今的电容笔种类越来越多&#xff0c;相信不少人都会在挑选电容笔中踩过坑&#xff0c;例如书写频繁断触&#xff0c;防误触失灵&#xff0c;续航能力欠佳等问题。这样的坑本人也是踩过不少&#xff0c;于是&#xff0c;我决定为大家出一期电容笔详细测评&#xff0c;特意地去…

从程序员的角度看待算法的学习与研究

一&#xff1a;引言 算法的重要性和应用场景&#xff1a; 提高效率&#xff1a;算法可以帮助我们设计和实现高效的解决方案&#xff0c;在有限的资源下&#xff0c;提高计算机程序或系统的执行速度和效率。解决复杂问题&#xff1a;算法可以提供有效的解决方案来解决各种复杂问…

有PMP证书了再考CSPM有必要吗?

先说答案&#xff1a;有必要 首先介绍一下什么是CSPM cspm中文名字是项目管理专业人员能力等级评价&#xff0c;是由中国标准化协会&#xff08;CAS&#xff09;组织开展的&#xff0c;它符合国务院发布的《国家标准化发展纲要》&#xff0c;纲要中明确提出要构建多层次从业人…

【mysql】mysql登录密码忘记重置方法,解决password针对mysql8.0及以上版本失效问题

问题场景&#xff1a; 提示&#xff1a;mysql密码忘记 本人场景&#xff1a;mysql装了很久&#xff0c;一段时间未使用&#xff0c;再次打开发现登录不了了&#xff0c;于是想修改密码。 解决方案&#xff1a; 1、找到自己安装mysql的文件夹。删掉其中的data文件夹&#xff…

Python反爬取访问验证处理

最近爬取数据的时候&#xff0c;遇到反爬取限制&#xff1a;即当访问一定次数后会弹出访问验证如下图所示&#xff1a; 这种验证方式没找到绕过去的方法&#xff0c;那就只能用最笨的办法&#xff0c;弹出验证框后&#xff0c;将等待时间延长&#xff0c;然后手动点击验证。代码…

数据结构--线索二叉树的概念

数据结构–线索二叉树的概念 二叉树的中序遍历序列 void InOrder(BiTree T) {if (T ! NULL){InOrder(T->lchild); //递归遍历左子树visit(T); //访问根结点InOrder(T->rchild); //递归遍历右子树} }中序遍历序列:D G B E A F C ①如何找到指定结点p在中序遍历序列中的前…