005、体系结构之TiKV_Raft日志

news2024/11/24 8:48:00

Raft日志

  • 1、Raft与Multi Raft
  • 2、Raft 日志复制
    • 2.1、复制流程总览
    • 2.2、Propose
    • 2.3、Append
    • 2.3、Replicate(Append)
    • 2.4 Committed
    • 2.4 Apply
  • 3、Raft Leader 选举
    • 3.1、原理
    • 3.2、节点故障
    • Leader(主副本)选举
    • ⽇志复制

1、Raft与Multi Raft

在这里插入图片描述
一个region的大小是96Mb ,最大144Mb 。它里面记录的是日志条目,是个左闭右开区间。
[1,999) [1000,1999)
一个TiKV当中如果超过5万个Region,则管理成本就很高了。因为需要向PD汇报相关信息。

2、Raft 日志复制

在这里插入图片描述
写入数据只发送给leader,然后leader分发给follower

2.1、复制流程总览

  • Propose
  • Append
  • Replicate
    • Append
  • Commited
  • Apply

2.2、Propose

在这里插入图片描述
数据的变更(增删改),都是以追加的方式记录到内存中。

2.3、Append

在这里插入图片描述
内存中的记录条目持久化到Rocksdb raft

2.3、Replicate(Append)

在这里插入图片描述
将leader中条目信息拷贝到follower上。并且追加到follower上的rocksdb raft。

2.4 Committed

在这里插入图片描述
这个commited 是指ACK. 这个说的raft 日志的commit,跟sql语句commit没关。
用户的committed指的是事务层

2.4 Apply

在这里插入图片描述
将raft的记录信息应用持久化到Rocksdb kv中。 用户的commited在这个阶段才算成功
在这里插入图片描述
不仅raft 日志 事务应用的commit也成功了。

在这里插入图片描述
这里的数据写入,指的是已经通过了Transaction 和 MVCC层,之后的处理
在这里插入图片描述

用户的commit 完成成功标识是: 已经commited状态的raft log 通过apply pool 应用到 kv当中。

3、Raft Leader 选举

3.1、原理

在这里插入图片描述
term 时期,将一个时间分成一段一段,这个一段一段(不是平均固定的长度)的时间就叫term。
可以把term理解成,恋爱期间的稳定期。

在集群刚开始创建的时候,当前并没有leader , 都是flower ,另外每个region当中都有一个计时器(election timeout 假设是10秒),这三个flower 当前都处于term 1 。term 1中,这三个flower都在等待集群当中leader给我心跳信息,如果一直等不到,超过10秒,则认为集群当中没有leader。 那么这个时候谁会率先达到这个计时器的等待值,假设这个时候node 2 率先达到了10秒,则会打破这个关系,则进入下一段关系 这个时候达到 term 2阶段。在term 2阶段,它就从flower 变成candiate,candiate的作用就是发送选票给其他节点,让其他节点投票给他。告知其他节点(包括自己)现在没有leader ,我要当leader。 同时告诉其他节点,我们现在要去到term 2的阶段。

那其节点凭什么选择node 2 ?
节点收到比自己term 大的消息时候,它就会同意那个节点的请求。

于是在term 2这个时期,node2 就选举成了 leader
实际只要超过一半即可。

3.2、节点故障

如果是节点故障,或者网络隔离的时候,如何处理?
在这里插入图片描述
在这里插入图片描述
heartbeat interval time : 心跳间隔时间,leader 通过心跳间隔时间发送给flower,如果flower超过心跳时间还没有收到leader信息,则到下一个阶段。
在这里插入图片描述
如果同一时间同时达到了 下一阶段,然后都投票给自己,这个时候就没有选出来,因为都一票。系统会重新发出投票,直到选出。 所以有可能出现延迟卡顿的情况,为了解决这个,可能将 电子计时器 的值设置的是范围,以前设置300ms,现在设置100-300ms。这样每个节点的region上的计时器 值是不一样的。 这样避免同时进入下一阶段。

在这里插入图片描述
在这里插入图片描述
时间间隔: raft-heartbeat-ticks(数量)*raft-base-tick-interval(单位间隔长度)

接下来 TiKV 的实现⾯临⼀件更难的事情:如何保证单机失效的情况下,数据不丢失,不出错?
简单来说,需要想办法把数据复制到多台机器上,这样⼀台机器⽆法服务了,其他的机器上的副本还能提供服务;复杂来说,还需要这个数据复制⽅案是可靠和⾼效的,并且能处理副本失效的情况。TiKV 选择了 Raft 算法。Raft 是⼀个⼀致性协议,Raft 提供⼏个重要的功能:

Leader(主副本)选举

