CnosDB如何确保多步操作的最终一致性?

背景

在时序数据库中,资源的操作是一个复杂且关键的任务。这些操作通常涉及到多个步骤,每个步骤都可能会失败,导致资源处于不一致的状态。例如,一个用户可能想要在CnosDB集群中删除一个租户,这个操作可能需要删除租户下的各种资源(role、database、member等)。如果在这个过程中的任何一步失败了,那么这个操作可能会导致集群处于不一致的状态,为了解决这个问题,我们设计了一个解决方案。

基于这个目标,我们参考了一些设计比较好的产品。

方案参考:HBase的ProcedureV2 (Pv2) Framework

HBase 中 Procedure 代表一个或一组操作,Procedure 分为了如下状态:

INITIALIZING - Procedure 构造中,未提交执行

RUNNABLE  - Procedure 提交,准备好执行

WAITING - Procedure 等待子 Procedure 完成

WAITING_TIMEOUT - Procedure等待超时或事件中断

ROLLEDBACK - 由于Procedure或子Procedure失败,Procedure会回滚,回滚过程中会清理执行时创建的资源。在失败或者重启场景下,回滚会发生多次,因此回滚步骤要保证幂等性

SUCCESS - Procedure成功完成,无失败

FAILED - Procedure至少执行了一次且失败,已经或尚未回滚,任何处于失败状态的Procedure都将会切换到回滚状态

通过对Procedure的各个步骤的清晰切分和记录,实现了多步骤执行的原子性和一致性。

最终方案:ResourceManager

基于CnosDB的情况,我们引入了ResourceManager功能。

ResourceManager可以在后台重试失败任务,直到操作成功。这样,即使某个步骤失败了,ResourceManager也可以保证最终的一致性。例如,在上述的删除租户操作中,如果在进行到删除database的步骤失败了,那么我们可以创建一个异步任务来重试这个步骤及后续步骤。这个异步任务会在后台运行,并且会不断重试,直到成功。通过这种方式,我们可以确保即使在面对失败时,我们的系统也能保持一致性。

ResourceManager也支持延迟任务,可以对任务预设一个执行时间,当到达时间时,会执行任务,如果失败,也会进行重试。

总的来说,ResourceManager提供了一种强大而灵活的方式来处理时序数据库中的多步骤任务操作,并确保系统的最终一致性。

任务状态划分

根据任务的情况,会被分为不同的状态:

Schedule - 任务提交到ResourceManager,未执行

Executing - 正在执行该任务

Successed - 任务执行成功

Failed - 任务执行失败,会进行重试

Cancel - 任务未执行,被取消

Fatal - 任务执行过程中发生无法恢复错误,不会进行重试

任务状态查看

为了清楚地知道任务当前的执行情况,提供了系统表resource_status,可以通过如下命令查看:

SELECT * FROM information_schema.resource_status;

表信息如下:

timenameactiontry_countstatuscomment
2023-11-03 05:47:28cnosdb-db1DropDatabase1Successed

time - 任务发生时间

name - 任务名称

action - 任务动作

try_count - 尝试次数

status - 任务当前状态

comment - 任务执行信息

具体场景

场景一

在CnosDB集群中,资源操作请求可能会被下发到任意节点进行处理。

例如,一个请求可能会被下发到名为node1的节点。然而,由于网络延迟、硬件故障或其他一些原因,这个请求可能会失败。当node1节点在处理请求时遇到失败,它不只会简单地返回一个错误,并且还会将这个请求作为失败任务记录到meta中。

在CnosDB集群中,多个节点(例如node1、node2)会定时从meta中读取失败任务。为了防止多个节点重试同一个任务,只有一个节点能够成功地读取这个任务。在我们的假设中,node2节点成功地读取了这个任务。

一旦node2节点获取了这个失败任务,它就会开始循环重试这个任务,直到任务成功为止,并且在重试过程中,会记录执行失败的错误信息。这种设计可以确保即使在面对失败时,我们的系统也能够最终完成所有的请求。

目前支持失败重试的操作:

DropTenant,

DropDatabase,

DropTable,

DropColumn,

AddColumn,

AlterColumn,

RenameTagName,

UpdateTagValue

场景二

在CnosDB集群中,当node1接收到一个延迟任务时,这个任务会被记录到meta中。meta中有一个用于存储任务信息的数据结构,它能够被系统中的所有节点访问和读取。

