CP模型--Raft协议介绍

2024-05-13 18:36
文章标签 介绍 协议 模型 cp raft

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


文章目录

  • 前言
  • 一、Raft 是什么:
  • 二、Raft的工作原理:
    • 2.1 Raft 节点的3中状态:
    • 2.2 集群启动 leader 节点的选举:
    • 在这里插入图片描述
    • 2.3 数据的同步(日志复制):
    • 2.4 leader 重新选举:
    • 2.5 网络分区故障:
    • 2.6 超时时间控制:
  • 总结:
  • 参考:


前言

本文对分布式系统下,强一致性模型(cp)之Raft 算法的实现进行介绍。


一、Raft 是什么:

Raft 是工程上使用较为广泛的 强一致性、去中心化、高可用 的分布式协议,用于管理副本复制(Log Replication)。相比传统的 Paxos 算法,Raft 将大量的计算问题分解成为了一些简单的相对独立的子问题,并有着和 Multi-Paxos 同样的性能。

二、Raft的工作原理:

CP协议raft 实现动画版: http://thesecretlivesofdata.com/raft/

2.1 Raft 节点的3中状态:

  • Leader:Leader 会一直工作,直到失败。Leader 节点负责处理所有客户端的请求,定期向集群中的 Follower 节点发送心跳消息,证明自己还健在。
  • Follower:Follower 只响应来自其他服务器的请求。Follower 节点不处理 Client 的请求,而是将请求重定向给集群的 Leader 节点,由 Leader 节点进行请求处理。
  • Candidate:如果 Follower 长时间没有收到任何通信,它将成为 Candidate 并发起选举。获得多数选票的 Candidate 成为新的 Leader。

2.2 集群启动 leader 节点的选举:

  • 集群中的节点一开始都是 fllower 从节点;

  • 当集群中接收不到leader 节点的心跳,在选举的超时时间过完后,触发选举,此时从节点变为候选节点
    在这里插入图片描述

  • 从节点发送选举投票给到其它的节点(自己先投给自己一票),其它节点接到请求并返回值;
    在这里插入图片描述 - - 返回选票结果:

投票限制:
1) 在任一任期内,单个节点最多只能投一票;
2) 候选人知道的信息不能比自己的少;
3) first-come-first-served 先来先得;
投票结果:
(1) 收到majority的投票(含自己的一票),则赢得选举,成为leader;
(2)被告知别人已当选,那么自行切换到follower;
(3)一段时间内没有收到majority投票,则保持candidate状态,重新发出选举;

在这里插入图片描述

  • 改从节点获取到集群内过半节点的投票返回,则晋升为leader 节点,然后发送心心跳给到从节点;

在这里插入图片描述

在这里插入图片描述

2.3 数据的同步(日志复制):

  • 将数据发送到leader节点,leader 节点将数据写入到log 日志中;
    在这里插入图片描述

  • 日志写入完成,将日志数据发送给到其它的从节点(在心跳中将数据一并传输);
    在这里插入图片描述

  • 从节点写入数据到各自 的日志中,然后返回成功的状态给到leader 节点;
    在这里插入图片描述

  • leader 接收到集群节点过半都已经成功,则将本机数据进行更新(提交),响应客户端,并发送命令到从节点,各从节点完成数据更新;
    在这里插入图片描述

  • 如果不是过半成功,则不更数据,并并发送命令到从节点,各从节点不进行数据更新;

2.4 leader 重新选举:

当出现网络故障或者leader 挂掉时,leader和follower 之间的心跳超时,触发leader的重新选举:

  • 从节点在重置自己成为候选者的时间到达后,成为候选者;
  • 然后发送选举给到集群内其它节点;
  • 获取半数投票成为leader 节点,然后发送心心跳给到从节点;
  • 从节点接收到leader 心跳,则重置自己成为候选者的时间;

2.5 网络分区故障:

当出现网络分区,A&B,C&D&E,则会出现两个leader节点;
在这里插入图片描述

此时如果客户端,发送数据给到 NodeB 不满足过半写入,则数据写入不成功;如果发送给到 NodeC ,有3个节点(5/2 +1 =3)则数据写入成功;

网络分区恢复:

  • 则通过一定的规则得到唯一的一个新leader 节点;
  • 旧的leader节点数据及旧的从节点,则回滚到没有没有提交的日志;然后接收新的leader 的日志数据;

2.6 超时时间控制:

  • 选举的超时时间:每个节点从fllower 变为 候选节点 ,每个节点的时间在150ms 和300 ms 之间;减少多个节点同时进行选举投票,产生候选者获取到投票数量相同 从而触发再次选举进入死循环;
  • 如果产生候选者获取到投票数量相同,则等待选举的超时时间之后重新进行投票选举;

总结:

raft 通过投票(过半)当选为leader 节点,只有leader 节点负责对客户端的数据写入操作;leader 在接收到数据之后,现在本地记录日志,然后将日志信息跟随心跳一起发送到集群内的从节点,从节点完成日志数据记录后,返回leader,只有过半的从节点都写入日志成功,则进行数据提交(数据真正的写入成功),否则 进行数据的回滚;当心跳超时时则会重新触发leader 的选举。

参考:

Raft协议;

这篇关于CP模型--Raft协议介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台