理解raft

2024-08-25 16:28
文章标签 理解 raft

本文主要是介绍理解raft,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

raft是一种用于管理复制日志的一致性算法。

它做两件事情:

  1. 选举leader:目的是有个leader好协调处理各个follower之前的问题;
  2. 日志复制:目的是保证数据在follower之间的一致性和数据的持久化(只要follower不全部挂掉,数据就还在)

1. 三个状态(角色)

  • 领导者:leader,皇帝,皇帝在一个任期内只能有一个。负责接收和响应客户端请求、创建日志、同步日志给follwer、发送心跳给follower。
  • 跟随者:follower,良民,被皇帝管理的,是良民(能收到皇帝发送的心跳包的)。接受leader的心跳、日志,可以投票给选举者。
  • 选举者:candidate,诸侯,没有皇帝管的,是诸侯(可能是皇帝挂了,或者根本就没有皇帝,反正它们这些诸侯在一定时间内没有收到皇帝的心跳包了,才变成诸侯的)。可以选举和被选举。

2. 选举

2.1. 选举过程

  • 所有节点初始为跟随者。最开始大家都是良民。
  • 跟随者等待一段随机时间(150ms至300ms),这段时间内没有收到来自领导者的消息,就会变成候选人。有些地方好几年没有皇帝的消息,就开始造反,割据一方,成为诸侯。
  • 候选人向其他所有节点,发送请求给候选人投票的消息。诸侯们互相招安,让对方投靠自己。
  • 每个节点在一个选举周期内只能给一个候选人投票。张辽投靠了曹操,就要一直跟着他,直到天下出现一个新皇帝,这个世界不能有吕布这种二五仔。
  • 如果候选人获得大多数节点的投票,就成为领导者。地盘超过一半,就是皇帝,其他势力必须马上投靠。
  • 选举过程中,如果收到来自新领导者的消息,候选人会转变为跟随者。正在东征西战的诸侯,突然收到皇帝的消息,也要直接归顺。

所谓选举周期,就是一轮选皇帝的周期。

为什么要等待随机时间才成为候选人?答:为了减少同时变成候选人的节点数量,这样选举就会结束得快一些。如果美国几亿人都直接参与选举,他们100年都选不出总统来。

2.2. 选举时投票的决策算法

某个节点收到a/b两个候选人节点,投票给谁呢?Raft算法会考虑谁的日志更完整、谁人任期更新。

2.2.1. 更完整的日志

  1. 日志的长度:日志越长通常意味着该节点包含更多的已提交和未提交的操作记录,更有可能处于最新的状态。所以节点更倾向于投票给日志更长的候选人。选择投靠兵力更多的一方:吕布看到曹操有100万,刘备只有2万,肯定去投靠曹操了。
  2. 日志条目的内容:如果两个节点的日志长度相同,那么会进一步比较日志条目的内容。具有更完整、连续且与大多数节点一致的日志的候选人更有可能获得投票。选择投靠纪律严明的一方:当初刘备只有5千人马,但军纪严明,公孙瓒有10万人马,但军纪涣散,赵云就投靠了刘备。

2.2.2. 更新的任期号(term)

任期号是Raft算法中用于区分不同选举阶段和领导权的重要标识。每个节点在不同的选举周期中会处于不同的任期。一般来说,任期号更高的候选人更有优势,因为这意味着该候选人可能代表着更新的领导权主张。东汉末年,有个人说他是曹操,另一个人说他是秦始皇,你投靠谁?按raft算法,投靠曹操,秦始皇太老了。

2.2.3. 日志和任期号哪个优先级更高?

Raft算法会优先考虑日志完整性。有个人说他是曹操,有10万乌合之众,另一个人说他是秦始皇,有100万秦锐士,你投靠谁?按raft算法,投靠秦始皇,他虽然老,但是兵力雄厚啊,还是要实力说话。

3. 日志复制

假设有3个raft集群曹操、刘备、孙权。从刘备这个raft集群的角度来看,曹操、孙权是它的客户。刘备这个raft集群里有五虎将作为5个follower,刘备是leader。

  1. 领导者接收来自客户端的请求,将其作为新的日志条目添加到自己的日志中。孙权告诉刘备,曹操准备进攻汉中,刘备赶紧拿个小本本把这事儿记下来。
  2. 领导者然后并行地向其他节点发送日志复制请求。刘备派了5个信号兵去分别通知五虎将这个事儿。
  3. 跟随者收到日志复制请求后,如果日志条目在自己的日志中不存在或者不匹配,就将其添加到自己的日志中,并回复领导者。黄忠收到消息,发现自己还不知道这个事,就赶紧记下来,然后回复刘备;关羽收到消息一看,自己早就知道了,就不记录了,然后回复刘备;张飞之前收到过消息说曹操不过来,今天收到刘备的消息说曹操要来,大吃一惊,然后把他本本上记的消息改正过来,并回复刘备。赵云、马超收到消息也是类似的做法。
  4. 一旦大多数节点都成功复制了日志条目,领导者就可以将该日志条目应用到状态机,并向客户端返回响应。只要有3个人回复刘备了,刘备就可以告诉孙权说,大舅子,我知道了,我准备好了。

所以在刘备集团里,日志复制的目的,就是让刘备集团里大部分人都知道曹操要打过来了,当然刘备也要知道啊。

4. raft的缺点

  1. 对领导者的依赖:单点故障风险,领导者故障会导致服务暂时不可用,影响可用性。
  2. 网络分区的影响:数据不一致风险,不同分区选出不同领导者。设置超过一半才能成为leader,就不会选举出多个leader了。
  3. 性能开销大:日志复制和选举过程都有通信开销,大规模系统中可能影响效率。如果心跳超时时间太短,可能导致频繁选举。

5. 用了raft的中间件

5.1. etcd

etcd是一个高可用的分布式键值存储系统,用于k8s中,来保证数据的一致性和高可用性。etcd 可以在多个节点上存储关键数据,并确保在节点故障或网络分区的情况下,数据仍然能够被可靠地访问和更新。

5.2. consul

consul是一个服务发现和配置管理工具。用Raft来实现分布式一致性。

5.3. nacos

  • Nacos是阿里巴巴开源的分布式协同、配置管理中间件,支持AP、CP两种模式。
  • Nacos的CP模式是靠Raft协议来实现的,用于确保分布式系统中的数据一致性和容错性。

这篇关于理解raft的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1106054

相关文章

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分