多个节点(例如node1、node2、node3等)会尝试从meta中读取任务列表。然而,为了保证任务的一致性和正确性,系统设计了一种锁机制,使得在多个节点中,只有一个节点能够成功地读取到任务列表。在这个例子中,我们假设node3是成功读取任务的节点。

当node3成功地从meta中读取到任务列表后,它会开始对任务进行遍历处理。首先,它会检查当前的时间是否已经达到了任务的预定执行时间。如果还没有到达预定的执行时间,node3会跳过该任务;如果已经到达预定的执行时间,node3则会开始执行这个任务。

在执行任务的过程中,node3会采用一种循环执行的策略。也就是说,如果任务在第一次执行时没有成功,node3会再次尝试执行这个任务,直到任务成功为止。此外,为了保证系统的可靠性和可追踪性,在每次执行任务时,node3都会将当前的执行状态和结果记录到系统表中,可以通过查看系统表查看任务的执行状态。

另一种情况是在node3成功读取前,取消延迟任务的请求下发给node2,该请求会被记录到meta,此时该延迟任务到预设时间后也不会被执行。

通过以上的设计和实现,系统能够对延迟任务进行有效和正确的处理,并且能够实时地跟踪和记录任务的执行状态和结果。

目前支持延迟任务的操作:DropTenant、DropDatabase。

CnosDB简介

CnosDB是一款高性能、高易用性的开源分布式时序数据库,现已正式发布及全部开源。

欢迎关注我们的社区网站:https://cn.cnosdb.com

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络传输介质简介

通信网络除了包含通信设备本身之外,还包含连接这些设备的传输介质,如同轴电缆、双绞线和光纤等。不同的传输介质具有不同的特性,这些特性直接影响到通信的诸多方面,如线路编码方式、传输速度和传输距离等。 简单网络 两个终端&am…

直排轮滑教程6

直道滑行摆臂练习 1,下面来学练摆臂技术动作。直道滑行摆臂练习。 2,主要有两点作用,第一点,增加蹬地力量。第二点,协助身体平衡。 3,要想摆好臂,首先肩关节放松,摆的就自然了。肘…

mac传输文件到windows

前言 由于mac系统与windows系统文件格式不同,通过U盘进行文件拷贝时,导致无法拷贝。官方解决方案如下,但是描述的比较模糊。看我的操作步骤即可。 https://support.apple.com/zh-cn/guide/mac-help/mchlp1657/12.0/mac/12.6 前提条件 mac与…

MySQL数据库增删改查

常用的数据类型: int:整数类型,无符号的范围【0,2^32-1】,有符号【-2^31,2^31-1】 float:单精度浮点,4字节64位 double:双精度浮点,8字节64位 char:固定长…

AIGC:大语言模型LLM的幻觉问题

引言 在使用ChatGPT或者其他大模型时,我们经常会遇到模型答非所问、知识错误、甚至自相矛盾的问题。 虽然大语言模型(LLMs)在各种下游任务中展示出了卓越的能力,在多个领域有广泛应用,但存在着幻觉的问题&#xff1a…

Qt designer界面和所有组件功能的详细介绍(全!!!)

PyQt5和Qt designer的详细安装教程:https://blog.csdn.net/qq_43811536/article/details/135185233?spm1001.2014.3001.5501 目录 1. 界面介绍2. Widget Box 常用组件2.1 Layouts(布局)2.2 Spacers(间隔器)2.3 Item V…

web架构师编辑器内容-使用html2canvas获取截图,并处理一些问题

html2canvas-api 为了使用html2canvas完成截图的功能&#xff0c;我们首先先使用一个按钮来测试一下html2canvas的截图功能。 首先在页面上创建一个img标签 <img id"test-image" :style"{ width: 300px}"/>创建一个button按钮&#xff0c;添加点击…

Linux:jumpserver V3的安装与升级(在线离线)(2)

官方文档写的非常详细&#xff0c;我这篇文章时间长了&#xff0c;会随着官方版本更新而落后 JumpServer - 开源堡垒机 - 官网https://www.jumpserver.org/安装和升级在官网也有详细的信息&#xff0c;我写本章是为了记录一下实验 我的系统是centos7.9 在线安装 在确定我们可…

JoySSL诚招SSL证书代理

