KaiwuDB 事务中的 Raft 协议

news2024/11/18 5:37:00

01 Raft 概述

KaiwuDB 的事务是通过使用 Raft 协议来实现数据的一致性。Raft 协议是一种经典的分布式一致性算法,它的主要特征有:

  • 选举唯一的 Leader 处理读写请求并创建新的 Raftlog,其它节点作为 Follower 接收 Leader 同步的
    Raftlog;
  • Leader 无法修改或删除自身的 Raftlog,只能对其进行增加;Follower 可删除和 Leader 有冲突的 Raftlog;
  • Raftlog 严格按照顺序连续增加。即最新的 Raftlog 一定在最后,并且任意个 Raftlog 的序号一定刚好是它先前一个
    Raftlog 的序号(Index)加 1;
  • Raftlog 被同步到超过一半的节点后就被视为已提交(Committed),已提交的 Raftlog 不会丢失。

Raft 主要工作过程:选举和日志提交

  • 选举

选举是 Raft 协议工作的主要过程之一,成功且安全的选举是 Raft 开启工作的前提。在集群刚启动或 Follower 节点发现 Leader 心跳异常时,一轮选举就会被触发。每一轮选举对应一轮任期(Term),若发现当前集群没有 Leader 节点,则该节点即变为 Candidate(候选者),自身缓存的任期+1,为自己投票,而后向其它节点发送 RequestVote RPC 拉取选票。

在这里插入图片描述

RequestVote RPC 中携带候选者的信息,以帮助收到请求的节点决定是否投票,主要信息包括:候选者当前任期,候选者最新 Raftlog 的任期及编号。节点会检查上述信息,并判断是否投票。当出现以下情况时不投票:

  • 候选者的任期不高于自己的任期;

  • 候选者最新的 Raftlog 落后于自己最新的 Raftlog;

  • 在当前任期自己已投过票。

除去上述情况,节点会为候选者投一票,缓存投票信息,并更新自身任期。候选者获取超过一半投票后(包括自己所投一票),则认为已当选为 Leader。之后立即开始向其它节点发送心跳,以防止选举超时出现新一轮选举。其它节点收到心跳后则停止选举,原先是候选者的节点则自动变更为 Follower,所有 Follower 检查自身的任期并和 Leader 对齐,准备接收 Leader 同步的 Raftlog。

  • 日志提交

Leader 选出后需负责处理用户的写请求。每个写请求会被包装成 Raftlog,其中包含请求的命令和数据、当前任期 Term、当前 Raftlog 在所有的 Raftlog 中的位置(即 Index)、前一个 Raftlog 的 Term和 Index(即 revLogTerm 和 prevLogIndex)。通过 AppendEntries RPC 发送给 Follower 节点,Follower 回复消息通知 Leader 是否复制成功。当超过半数的节点(包括 Leader)复制成功后,这条 Raftlog 切换为已提交状态,不会再被修改或丢失。

在这里插入图片描述

Follower 节点收到 AppendEntries RPC 后不是无条件复制 Raftlog,它会检查自身最新 Raftlog 的 Term 和 Index 是否和最新的 Raftlog 中带来的 prevLogTerm 和 prevLogIndex 一致。如果一致则将收到的 Raftlog 追加至本地的 Raftlog,回复 Leader 结果为成功;反之,则回复失败。

如果 prevLogIndex 小于等于 Follower 的最新 Raftlog 的 Index 时,则说明 Leader 和 Follower 出现了数据冲突,需要删除 Follower 上的冲突数据,即 prevLogIndex 对应位置之后所有的 Raftlog。

Follower 回复失败说明 Follower上 的 Raftlog 有一定落后,Leader 会发送更早之前的 Raftlog,以确保 Follower 上 Raftlog 的连续性。在确认 Follower 上最新 Raftlog 的 Index 之后,Leader 再将后面 Follower 上不存在的 Raftlog 依次发送给 Follower,最终完成同步。

AppendEntries RPC 中还会携带当前已经提交的最新 Raftlog 的 Index,Follower 根据它来判断自身是否需要应用(apply)某些 Raftlog,即执行已经提交的 Raftlog 中的命令,将数据落盘。心跳是特殊的 AppendEntries RPC,其中没有 Raftlog,但包含了最新提交的 Index,通过心跳可使 Follower 更及时地落盘数据。

02 KaiwuDB 事务和 Raft

事务中可能包含多个 Request,即多次操作。其中读操作不需要进行 Raft 共识,可直接本地读取并返回结果。写操作则有预写操作,本地先写一份 MVCC 数据,并使用这个数据组装 Raftlog,而后发给 Follower 节点完成共识。

  • 事务并行

KaiwuDB 中使用了 multi-raft,可提高并发程度。所有数据都按照 Range 进行分布,每个 Range 有多个副本,这些副本组成一个 Raft group,使用 Raft 协议实现数据的一致性。

  • 事务流水线

