浅谈分布式共识算法概念与演进

news2024/12/23 1:22:21

分布式共识是指在分布式系统中,多个节点之间达成共识的过程。

分布式共识的意义在于确保分布式系统中各个节点之间的数据一致性。通过分布式共识算法,可以使得多个节点针对某个状态达成一致,从而保证系统中各个节点之间的数据一致性。这对于构建高可用性、高性能、可扩展性的分布式系统至关重要。

分布式系统中的一致性和共识

在分布式系统中,一致性共识是两个重要的概念。

**一致性是指分布式系统中的多个服务节点,给定一系列的操作,在约定协议的保障下,使它们对外界呈现的状态是一致的。**换句话说,也就是保证集群中所有服务节点中的数据完全相同并且能够对某个提案(Proposal)达成一致 。

而**共识则描述了分布式系统中多个节点之间,彼此对某个状态达成一致结果的过程。**因此,一致性描述的是结果状态,共识则是一种手段 。

分布式共识的算法与思想

随着分布式系统的普及,分布式共识算法成为了分布式系统中必不可少的一部分。而经典的分布式共识算法也不断衍生出了几种不同的类型。

(1)Paxos算法

Paxos算法是一种基于消息传递且具有高度容错性的分布式共识算法。它能够确保在存在网络分区或节点失效情况下,仍能够达成正确的共识结果。Paxos算法的核心思想是通过多轮的投票来达成一致意见。每一轮投票中,节点会对一个提案进行投票,当达到法定人数时,便可以认为该提案获得了通过。

Multi-Paxos是Basic Paxos的改进版,是将Basic Paxos实例执行多次,对一系列值达成共识,同时它也是一部分分布式共识算法的统称,可以说是一种思想。

(2)ZAB算法

ZAB算法是Zookeeper Atomic Broadcast的缩写,是Zookeeper保证数据一致性的核心算法。ZAB算法是为分布式协调服务Zookeeper专门设计的一种支持崩溃恢复的原子广播协议 。

ZAB算法的主要作用是保证分布式系统中各个节点之间的数据一致性。在ZAB算法中,有两种角色:Leader和Follower。Leader负责处理客户端请求,并将数据同步到所有Follower节点上;Follower节点则负责接收Leader节点的数据,并将其写入本地磁盘。当Leader节点发生故障时,Follower节点会根据ZAB算法选举出新的Leader节点,并重新同步数据 。

(3)Raft算法

Raft算法是Paxos算法的一种改进版,具体的说是基于Multi-Paxos,其主要思想是将多个领导者(Leader)缩减为一个主节点(Leader),同时将投票阶段拆分为多个步骤,使得系统更容易理解和维护。Raft算法通过选举产生主节点,主节点负责管理日志的复制和一致性验证等工作,而其他节点只负责接收主节点发送的消息并进行响应。

(4)Gossip协议

Gossip协议是一种基于信息传播的分布式共识算法。它通过节点之间的互相交流来达成共识,并将共识结果广播给其他节点。与Paxos和Raft等算法不同,Gossip协议不需要固定的领导节点,也没有明确的提案过程,而是通过对节点之间消息的传播来实现共识。

以上几种算法的诞生过程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vJND2ELe-1693061330974)(浅谈分布式共识算法体系与演进.assets/image-20230826192159451.png)]

不同分布式共识算法的简要分析

Paxos

Paxos算法是一种解决分布式系统一致性的经典算法。它是在1990年代由莱斯利·兰波特(Leslie Lamport)提出的一种分布式一致性协议,用于在分布式系统中实现一致性决策。

Paxos算法的核心思想是,在一个分布式系统中,通过多数派节点的共同决策,确保系统在发生故障或网络故障的情况下仍然能够达成一致的状态。主要分为以下几个步骤:

  • 阶段一(Promise):

    每个节点都会接受来自其他节点的请求,并且承诺不会接受任何与之前承诺的提案具有相同编号的提案。这个阶段的目标是确保每个节点发出的提案都具有唯一的编号,从而避免系统中的矛盾决策。

  • 阶段二(Accept):

    在这个阶段,提出提案的节点会选择一个编号,并向所有其他节点发送提案。只有当多数派节点接受了该提案,该提案才会被认为是一致同意的决策。

  • 阶段三(Decide):

    一旦提案被多数派节点接受,这些节点就会做出最终的决定,并将该提案应用到系统中。这个阶段的目标是确保所有节点都应用相同的决策,从而保证系统的一致性。

Paxos算法的关键在于,它通过多数派节点的共同决策来确保系统的一致性。即使部分节点发生故障或网络故障,只要多数派节点正常工作,系统仍然能够达成一致的状态。

ZAB

ZAB(ZooKeeper Atomic Broadcast)算法是一种基于消息传递的分布式一致性协议,常用于实现分布式系统的数据一致性。它是ZooKeeper的核心算法,为分布式应用提供了可靠的状态同步服务。

