Paxos算法(Basic Paxos 与 Multi-Paxos思想)

目录

  • Basic Paxos
    • 三个角色
    • 达成共识的方法
    • 对于Basic Paxos的总结
  • Multi-Paxos
    • 领导者
    • 优化 Basic Paxos 执行
  • reference

Paxos 算法包含 2 个部分:
1、Basic Paxos : 描述多节点之间如何就某个值达成共识
2、Multi-Paxos : 描述执行多个Basic Paxos实例,对一系列值达成共识

Basic Paxos

三个角色

该算法中存在三个角色:提议者接受者学习者,关系如下:
在这里插入图片描述
提议者:提议一个值,用于投票表决。在大多数场景中,往往是集群中收到客户端请求的节点时提议者。这样对于业务代码就没有侵入性,不需要再业务代码中实现算法逻辑。
接受者:对每个提议的值进行投票,并存储接受的值。一般来说,集群中的所有节点都是接受者,参与共识协商,并接受和存储数据
注意:一个节点可以担任多个角色,如下:
在这里插入图片描述

学习者:被告知投票的结果,接受达成共识的值,存储保存,不参与投票的过程。一般来说,学习者是数据备份节点,比如“Master - Slave”模型中的Slave,被动接受数据,容灾备份。
三个角色代表三种功能:

  • 1、提议者代表接入和协调功能,收到客户端请求后,发起二阶段提交,进行共识协商
  • 2、接受者代表协商和存储数据,对提议的值进行投票,并接受达成共识的值,存储保存
  • 3、学习者代表存储数据,不参与共识协商,只接受达成共识的值,存储保存

达成共识的方法

分为准备阶段和接受阶段。
这里假设两个客户端作为提议者和3个节点作为接受者,
客户端1的想要对节点中的Key为X的数据将Value设置为3,客户端2的想要对节点中的Key为X的数据将Value设置为5。
提议者发送给接受者的信息我们称为提案,结构为[n,v],n为提案编号(相当于事务ID,后发起的提案编号越大),v为提议值(写入db的值)
准备阶段
在准备阶段,两个提议者分别向所三个接受者发送包含提案编号的准备请求,准备请求中只包含提案编号。并假设接受者节点收到准备请求的时序图如下:
在这里插入图片描述
接下来是各个接受者节点对于先收到的准备请求的响应。由于之前没有通过任何提案,A,B,C都会返回“尚无提案”的响应。
但是有所不同的是,A,B会告诉提议者,不再响应提案编号 <= 1的准备请求,C会告诉提议者,不再响应提案编号 <= 5的准备请求.
也就是说每个节点之后接受比当前提案编号大的请求。
在这里插入图片描述
接下来是各个接受者第二次收到准备请求的响应。
A,B收到的请求,编号为5 >= 1 ,并且此时两个节点没有通过任何提案,所以返回“尚无提案”响应,并不再响应提案编号 <= 5的准备请求.
C收到的请求,编号为1 < 5 ,所以丢弃该准备请求,不做响应。
在这里插入图片描述
接受阶段
两个提议者节点在收到大多数节点的准备响应之后,会分别发送接受请求
对于客户端1来说,根据响应中提案编号最大的提案的值,设置接受请求中的值。(客户端1只有来自A,B的准备响应),因为响应均为”尚无提案“,所以客户端1会将自己的提议值:3,作为提案值,然后发送接受请求[n, v] : [1,3];
对于客户端2来说,根据响应中提案编号最大的提案的值,设置接受请求中的值。(客户端2来自A,B,C的准备响应),因为响应均为”尚无提案“,所以客户端1会将自己的提议值:7,作为提案值,然后发送接受请求[n, v] : [5,7];
在这里插入图片描述
三个接受者节点收到两个提议者的接受请求,会进行处理:
对于A,B,C节点来说,它们对于请求[1,3],都不会接受,因为提案编号 < 5(最小提案编号)。
它们对于请求[5,7]都会接受,因为提案编号 >= 5,通过提案之后,将提案值:7作为X的Value。
在这里插入图片描述

对于Basic Paxos的总结

根据提案编号的大小,接受者保证三个承诺,具体来说:

  1. 如果准备请求的提案编号,小于等于接受者已经响应的准备请求的提案编号,那么接受者将承诺不响应这个准备请求;
  2. 如果接受请求的提案编号,小于接受者已经响应的准备请求的提案编号,那么接受者将承诺不通过这个提案;
  3. 如果接受者之前有通过提案,那么接受者将承诺,会在准备请求的响应中,包含已经通过的最大编号的提案信息。

Multi-Paxos

Basic Paxos 只能就单个值(Value)达成共识,一旦遇到为一系列的值实现共识的时候,它就不管用了。
它具有两个缺点:
1、如果多个提议者同时提交提案,可能出现因为提案编号冲突,在准备阶段没有提议者接收到大多数准备响应,协商失败,需要重新协商
2、2 轮 RPC 通讯(准备阶段和接受阶段)往返消息多、耗性能、延迟大。

可以通过通过引入领导者优化 Basic Paxos 执行来解决这两个问题。

领导者

