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;它们构成了两个端点之间的虚拟通信链路…

firefox 插件开发

IDE&#xff0c;你可以尝试下NetBeans foxbeans这个插件。转载于:https://www.cnblogs.com/sode/archive/2013/01/25/2876562.html

13种负载均衡算法

目录前言&#xff08;1&#xff09;轮转调度&#xff08;Round-Robin Scheduling&#xff09;算法&#xff08;2&#xff09;加权轮转调度&#xff08;Weighted Round-Robin Scheduling&#xff09;算法&#xff08;3&#xff09;随机均衡调度&#xff08;Random Scheduling&am…

对于shell脚本参数获取时的一点小技巧

问题如下&#xff1a; 根据脚本参数的个数$#进行一个循环&#xff0c;在依次输出每个参数$1 $2 $3...... 我有一个循环变量i $i 取到这时的i为1&#xff0c;我想使用这个1再去调用$1,也是就是打印出第一个参数 就是$($i)的意思来取到第几个参数&#xff0c;当然$($i)是不好用的…

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

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

C++自动类型推导 : auto 与 decltype 用法

基本用法与区别 auto 总是推导出“值类型”&#xff0c;绝不会是“引用”,如果有引用&#xff0c;auto会把引用去掉&#xff0c;推导出值类型&#xff1b; auto 可以附加上 const、volatile、*、& 这样的类型修饰符&#xff0c;得到新的类型。 auto x 10L; // auto推导为…

C++智能指针使用指南 part1:基本使用

加粗样式>TOC 智能指针是代理模式的具体应用&#xff0c;它使用 RAII 技术代理了裸指针&#xff0c;能够自动释放内存&#xff0c; 无需程序员干预&#xff0c;所以被称为“智能指针”。 智能指针不是指针&#xff0c;而是一个对象&#xff0c;所以不要对其调用delete&…

AS3.0 BitmapData类介绍

注&#xff1a;文中的Bitmapdata和BMD均为同一意思BitmapData,BMD为其缩写一&#xff0c;概括&#xff1a; Bitmapdata继承Object对象&#xff0c;实现IBitmapDrawable接口&#xff0c;这个接口有什么用&#xff0c;你可以理解为Drawable,能被画。官方介绍是&#xff1a;IBitma…

C++使用JSON的序列化与反序列化

这里使用的json解析工具为JSON for Modern C,使用的话仅需要包含头文件。 获取方式&#xff1a;wget https://github.com/nlohmann/json/releases/download/v3.7.3/json.hpp JSON json的序列化功能和map一样&#xff0c;用关联数组的"[]"来任意添加数据&#xff0c…

iOS判断为空或者只为空格

本文转载至 &#xff1a;http://www.cnblogs.com/superhappy/archive/2012/11/08/2761403.html 经常有需求 要判断不能为空&#xff0c;后台老是鄙视不做非空判断的前端 &#xff0c;木办法 只能写一个。 第一种想法&#xff1a;我不就是判断 是不是nil就可以了么。结果发现太天…

Hyper-V

Hyper-V&#xff1a;也就是虚拟化技术&#xff0c;允许终端用户在同一台机器上运行多个操作系统&#xff0c;支持32位和64位系统&#xff0c;可以直接在Windows 8上创建自己的虚拟机。开启Hyper-V虚拟机需要更多的内存&#xff0c;正常运行需要至少4GB以上内存&#xff0c;所以…

sdut 1451 括号东东 DP

http://acm.sdut.edu.cn/sdutoj/problem.php?actionshowproblem&problemid1451 题意&#xff1a;中文..... 思路&#xff1a; pku有一道题&#xff0c;经典的括号匹配&#xff08;区间DP&#xff09;题目&#xff0c;那道题目是求的最长满足条件的子串的长度&#xff0c;那…

CDN缓存替代算法

CDN缓存工作过程如下&#xff1a;用户发出一个请求&#xff0c;如果请求被命中&#xff0c;缓存将对用户的请求进行响应&#xff0c;返回其请求的数据&#xff1b;如果未被命中&#xff0c;缓存向上拉取用户需要的数据&#xff0c;并对其存储的数据进行替换。 缓存算法的意义在…

前端开发常用正则表达式

1、电话 var phone /(^[^1][0-9\-]{6,20}$)|(^(134|135|136|137|138|139|150|151|152|157|158|159|182|183|187|188|147|130|131|132|155|156|185|186|145|133|153|180|189|181|184)\d{8}$)/ 2、邮箱 var email /^([a-zA-Z0-9_.-])([a-zA-Z0-9_-])((\.[a-zA-Z0-9_-]{2,3}){1,…

android 中调用接口发送短信

转载&#xff1a;http://ziyu-1.iteye.com/blog/1013932 android中可以通过两种方式发送短信 第一&#xff1a;调用系统短信接口直接发送短信&#xff1b;主要代码如下&#xff1a; Java代码//直接调用短信接口发短信 SmsManager smsManager SmsManager.getDefault(); List…

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

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

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

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

Java-- 异常与记录日志

可以使用java.util.logging工具将输出记录在日志中。记录日志的的功能还是很简单的&#xff0c;下面直接铺出代码&#xff1a; 1 package com.exceptions;2 3 import java.io.*;4 import java.util.logging.Logger;5 6 class LoggingException extends Exception{7 private…

图像处理基础

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