ZAB算法的核心思想是,通过消息广播的方式在分布式系统中实现一致性决策。它遵循以下主要步骤:

  • 消息广播:每个节点都会接收来自其他节点的消息,并将其广播给其他节点。消息包括提议(proposal)和确认(acknowledgement)。
  • 提议:当一个节点需要将一个变化(如更新或删除操作)通知给其他节点时,它会发起一个提议,并发送给其他节点。提议包含操作(operation)和序列号(sequence number)。序列号用于保证消息的顺序性。
  • 确认:当一个节点接收到一个提议时,它会执行该提议的操作,并回复一个确认消息给发送提议的节点。确认消息包含操作的结果(如成功或失败)和接收到的下一个期望的序列号。
  • 投票:当一个节点收到来自其他节点的提议时,它会为该提议进行投票。投票结果取决于提议的操作是否与本地节点的状态一致。如果一致,节点就会投票同意,否则就会投票拒绝。投票结果会随着确认消息返回给发送提议的节点。
  • 决策:当一个节点收集到足够多的投票时,就会做出决策。决策的结果取决于多数派节点的投票结果。如果多数派节点投票同意,那么提议就会被执行,否则提议就会被拒绝。
Raft

Raft算法是一种基于消息传递的分布式一致性协议,与Paxos和ZAB算法类似,它被设计用来在分布式系统中实现一致性的决策。Raft算法通过强化领导权(leader election)和日志复制(log replication)来解决一致性问题的同时,也提供了更为清晰和易于理解的算法实现。

Raft算法的核心思想可以被分解为三个组成部分:

  1. 领导权(Leadership):Raft算法通过强化领导权来解决一致性问题。在Raft中,一个节点可以被选举为领导者(leader),其他节点则成为追随者(follower)。领导者负责处理所有客户端的请求,并将新的日志条目附加到系统的末尾。追随者则仅在领导者出现故障时才会开始运行,以避免不必要的资源浪费。
  2. 日志复制(Log Replication):Raft算法确保领导者将每个日志条目广播给所有追随者,并且每个节点都会保存一个相同的数据副本。每当领导者收到一个新日志条目时,它会将该条目附加到自己的日志中,并等待足够多的节点确认该条目已经被接收。一旦领导者收到大多数节点的确认,它就会将该条目标记为已提交,并通知客户端。
  3. 安全性和一致性(Safety and Consistency):Raft算法确保了一致性的安全性,即任何两个有效的领导者都不会做出相互矛盾的决策。此外,Raft还确保了一旦一个日志条目被标记为已提交,那么所有节点都将具有相同的数据副本。这通过一种称为持久性存储(persistent storage)的机制实现,它记录了所有已经提交的日志条目。
Gossip

Gossip协议的实现过程如下:

  1. 每个节点都有一个邻居节点列表,每个邻居节点都是与该节点直接相连的其他节点。
  2. 随机选择一个节点作为源节点,该节点向其邻居节点发送一条消息。
  3. 每个接收消息的节点将消息转发给其邻居节点的概率正比于节点度数(与该节点直接相连的邻居节点数)。
  4. 每个节点重复执行上述过程,直到所有节点都收到消息。

Gossip协议的优势在于它可以实现负载均衡和数据复制,提高系统的可靠性和性能。它还可以用于分布式计算和分布式存储等分布式系统。

总结

分布式共识中达成共识的手段几乎都是投票机制,使用投票机制的主要原因是为了在多个节点之间达成一致的决定,可以有效帮助算法在分布式环境中解决冲突和分歧,确保所有节点都能够达成共识。

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

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

相关文章

应知道的16个Python基础知识

列表推导式 # 列表推导式,用一行代码生成一个有规律的列表 # 列表推导式,用一行代码生成一个有规律的列表 import randomlist_comprehension =[i for i in range(10)] print(list_comprehension)list_comprehension2 =[(x,y)for x in range(4) for y in range(5,10)] print(…

手写Spring源码——实现一个简单的spring framework

这篇文章主要带大家实现一个简单的Spring框架,包含单例、多例bean的获取,依赖注入、懒加载等功能。 一、创建Java项目 首先,需要创建一个Java工程,名字就叫spring。 创建完成后,如下图,再依次创建三级包 二…

Linux系统编程系列之进程基础

一、什么是进程 关于进程的定义很多,这里讲一种比较直接的,进程就是程序中的代码和数据被加载到内存中运行的过程,就是程序的执行过程。进程是动态的,而程序是静态的。程序存储在硬盘里,进程只有在程序被执行后&#x…

生信分析Python实战练习 1 | 视频18

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在:https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

STM32 Cubemx配置串口收发