领导者节点作为唯一提议者,就不会存在多个提议者同时提交提案的情况,也就不存在提案冲突了。
模型结构如下:
在这里插入图片描述
如何选举领导者需要我们在Multi-Paxos自己实现。
Chubby中,主节点是通过执行 Basic Paxos 算法,进行投票选举产生的,并且在运行过程中,主节点会通过不断续租的方式来延长租期(Lease)。比如在实际场景中,几天内都是同一个节点作为主节点。如果主节点故障了,那么其他的节点又会投票选举出新的主节点,也就是说主节点是一直存在的,而且是唯一的。
所有的读请求和写请求都由主节点来处理。当主节点从客户端接收到写请求后,作为提议者,执行 Basic Paxos 实例,将数据发送给所有的节点,并且在大多数的服务器接受了这个写请求之后,再响应给客户端成功:
在这里插入图片描述
当主节点接收到读请求后,处理就比较简单了,主节点只需要查询本地数据,然后返回给客户端就可以了:
在这里插入图片描述
缺点就是所有写请求都在主节点处理,限制了集群处理写请求的并发能力,约等于单机。

优化 Basic Paxos 执行

下面两个图是 Basic Paxos 以及有领导者的优化执行。

图1 Basic Paxos
图2 优化之后
可以看到,当领导者处于稳定状态时,省掉准备阶段,直接进入接受阶段。这是因为领导者节点上的命令时最新的,不需要通过准备请求来发现之前被大多数节点通过的提案,领导者可以独立指定提案中的值。 如何理解领导者处于稳定状态?领导者节点上,序列中的命令是最新的,不再需要通过准备请求来发现之前被大多数节点通过的提案,领导者可以独立指定提案中的值。准备阶段的意义,是发现接受者节点上,已经通过的提案的值。如果在所有接受者节点上,都没有已经通过的提案了,这时,领导者就可以自己指定提案的值了,那么,准备阶段就没有意义了,也就是可以省掉了。

本质上而言,“当领导者处于稳定状态时,省掉准备阶段,直接进入接受阶段”这个优化机制,是通过减少非必须的协商步骤来提升性能的。这种方法非常常用,也很有效。比如,Google 设计的 QUIC 协议,是通过减少 TCP、TLS 的协商步骤,优化 HTTPS 性能。

reference

《分布式协议与算法实战.韩健》

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

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

相关文章

vs2012下调试mvc4源代码

当前流行的应该是mvc3才对。然后在研究mvc3的源代码时候&#xff0c;Html这个属性下的扩展方法Partial()都没有。IntelliSense不会提示该方法&#xff0c;找了半天的资料也问了一些博友&#xff0c;没看到好的解决棒法。最后没辙另辟蹊跷&#xff0c;就开始着手研究mvc4的源代码…

JAVA UDP网络编程学习笔记

一、UDP网络编程概述 采用TCP协议通信时&#xff0c;客户端的Socket必须先与服务器建立连接&#xff0c;连接建立成功后&#xff0c;服务器端也会持有客户端连接的Socket&#xff0c;客户端的Socket与服务器端的Socket是对应的&#xff0c;它们构成了两个端点之间的虚拟通信链路…

(转)页游安全攻与防,SWF加密和隐藏密匙

原文链接&#xff1a;http://netsecurity.51cto.com/art/201211/364775.htm 页游&#xff0c;最最核心的就是客户端&#xff08;swf&#xff09;与服务端的游戏通信了。游戏通信产生的封包&#xff0c;内容是否可识别&#xff0c;可篡改&#xff0c;可重放&#xff0c;处理逻辑…

linux 命令案例学习——文件搜索

两个搜索文件的工具 locate ——仅仅通过文件名查找文件find ——依据文件的各种属性在既定目录&#xff08;包括子目录&#xff09;里查找一个通常与文件搜索命令一起使用、处理搜索结果文件列表的命令 xargs1 locate 1.1 查找文件名中含有zip的文件名 locate zip 看下结…

Redis 缓存击穿、缓存穿透、缓存雪崩的处理方法

常用的分布式缓存Redis单机并发量能达到万级&#xff0c;常用的关系型数据库MySQL一般并发量是千级&#xff0c;他们支持的并发量可能差十倍&#xff0c;所以要尽可能把流量拦截在缓存层。 缓存击穿 一个并发访问量比较大的key在某个时间过期&#xff0c;导致所有的请求直接打…

图像处理基础

图像处理基础 在计算机中&#xff0c;按照颜色和灰度的多少可以将图像分为二值图像、灰度图像、索引图像和真彩色RGB图像四种基本类型。目前&#xff0c;大多数图像处理软件都支持这四种类型的图像。 (1) 二值图像&#xff1a;一幅二值图像的二维矩阵仅由0、1两个值构成&#x…

缓存一致性解决方法

对于缓存 数据库读写&#xff0c;有个经典的Cache Aside Pattern&#xff1a; 读取&#xff1a;先读取缓存&#xff0c;缓存里没有&#xff0c;读取数据库&#xff0c;然后返回响应&#xff0c;顺便保存缓存&#xff1a; 更新&#xff1a;先更新数据库&#xff0c;然后删除缓…