KaiwuDB 事务中优化了 Raft 使用方式。按照 Raft 协议本身的定义,超过半数节点达成共识(复制完 Raftlog)后,方能进行下一步操作。而在 KaiwuDB 的事务中,每个请求不需要等待达成共识即可返回结果,并继续处理下一个请求,实现了共识和请求处理的并行,节省了等待共识花费的时间。等到事务提交时接收一个总的共识结果,最终共识达成意味着整个事务成功。

在这里插入图片描述

该方法本质上实现了 Raft 共识的并行。事务需要保证 A.C.I.D (原子性、一致性、隔离性、持久性)四个性质,在 KaiwuDB 事务中,Raft 协议的共识用来实现 C(一致性),Raftlog 的落盘则用于保证 A(原子性)和 D(持久性),最后的 I(隔离性)则通过下面提到的 WriteIntent 实现。

根据 Raft 协议日志提交策略,每个节点上的 Raftlog 都是按照顺序连续增加的,所以如果事务最终提交的 Raftlog 能够达成共识,那么事务中每次写操作的 Raftlog 必定也达成了共识。因此,只要确认了最终提交时的 Raft 共识,事务的一致性也就得到了保证。

  • 并行提交

KaiwuDB 事务的隔离性通过预写 MVCC 数据等方法得到保证。预写操作会为事务操作的 Key 写入一个 WriteIntent,其中包含了要写入的数据,以及所属的事务信息。其它事务对相同的 Key 执行读写操作时会访问到这个 WriteIntent,进而发现已有事务持有了这个 Key,从而实现隔离性。事务提交时 WriteIntent 会转变为真正的数据并落盘,从而实现持久性,原先的 WriteIntent 则被删除。

因为有了预写数据 WriteIntent,因此事务提交可进一步优化,即事务提交后可以在共识完成之前就返回成功的结果,之后异步执行提交动作,即完成数据的落盘。此时所有的数据都已写入了 Raftlog 并落盘,实际数据不会丢失,只要依次解析 WriteIntent 完成真正数据的写入即可。

在这里插入图片描述

KaiwuDB 事务的状态包括 Pending(进行中),Staging(提交中),Commit(已提交),Abort(已回滚)。其中,KaiwuDB 引入了新的事务状态 Staging,用于描述事务开始提交到完成数据的实际落盘之间的状态。事务的状态会随事务信息落盘,保证宕机重启后可以根据事务的实际状态选择要执行的操作。若重启后事务的状态是 Pending,则需要回滚,释放 WriteIntent;若事务状态是 Staging,则需要完成 WriteIntent 的解析和数据写入,最终达到 Commit 状态;若事务状态是 Commit 或 Abort,则不需要进行操作。引入 Staging 细化提交过程,对描述 KaiwuDB 的事务状态和实现事务恢复都有很大的帮助。

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

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

相关文章

支付交易——外卡收单流程

摘要 近几年以来,随着跨境贸易和跨境服务也都不断发展,外卡收单行业呈现出新的发展态势。随着外籍人士入华消费场景增多,越来越多的中国商户为了满足海外消费者的需求开始逐渐接受国际信用卡支付。据官方统计数据截止2023年11月,…

Adobe Animate有必要学习AS3脚本吗?

AdobeAnimate软件已经慢慢的替代Flash系列软件在动画中的地位了,也越来越多的出现在各专业课中。不过还是以动画制作方面的教学为主。 Animate软件从入门到提高系列课程​http://www.bilibili.com/cheese/play/ss1826 也有不少同学知道从Flash系列开始,…

vue3使用vant4的列表vant-list点击进入详情自动滚动到对应位置,踩坑日记(一天半的踩坑经历)

1.路由添加keepAlive <!-- Vue3缓存组件&#xff0c;写法和Vue2不一样--><router-view v-slot"{ Component }"><keep-alive><component :is"Component" v-if"$route.meta.keepAlive"/></keep-alive><component…

[JS]DOM事件

事件监听 让程序检测是否有事件产生, 一旦事件触发, 就调用函数做出响应 事件三要素: 事件源(谁的事件) 事件类型(如何触发) 事件处理程序(做什么) function fn() {} // 绑定事件 btn.addEventListener(click, fnction() { })// 绑定事件 btn.addEventListener(click, fn)//…

Swoole v6 能否让 PHP 再次伟大?

大家好&#xff0c;我是码农先森。 现状 传统的 PHP-FPM 也是多进程模型的的运行方式&#xff0c;但每个进程只能处理完当前请求&#xff0c;才能接收下一个请求。而且对于 PHP 脚本来说&#xff0c;只是接收请求和响应请求&#xff0c;并不参与网络通信。对数据库资源的操作…

Arm Linux 修改 网络 mac 地址的方式方法

一、指令修改 查看网络信息指令 ifconfig修改网络 mac 地址&#xff0c;指令 ifconfig 网卡名 hw ether mac地址例如&#xff1a; ifconfig eth0 hw ether 08:00:27:00:01:96二、C语言程序修改 1.使用 ioctl 和 SIOCSIFHWADDR 来设置MAC地址&#xff0c;示例代码如下&…

【计算机毕业设计】087基于微信小程序社区养老服务

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

“ONLYOFFICE 8.1:提升用户体验和编辑功能的全面升级”