文章目录 前言注意事项Cubemx配置printf重定向修改工程属性修改源码 测试函数 前言 最近学到了串口收发,简单记录一下注意事项。 注意事项 Cubemx配置 以使用USART1为例。 USART1需配置成异步工作模式Asynchronous。 并且需要使能NVIC。 printf重定向 我偏向…

使用cgroup工具对服务器某些/全部用户进行计算资源限制

使用cgroup工具对服务器某些/全部用户进行计算资源限制 主要介绍,如何对指定/所有用户进行资源限定(这里主要介绍cpu和内存占用限制),防止某些用户大量占用服务器计算资源,影响和挤占他人正常使用服务器。 安装cgrou…

Transformer代码计算过程全解

条件设置 batch_size1 src_len 8 # 源句子的最大长度 根据这个进行padding的填充 tgt_len 7 # 目标输入句子的最大长度 根据这个进行padding的填充 d_model512 # embedding的维度 d_ff2048 # 全连接层的维度 h_head8 # Multi-Head Attention 的…

【C++】—— C++11之可变参数模板

前言: 在C语言中,我们谈论了有关可变参数的相关知识。在C11中引入了一个新特性---即可变参数模板。本期,我们将要介绍的就是有关可变参数模板的相关知识!!! 目录 序言 (一)可变参…

深度学习10:Attention 机制

目录 Attention 的本质是什么 Attention 的3大优点 Attention 的原理 Attention 的 N 种类型 Attention 的本质是什么 Attention(注意力)机制如果浅层的理解,跟他的名字非常匹配。他的核心逻辑就是「从关注全部到关注重点」。 Attention…

ServiceManager接收APP的跨进程Binder通信流程分析

现在一起来分析Server端接收(来自APP端)Binder数据的整个过程,还是以ServiceManager这个Server为例进行分析,这是一个至下而上的分析过程。 在分析之前先思考ServiceManager是什么?它其实是一个独立的进程,由init解析i…

windows11不允许安装winpcap4.1.3

问题:下载安装包后在安装时显示与电脑系统不兼容,不能安装。 原因:winpcap是一个用于Windows操作系统的网络抓包库,有一些安全漏洞,存在被黑客攻击的风险。Windows11为了加强系统安全而禁用了这个库,因此不…

java.8 - java -overrideoverload 重写和重载

重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。 重写方法不…

【GAMES202】Real-Time Environment Mapping1—实时环境光照1

一、Distance field soft shadows Inigo Quilez :: computer graphics, mathematics, shaders, fractals, demoscene and more (iquilezles.org) 在开始我们的实时环境光照之前,我们再说一种现在的实现实时软阴影的方式,也就是Distance field soft shado…

SpringBoot实现文件上传和下载笔记分享(提供Gitee源码)

前言:这边汇总了一下目前SpringBoot项目当中常见文件上传和下载的功能,一共三种常见的下载方式和一种上传方式,特此做一个笔记分享。 目录 一、pom依赖 二、yml配置文件 三、文件下载 3.1、使用Spring框架提供的下载方式 3.2、通过IOUti…

分布式 - 服务器Nginx:一小时入门系列之 return 指令

文章目录 1. return 指令语法2. return code URL 示例3. return code text 示例4. return URL 示例 1. return 指令语法 return指令用于立即停止当前请求的处理,并返回指定的HTTP状态码和响应头信息,它可以用于在Nginx中生成自定义错误页面,…

分布式事务-seata框架

文章目录 分布式事务0.学习目标1.分布式事务问题1.1.本地事务1.2.分布式事务1.3.演示分布式事务问题 2.理论基础2.1.CAP定理2.1.1.一致性2.1.2.可用性2.1.3.分区容错2.1.4.矛盾 2.2.BASE理论2.3.解决分布式事务的思路 3.初识Seata3.1.Seata的架构3.2.部署TC服务3.3.微服务集成S…

CAPL - Panel和TestModule结合实现测试项可选

目录 一、定义脚本编号和脚本组编号 1、测试组定义 2、测试脚本编号定义

【C++】初步认识模板

🏖️作者:malloc不出对象 ⛺专栏:C的学习之路 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录 前言一、泛型编程二、函数模板2.1 函…

Java10(异常处理)

0.复习面向对象 1.异常的体系结构 异常:在Java语言中,将程序执行中发生的不正常情况.(开发中的语法错误和逻辑错误不是异常) 异常事件分两类(它们上一级为java.lang.Throwable): Error Java虚拟机无法解决的严重问…

算法通过村第三关-数组黄金笔记|数组难解

文章目录 前言数组中出现超过一半的数字数组中只出现一次的数字颜色的分类问题(荷兰国旗问题)基于冒泡排序的双指针(快慢指针)基于快排的双指针(对撞指针) 总结 前言 提示:苦不来自外在环境中的人、事、物,…