理解分布式一致性:Paxos协议之Generalized Paxos Byzantine Paxos

2024-02-24 17:18

本文主要是介绍理解分布式一致性:Paxos协议之Generalized Paxos Byzantine Paxos,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

理解分布式一致性:Paxos协议之Generalized Paxos & Byzantine Paxos

  • Generalized Paxos
  • Byzantine Paxos
    • Byzantine Multi-Paxos
    • Fast Byzantine Multi-Paxos

在前面一篇文章我们讲到了理解分布式一致性:Paxos协议之Cheap Paxos & Fast Paxos,本篇文章我会讲解Paxos协议的另外两个变种:Generalized Paxos和Byzantine Paxos。

Generalized Paxos

我们大家都知道,分布式一致性的最大问题就是数据同步的问题,而产生问题的原因就是冲突,按照之前讲到的各种Paxos协议方案,发生了冲突之后就必须解决冲突然后重新发送请求,这样就会提高数据同步的成本和时间,那么有没有更好的方式来解决这个问题呢?

答案肯定是有。在分布式系统中,冲突是不可避免的,遇到冲突的时候是不是每次都解决冲突然后重新发送请求呢?我们举个例子:

如果Client1发送请求ReadA,Client2 发送请求ReadB,系统4个Acceptors,有2个接收ReadA,有2个接收ReadB,在共识层面来说,因为没有达到最大的共识个数,达不成共识,需要重新发送。但是如果我们仔细观察一下两个请求,ReadA,ReadB这两个命令是没有任何联系的,无论先执行哪一个都是同样的效果。那么我们可以认为这种情况是没有冲突的,我们在执行层面自行安排两个请求的顺序,而不用再次共识。 这就叫做Generalized Paxos。

这种共识的前提就是不同命令的先后顺序无关。下面以序列图的形式更加详细的介绍:

Client1 Client2 Leader Acceptor1 Acceptor2 Acceptor3 Learner Accept!(ReadA) Accept!(ReadA) Accept!(ReadA) Accept!(ReadA) Accept!(ReadB) Accept!(ReadB) Accept!(ReadB) Accept!(ReadB) Leader and Acceptor1 Accepted(N,<ReadA,ReadB>), Acceptor2 and Acceptor3 Accepted(N,<ReadB,ReadA>), 顺序无关,不冲突,最终值 Accepted(N,<ReadA,ReadB>) Accepted(N,<ReadA,ReadB>) Accepted(N,<ReadA,ReadB>) Accepted(N,<ReadA,ReadB>) Accepted(N,<ReadA,ReadB>) 下面是冲突的情况 ,WriteA和 ReadA同时发 生,产生冲突时, Leader自行 解决冲突,需要重 发请求 Accept!(ReadA) Accept!(ReadA) Accept!(ReadA) Accept!(ReadA) Accept!(WriteA) Accept!(WriteA) Accept!(WriteA) Accept!(WriteA) Accepted(N,<ReadA,WriteA>) Accepted(N,<ReadA,WriteA>) Accepted(N,<WriteA,ReadA>) Accepted(N,<WriteA,ReadA>) 冲突产生, Leader根据协议自行决定执行顺序,这里是<ReadA,WriteA>,N+1 Accept!(N+1,<ReadA,WriteA>) Accept!(N+1,<ReadA,WriteA>) Accept!(N+1,<ReadA,WriteA>) Accepted(N+1,<ReadA,WriteA>) Accepted(N+1,<ReadA,WriteA>) Accepted(N+1,<ReadA,WriteA>) Client1 Client2 Leader Acceptor1 Acceptor2 Acceptor3 Learner

Byzantine Paxos

最后一个我们要讲的Paxos协议是Byzantine Paxos。熟悉虚拟货币的人应该对拜占庭协议并不陌生,这里我们也不多讲拜占庭协议,后面我会用单独的文章来详细介绍拜占庭协议。

上面我们讲到的所有的Paxos协议,只讲到了服务出错的情况,并没有考虑服务伪造篡改信息的情况,即并没有考虑到恶意节点。而拜占庭协议就是为了解决这个问题而产生的。

Byzantine Paxos比正常的Paxos协议多了一个消息验证的过程,这个验证使用了拜占庭协议。

Byzantine Multi-Paxos

下面是个Byzantine Multi-Paxos的序列图:

Client Proposer Acceptor1 Acceptor2 Acceptor3 Learner Request Accept!(N,I,V) Accept!(N,I,V) Accept!(N,I,V) 验证消息 Verify(N,I,V) - BROADCAST Verify(N,I,V) - BROADCAST Verify(N,I,V) - BROADCAST Verify(N,I,V) - BROADCAST Accepted(N,V) Accepted(N,V) Accepted(N,V) Accepted(N,V) Accepted(N,V) Accepted(N,V) Response(V) Client Proposer Acceptor1 Acceptor2 Acceptor3 Learner

Fast Byzantine Multi-Paxos

同样的也会有Fast Byzantine Multi-Paxos,为了更加Fast,本协议将Verify和Accepted进行融合,放在一步完成。

Client Acceptor1 Acceptor2 Acceptor3 Learner Accept!(N,I,V) Accept!(N,I,V) Accept!(N,I,V) 验证消息,同时 Accepted Accepted(N,I,V) - BROADCAST Accepted(N,I,V) - BROADCAST Accepted(N,I,V) - BROADCAST Accepted(N,I,V) - BROADCAST Accepted(N,I,V) - BROADCAST Accepted(N,I,V) - BROADCAST Accepted(N,I,V) - BROADCAST Response(V) Client Acceptor1 Acceptor2 Acceptor3 Learner

更多精彩内容且看:

  • 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
  • Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  • Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
  • java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程

更多教程请参考flydean的博客

这篇关于理解分布式一致性:Paxos协议之Generalized Paxos Byzantine Paxos的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

深入理解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影响与危

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

深入理解C++ 空类大小

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

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

Redis分布式锁使用及说明

《Redis分布式锁使用及说明》本文总结了Redis和Zookeeper在高可用性和高一致性场景下的应用,并详细介绍了Redis的分布式锁实现方式,包括使用Lua脚本和续期机制,最后,提到了RedLo... 目录Redis分布式锁加锁方式怎么会解错锁?举个小案例吧解锁方式续期总结Redis分布式锁如果追求

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

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

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