引言 官网链接 在当今快节奏的工作环境中&#xff0c;高效地处理文档是每个职场人士必备的技能。ONLYOFFICE 桌面编辑器凭借其强大的功能和用户友好的界面&#xff0c;成为了提升文档处理效率的得力助手。本文将介绍 ONLYOFFICE 桌面编辑器的核心特性&#xff0c;并展示如何通…

乐鑫已支持Matter 1.2标准新增多种设备类型,启明云端乐鑫代理商

随着物联网技术的飞速发展&#xff0c;智能家居正逐渐成为现代生活的一部分。物联网和智能家居行业应用取得了巨大的增长&#xff0c;一系列无线连接的智能设备涌入家庭&#xff0c;为家庭生活带来自动化和便利。 像是可以连网的扬声器、灯泡和中控开关&#xff0c;它们都可以…

AI Workflow的敏捷开发:持续创新与优化的艺术

在人工智能的浪潮中&#xff0c;AI Workflow作为大模型落地的关键实践&#xff0c;正逐渐成为技术领域的新宠。然而&#xff0c;随着技术的发展&#xff0c;我们面临着一系列挑战&#xff0c;如何有效地应对这些挑战&#xff0c;实现AI Workflow的敏捷开发&#xff0c;成为了一…

ROS学习记录:Hector_Mapping建图的参数设置

前言 launch文件启动Hector_Mapping的建图功能 在上一篇文章&#xff08;以上链接&#xff09;通过launch文件启动了Hector_Mapping建图功能&#xff0c;这一篇文章将在launch文件里给Hector_Mapping设置参数 一、Hector_Mapping有哪些参数 1、浏览器搜索并进入 ROS index 2…

使用CDN方式创建Vue3.0应用程序

CDN 的全称是 content delivery network&#xff0c;即内容分发网络。它是构建在现在的互联网基础之上的一层智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发和调度等功能模块&#xff0c;使用户就近获取所需内容&#xff0c…

Proxmox VE(PVE)上手配置指南

Proxmox VE&#xff08;PVE&#xff09;是一款开源虚拟化管理平台&#xff0c;集成了KVM和LXC技术&#xff0c;支持虚拟机和容器管理。它提供了一个基于Web的用户界面&#xff0c;支持高可用性集群、备份和恢复、实时迁移等功能&#xff0c;适用于企业级虚拟化环境。. 以下为安…

每日一道算法题 有效括号序列

题目 有效括号序列_牛客题霸_牛客网 (nowcoder.com) Python 1长度必须为偶数 2就像开心消消乐一样&#xff0c;一左一右就消掉。 class Solution:def isValid(self , s: str) -> bool:# write code here# flag[(),{},[]]# for _ in range(len(s)//2):# for i in fl…

AI+零信任 | 易安联亮相首届“矩阵杯”网络安全大赛

6月26日&#xff0c; 首届“矩阵杯”网络安全大赛 在青岛国际会议中心举行。大赛由360数字安全、华云安主办&#xff0c;赛宁网安、永信至诚、红客社区协办&#xff0c;致力于推动提升全民网络安全意识、发现顶尖安全人才、鼓励技术创新发展&#xff0c;推动安全行业共建共享…

可溶性聚四氟乙烯离子交换柱PFA层析柱微柱一体成型

PFA微柱&#xff0c;也叫PFA层析柱、PFA离子交换柱等&#xff0c;主要用于地质同位素超净化、痕量、超痕量、微量元素分析实验室。 规格参考&#xff1a;1.5ml、15ml、30ml等。 其主要特性有&#xff1a; 1、PFA层析柱&#xff08;微柱&#xff09;专为离子交换设计&#xff…

【Python特征工程系列】编码:非数值型数据(字符型)转化为数值型数据(案例+源码)

这是我的第310篇原创文章。 一、引言 前面我们使用的案例的数据无论是特征还是标签都是数值型数据&#xff0c;但是在平时工作中我们的数据往往含有非数值型特征&#xff08;object&#xff0c;比如文本字符类型的&#xff09;&#xff0c;这时候我们就需要对这类数据进行编码…

Redis 缓存一致性

Redis 业务结构 流程图 缓存一致性 Redis 和 MySQL 中数据保持一致 双检加锁策略 主要用于解决多线程环境下的并发问题&#xff0c;确保在高并发场景下对共享资源的访问是互斥的&#xff0c;避免因竞争条件导致的不一致状态 public User findUserById(Integer id) {User user …

金航标和萨科微公司发展历程

金航标kinghelm&#xff08;www.kinghelm.com.cn&#xff09;和萨科微slkor总经理宋仕强介绍公司发展发展历程时说&#xff0c;2015年萨科微与韩国延世大学团队当年萨科微碳化硅功率器件、SiC MOS、SiC SBD成功量产&#xff0c;2016年萨科微在中国大陆成功注册“Slkor”商标&am…

Build with Claude:价值 3 万美元 API 积分

只要在 6 月 26 日至 7 月 10 日创建一个基于 Anthropic API 的应用&#xff0c;并在这里提交&#xff0c;前三名可瓜分 3 万美元的 Anthropic 积分。