在这里插入图片描述

  • 身份
    三种身份:Leader candidate follower
    有个时间轴,在某个时间,它们有对应的身份认证。 这某个时间就是用term 表示。 假设时间间隔是100ms.

  • 选举流程
    初始化时候(term=1),假设node3 是leader。 node1/node2 是flower。 node3 不断向node1/node2发送心跳,这个时候flower就知道主节点还存在。 flower有个预设的属性值,例如设置100ms ,100ms都没收到leader的心跳,则这个节点进入到candidate 身份认证,也就是这个node2 进入term 2 时期,这个它就会尝试当leader .
    然后对于node 1 可能它的100ms(这个时间对于每个node也是随机的,并不是固定)还没有到,它还是处于flower状态 。也就是还处于tiem 1 时期。
    在term 2时期,node 2 处于candiatite状态,它会向其他node 发送自己的选票,告诉其他节点我要争取leader 。 这个node 1.收到node 2的选票(tiem 2),则节点1给节点2 投票(因为tiem 2 比tiem 1大,所以投票给它),同样node2 也会给自己投票 。 根据raft协议,只要收到大部分票数,则可以成为leader。

  • 成员变更
    如添加副本、删除副本、转移 Leader 等操作

⽇志复制

region 存的数据是kv,这个k是按照二进制的大小 有序存放,region大小是96M,如果超过了96,达到了144M 则这个region会进行拆分
在这里插入图片描述
TiKV 利⽤ Raft 来做数据复制,每个数据变更都会落地为⼀条 Raft ⽇志,通过 Raft的⽇志复制功能,将数据安全可靠地同步到复制组的每⼀个节点中。不过在实际写⼊中,根据 Raft 的协议,只需要同步复制到多数节点(返回对应ACK),即可安全地认为数据写⼊成功。
在这里插入图片描述

  • 同步步骤
    • Propose
      接收到用户请求,leader此时就是Propose状态,收到日志写入请求。
    • Append
      将对应的日志写入到rocksdb raft中(针对leader)
    • Replicate
      然后把日志同步给flower
      • Append
        在flower 中,将flower 日志落盘,成功后,返回ack给到leader。
    • Committed
      leader 收到超过半数以上的ack,就认为(日志)的同步是成功的,此时提交
    • Apply
      通知各个副本进行数据的变更。这时候数据的变更才写入到RockDB KV
      在这里插入图片描述
      TiKV 磁盘有两个部分,一个是 raft,一个是 kv。 相当于一个是日志,一个是kv。副本间的同步其实是通过raft(日志)实现。

总结⼀下,通过单机的 RocksDB,TiKV 可以将数据快速地存储在磁盘上;通过Raft,将数据复制到多台机器上,以防单机失效。数据的写⼊是通过 Raft 这⼀层的接⼝写⼊,⽽不是直接写 RocksDB。通过实现 Raft,TiKV 变成了⼀个分布式的 Key-Value 存储,少数⼏台机器宕机也能通过原⽣的 Raft 协议⾃动把副本补全,可以做到对业务⽆感知。

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

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

相关文章

MPI期末复习指南

🍎 博客主页:🌙披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 C/C专栏 🌙那些看似波澜不惊的日复一日,…

国家版权局正版化检查工具添加自定义检查软件及问题处理

使用国家版权局正版化检查工具进行软件正版化检查时,根据各个单位购买的正版化软件的不同,需要将自购软件和禁用软件增加到检查清单,本文件介绍添加自定义检查软件的方法及问题处理。 一、检查清单文件介绍及修改方法 国家版权局正版化检查工…

SpringMVC Controller 接收页面传递的中文参数出现乱码

问题描述 今天在使用SpringMVC做项目时候 controller 参数出现乱码 按照网上的搜索结果 对tomcat的server.xml和项目中的web.xml做出配置如下 在tomcat的server.xml中找到Connector标签然后对他重新配置 <Connector port"8080" protocol"HTTP/1.1"co…

Falcon 登陆 Hugging Face 生态

引言 Falcon 是由位于阿布扎比的 技术创新研究院 (Technology Innovation Institute, TII) 创建的一系列的新语言模型&#xff0c;其基于 Apache 2.0 许可发布。值得注意的是&#xff0c;Falcon-40B 是首个“真正开放”的模型&#xff0c;其能力可与当前许多闭源模型相媲美。这…