使用SpringMVC的表单验证

上一篇搭建了基本项目&#xff0c;这一篇在此基础上加入表单验证功能。 第一步&#xff0c;添加command类 Java代码 package test.bean; import javax.validation.constraints.Size; public class User { Size(min3,max30) private String username; …

单体、分布式、微服务、Serverless软件架构一览

目录软件架构单体架构分布式应用微服务架构Serverless架构总结Reference软件架构 软件架构就是软件的基本结构&#xff0c;合适的架构是软件成功的最重要因素之一。这里列举了目前流行的4种软件架构。 单体架构 典型的三级架构&#xff1a;前端&#xff08;web/手机端&#…

Midjourney V6刷屏,但它最可怕的地方居然不是那些神图?

Midjourney在沉寂九个月后推出了Midjourney V6&#xff0c;这个文生图产品体现出的更细腻的细节处理&#xff0c;更强大的语言理解能力和更加“不像AI”的图片效果在过去几天引发一片惊呼。 作为一个闭源的模型产品&#xff0c;Midjourney的魔法配方并不为人所知&#xff0c;但…

连续内存分区式内存管理

目录前言分区式内存管理动态分区内存管理总结本笔记参考黄工的https://mp.weixin.qq.com/s/k0W_LqI1zBAYC1GU1U2HQA 前言 内存管理模块主要负责内存的初始化、分配以及释放。 从分配内存是否连续可以分为两大类&#xff1a; 1、连续内存管理 为进程分配的内存空间是连续的&a…

用DEVC++作图

小海豚学NOIP&#xff0c;老师说要用DEV C。 小海豚喜欢画图&#xff0c;记得以前用C#编些程序给她看。可前一阵打开看&#xff0c;我的免费Visual Studio过期了。可恶的Microsoft &#xff0c;不想用盗版难道就要每个月就下载一次&#xff1f; 于是就用DEV C的Windows调用吧。…

Python服务器开发三:Socket

Python服务器开发三&#xff1a;Socket socket是操作系统中I/O的延续&#xff0c;它可以使进程和机器之间的通信成为可能。socket可以看成一个标准的文件描述符。不同的是文件需要用open()函数打开&#xff0c;而socket用socket() 函数建立.recv()、send()函数和read()、write(…

Linux命令常见

摘自&#xff1a; 常考的 21 条 Linux 命令 目录&#xff09;cd,切换路径ls,查看文件与目录的命令cp,用于复制文件mv,用于移动文件、目录cat,查看文件内容find&#xff0c;文件搜索文件权限命令&#xff0c; 设置权限&#xff0c;-取消权限文本处理命令打包和压缩文件命令进程相…

OSGi.NET 学习笔记 [模块化和插件化][小结]

【目录】-【模块化和插件化】-【小结】 现在我们来对OSGi.NET的“模块化和插件化”做一个小结&#xff0c;再次把官方的说明拿出来  1&#xff09; 物理隔离&#xff1a;基于UIOSP开发的模块是一个物理隔离的可单独部署的模块&#xff0c;每一个模块拥有独立的文件夹、类型空…

raft算法学习(一):角色概念以及选举过程

Raft算法是强领导模型&#xff0c;集群中只能有一个领导。 下面是raft的视频讲解&#xff1a; raft raft的三种角色及其概念 服务器节点状态一共有三种&#xff1a;领导者&#xff08;Leader&#xff09;、跟随着&#xff08;Follower&#xff09;、候选人&#xff08;Candid…

git日常使用教程

目录git日常使用git 基础用法(本地)git branchgit checkoutgit mergegit rebaseHEAD ,在提交树上移动相对引用强制修改分支位置撤销变更整理提交记录提交技巧Git TagsGit Describegit 基础用法(远程)git fetchgit pullgit push偏离的提交历史&#xff0c;十分重要&#xff01;&…

android一键分享功能不使用任何第三方sdk

在android中有自带的一键分享功能&#xff0c;不过它会把所有带分享的应用都找出来&#xff0c;如果我们只需要一些常见的分享应用&#xff0c;该如何做呢&#xff1f; 下面看我的效果图&#xff08;横屏和竖屏自动适配&#xff09;&#xff1a; 接下来看我的调用&#xff08;支…

CMake学习使用(基于vscode)

目录语法一些重要指令CMake常用变量CMake编译工程编译流程两种构建方式实例展示参考&#xff1a; 基于VSCode和CMake实现C/C开发 | Linux篇 语法 基本语法格式&#xff1a;指令(arg1 arg2 …) 参数使用括弧括起来参数之间使用空格或者分号分开 指令是大小写无关的&#xff0…

DNS安全浅议、域名A记录(ANAME),MX记录,CNAME记录

相关学习资料 http://baike.baidu.com/link?url77B3BYIuVsB3MpK1nOQXI-JbS-AP5MvREzSnnedU7F9_G8l_Kvbkt_O2gKqFw7vm http://www.rfc-editor.org/rfc/rfc1035.txt http://www.rfc-editor.org/rfc/rfc3596.txt http://www.rfc-editor.org/rfc/rfc2782.txt http://www.rfc-edito…