不久前&#xff0c;阿里云宣布了一个让人稍感唏嘘的消息——它们的一年期免费SSL证书服务将停步&#xff0c;转而提供三个月期限的证书。这一变化&#xff0c;无疑会使得网站开发的公司在维持用户信任和网站安全上多出心思。然而&#xff0c;免费的午餐并没有彻底消失&#xff…

七天搞定java接口自动化测试实战,一文搞定...

前言 无论是自动化测试还是自动化部署&#xff0c;撸码肯定少不了&#xff0c;所以下面的基于java语言的接口自动化测试&#xff0c;要想在业务上实现接口自动化&#xff0c;前提是要有一定的java基础。 如果没有java基础&#xff0c;也没关系。这里小编也为大家提供了一套jav…

Tomcat日志乱码了怎么处理?

【前言】 tomacat日志有三个地方&#xff0c;分别是Output(控制台)、Tomcat Localhost Log(tomcat本地日志)、Tomcat Catalina Log。 启动日志和大部分报错日志、普通日志都在output打印;有些错误日志&#xff0c;在Tomcat Localhost Log。 三个日志显示区&#xff0c;都可能…

数学的雨伞下:理解世界的乐趣

这本书没有一个公式&#xff0c;却讲透了数学的本质&#xff01; 《数学的雨伞下&#xff1a;理解世界的乐趣》。一本足以刷新观念的好书&#xff0c;从超市到对数再到相对论&#xff0c;娓娓道来。对于思维空间也给出了一个更容易理解的角度。 作者&#xff1a;米卡埃尔•洛奈…

【MySQL学习笔记009】事务

一、事务简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 二、事务操作 1、操作1 查看/设置事务提交方式 select a…

深度学习中用来训练的train.py 探究学习2.0( 数据预处理)

数据预处理 下列代码为train.py中常见的一些数据处理方法 train_transform transforms.Compose([transforms.Resize((224, 224)),transforms.RandomVerticalFlip(),# 随机旋转&#xff0c;-45度到45度之间随机选transforms.RandomRotation(45),# 从中心开始裁剪transforms.C…

Python实验:关灯游戏

文章目录 前言一、设计表二、关键代码三、运行结果小地图&#xff0c;容易难度&#xff1a;中地图&#xff0c;中等难度&#xff1a;大地图&#xff0c;困难难度&#xff1a; 四、完整代码链接总结 前言 这是一个Python实验作业&#xff0c;内容如下&#xff1a; 题目要求&am…

游戏软件提示d3dcompiler_43.dll的五个解决方法,亲测靠谱

在使用电脑进行工作&#xff0c;玩游戏的时候&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“D3DCompiler_43.dll丢失”的提示。D3DCompiler_43.dll是一个非常重要的动态链接库文件。它是由DirectX SDK提供的&#xff0c;用于编译和优化DirectX着色器代码的…

CnosDB:深入了解时序数据处理函数

CnosDB 是一个专注于时序数据处理的数据库&#xff0c;旨在解决时序数据存储与分析问题&#xff0c;为用户提供高效的时序数据管理与查询便利。为了实现这一目标&#xff0c;CnosDB 实现了一系列专用函数&#xff0c;快来和CC一起来看看吧&#xff01; CnosDB&#xff1a;深入了…

进程间通信---信号

什么是信号&#xff1f; 】 信号处理流程 信号类型 发送信号的函数 参数sig&#xff1a;代表 信号 接收信号的函数 参数 handle 的处理方式有几种&#xff1f; 实例代码 实例逻辑 图中的等待操作使用&#xff1a;pause&#xff08;&#xff09;函数 代码 在这里插入代码片…

区域摇杆制作

区域摇杆 介绍界面制作脚本总结 介绍 我之前讲过摇杆&#xff0c;那么看到现在游戏做区域摇杆的更多一些&#xff0c;那么我们来剖析一下。说白了区域摇杆就是在之前固定摇杆的基础上增加了一个启动事件&#xff0c;当我们开始拖拽的时候&#xff0c;我们将摇杆现实启动然后位…

uniapp cli开发和HBuilderX开发

uniapp cli开发和HBuilderX开发 前言 uniapp是一个跨平台的开发框架&#xff0c;可以开发出微信小程序、支付宝小程序、百度小程序、头条小程序、H5、App等&#xff0c;开发者只需要写一套代码&#xff0c;就可以发布到各个平台&#xff0c;大大提高了开发效率。 uniapp的开…
最新文章