MySQL | 深入了解如何最大化利用 MySQL 函数(一)

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL字符串函数和数学函数的讲解✨ 目录 前言一、字符串函数二、数学函数三、总结 一、字符串函数 函数作用UPPER(列|字符串)将字符串每个字符转为大写LOWER(列|字符串)将字符串每个字符转为小写CONCAT(str1,str2,…

AI 写作,30 秒上手,可别再说写作没思路了

你经常要与文字打交道吗&#xff0c;是不是也会有以下困惑&#xff1f; 写作难下笔写不好&#xff1f;课程制作难缺灵感&#xff1f;营销文案没吸引力&#xff1f;PPT制作耗时费力&#xff1f;短视频脚本没创意&#xff1f; ChatGPT 出现以后&#xff0c;嗅觉灵敏的先行者&…

线程同步(三)

目录 条件变量 条件变量操作函数函数原型&#xff1a; 线程阻塞函数&#xff1a; 唤醒阻塞线程&#xff1a; 生产者和消费者模型 信号量函数 生产者和消费者模型 总结 条件变量 条件变量是一种线程间同步的机制&#xff0c;用于协调线程之间的操作。当一个线程正在等待某…

浅谈银桥乳业局域网设计与实现_kaic

摘 要 迈入二十一世纪&#xff0c;在互联网智能制造的加持下。各公司企业不断提升管理制造能力。云计算、新基建、大数据等技术日新月异。不断冲击着管理方式。企业局域网作为企业基建基础到越来越变得重要的。伴随着企业财务业务一体化的需求。ERP系统、CRM系统、HR系统、MES…

动态域名服务 DDNS,YYDS(四)

来源&#xff1a;公众号【鱼鹰谈单片机】 作者&#xff1a;鱼鹰Osprey ID &#xff1a;emOsprey 前面的笔记《如何像访问百度一样访问家里的服务器&#xff1f;&#xff08;三&#xff09;》已经通过公网 IP 桥接&#xff0c;完成了基本功能&#xff0c;已经可以通过公网 IP…

面试问题总结---SLAM部分

1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程; 2、个人经历: 研究生期间课题是SLAM在无人机上的应用,有接触SLAM、Linux、ROS、C/C++、DJI OSDK等; 3、参加工作后…

嵌入式软件开发岗位----求职过程记录(基础知识和面经总结)

1、本栏用来记录社招找工作过程中的内容&#xff0c;包括基础知识以及面试问题等&#xff0c;以便于后续个人回顾学习&#xff1b; 暂时只有2023年3月份&#xff0c;第一次社招找工作的过程&#xff1b; 2、个人经历&#xff1a; 研究生期间课题是SLAM在无人机上的应用&#xf…

深入理解 JavaScript Promise

1. 引言 JavaScript中的Promise是一种处理异步操作的机制&#xff0c;它提供了一种优雅的方式来处理回调函数地狱和异步代码的流程控制。本文将深入介绍JavaScript中的Promise&#xff0c;帮助读者更好地理解和应用Promise。 2. Promise的基本概念 Promise是一个代表异步操作…

唯一客服系统(独立部署无限多开)-知识库ChatGPT-支持微信公众号小程序-钉钉-PC和H5全渠道客服系统...

产品介绍 唯一客服系统是基于Golang语言自主开发的在线客服系统。创立于2019年初&#xff0c;是一款连接企业与客户的即时通讯项目&#xff0c;遵循快速、简洁的开发原则&#xff0c;是为中小企业量身定制的全渠道客服系统&#xff0c;致力于帮助广大开发者/公司快速部署整合私…

第四十七章 液态网络

如弗洛格老师所料&#xff0c;巴哥奔果真倒头睡掉了一夜一昼又一夜。 再次醒来&#xff0c;浑身酸痛仍在&#xff0c;却是以鸡皮疙瘩的形式存在于皮肤上。临鸾连续弹出两个数字&#xff0c;其一是时间&#xff0c;其二是任务量。 时间很快得到室友们的确认&#xff0c;没错&…

Vue中如何进行移动端手势操作?

Vue中如何进行移动端手势操作&#xff1f; 在移动端开发中&#xff0c;手势操作是非常常见的功能&#xff0c;例如滑动、缩放、旋转等操作。在Vue.js中&#xff0c;我们可以使用第三方插件或者自己编写指令来实现手势操作。本文将介绍如何在Vue.js中实现移动端手势操作。 使用…

OpenGL蓝宝书第十章学习笔记:计算着色器

前言 本篇在讲什么 OpenGL蓝宝书第十章学习笔记计算着色器 本篇适合什么 适合初学OpenGL的小白 本篇需要什么 对C语法有简单认知 对OpenGL有简单认知 最好是有OpenGL超级宝典蓝宝书 依赖Visual Studio编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻…

Idea+maven+springboot项目搭建系列--2 整合Rabbitmq完成客户端服务器端消息收发

前言&#xff1a;本文通过springBoot -maven 框架&#xff0c;对Rabbitmq 进行整合&#xff0c;完成客户端消息的发送和消费&#xff1b; 1 为什么要使用Rabbitmq&#xff1a; RabbitMQ 是一个可靠的、灵活的、开源的消息中间件&#xff0c;具有以下优点&#xff1a; 异步通信…

【C++】C++前言

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 1.什么是C 2.C的发展史 3.C的重要性 a.使用广泛 b.C/C的应用 1.操作系统以及大型系统软件开发 2.服务器端开发 3.游戏开发 4.嵌入式和物联网领域 5.数字图像处理 6.人工智…

AVL树的解析

我们在之前的学习里面已经发现了&#xff0c;搜索二叉树是有一些问题的。它可能会存在单边树的问题&#xff0c;如果你插入的值是有序的话&#xff0c;就会导致这个问题。 那我们肯定是要来解决一下的&#xff0c;如何解决呢&#xff1f; 》一种解决方案是AVL树&#xff0c;还有…

【云原生 | 54】Docker三剑客之Docker Compose应用案例二:大数据Spark集群

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…