结合NWR,让Paxos拥有的动态的Quorum,以及在Klein中的实践

news2024/11/18 20:47:19

Paxos Quorum面临的困境

在原生的Basic-Paxos或者Multi-Paxos中,Quorum的数量要求的是多数派,例如:一个5成员组成的Paxos集群,Prepare和Accept阶段需要获得3个Acceptor的支持。

Quorum=3的条件,在原生的Paxos中是硬性条件,在一些场景中,我们需要对提案的收敛更快,也就是希望提案能尽快的达成共识,那么我们希望尽可能的减少Quorum要求的数量。

NWR

NWR是分布式一致性策略模型,通过NWR,我们可以动态调节一致性的强度,它描述的是:

  • N:在分布式存储系统中,有多少份备份数据。

  • W:代表一次成功的更新操作要求至少有w份数据写入成功 。

  • R:代表一次成功的读数据操作要求至少有R份数据成功读取。

NWR值的不同组合会产生不同的一致性效果,例如:

  • 当W + R <= N的时候,客户端可能会读取到过期的数据

  • 当W + R > N的时候,整个系统对于客户端来讲是强一致性的

Paxos结合NWR的思考

 回顾Paxos的两个阶段(Prepare和Accept),Prepare阶段的作用有两个:

1. Prepare阶段要求获得多数派的支持,目的是为了获取集群中可能达成共识的提案。
2. 如果Prepare阶段获取到多数派中任意一个Acceptor批准过某个提案,那么Accept阶段只能以该提案在集群中复制。
3. 如果Prepare阶段获取到多数派中没有一个Acceptor批准过任何提案,那么Accept阶段可以用任意提案在集群中复制。

因此我们可以认为Paxos的Prepare阶段是一个读阶段,而Accept阶段是一个写阶段。

Paxos要保证已达成共识的提案不会再改变,那么就要求Prepare(读)阶段和Accept(写)阶段有能够交流信息的媒介,因为要读阶段告诉写阶段,应该写入哪个值嘛!

那这个媒介从哪里来呢?关键就在于多数派,多数派的含义:两个多数派(Prepare阶段的多数派和Accept阶段的多数派)一定存在一个相交的成员。这个相交的成员就是交流信息的媒介,我们只需要控制这个相交成员,让这个相交的成员告诉写阶段,应该写入什么值。

验证NWR

那这个是不是很像W + R > N的场景呢。我们验证一下Paxos的两个保证:

  • 在一个instance上不会有多个提案达成共识

  • 已达成共识的提案不会改变

在一个5成员的集群中,我们设定Prepare阶段的Quorum为2,Accept阶段Quorum为4。

场景一(在一个instance上不会有多个提案达成共识),两个成员都获得Prepare的支持,都进入了Accept阶段。如下图所示:

1. A发起Prepare,proposalNo=1,获得了Quorum的支持
2. C发起Prepare,proposalNo=2,获得了Quorum的支持
3. A发起Accept,但是CD的propsalNo大于A,所以A未能达成共识
4. C发起Accept,但是CD的propsalNo大于A,达成共识

bba72203a64d0782828bdde912d2132e.png

综上仍然只有一个提案达成共识。另外,假如第4步,C失败了。B发起Prepare,但是收到A和C提出的不同的提案应该怎么选择,这里还是跟原生Paxos一样,选择proposalNo大的那个。

场景二(已达成共识的提案不会改变),A已达成共识的提案,会不会因为B的协商而改变。如下图所示:

1. A发起Prepare,proposalNo=1,获得了Quorum的支持
2. A发起Accept,获得了Quorum的支持,已达成共识
3. C发起Prepare,proposalNo=1,获得Quorum的支持,但是收到C和D已批准提案的响应
4. C发起Accept,用C和D已批准提案的进行协商

bfb7b9fa2852fe681367ac628d32e367.png

综上已达成共识的提案不会再改变。

在Klein中的实践

Klein(https://github.com/shihuili1218/klein)是一个基于 Paxos 的分布式集合工具库,包括分布式ArrayList、分布式 HashMap、分布式缓存、分布式锁等。

定义NWR接口,为了让用户自己实现NWR策略,这里提供SPI接口

@SPI
public interface Nwr {
    /**
     * calculate read quorum.
     *
     * @param n total size
     * @return read quorum
     */
    int r(int n);


    /**
     * calculate write quorum.
     *
     * @param n total size
     * @return write quorum
     */
    int w(int n);
}

定义NWR策略为R = N,W = 1,这样可以最大限度加快协商收敛,让提案尽快达成共识,只需要等到一个成员的批准,就认为已经达成共识了。

@Join
public class FastWriteNwr implements Nwr {
    @Override
    public int r(final int n) {
        return n;
    }


    @Override
    public int w(final int n) {
        return 1;
    }
}

在初始化的时候使用FastWriteNwr,

public ProposeContext(final PaxosMemberConfiguration memberConfiguration, final Holder<Long> instanceIdHolder, final List<ProposalWithDone> events) {
        this.memberConfiguration = memberConfiguration;
        this.instanceIdHolder = instanceIdHolder;
        this.dataWithCallback = ImmutableList.copyOf(events);
        this.prepareQuorum = QuorumFactory.createReadQuorum(memberConfiguration);
        this.prepareNexted = new AtomicBoolean(false);
        this.acceptQuorum = QuorumFactory.createWriteQuorum(memberConfiguration);
        this.acceptNexted = new AtomicBoolean(false);
    }
    
    public static Quorum createWriteQuorum(final MemberConfiguration memberConfiguration) {
        Nwr nwr = ExtensionLoader.getExtensionLoader(Nwr.class).getJoin();
        LOG.debug("create write quorum, nwr: {}", nwr.getClass());
        if (CollectionUtils.isEmpty(memberConfiguration.getLastMembers())) {
            return new SingleQuorum(memberConfiguration.getEffectMembers(),
                    nwr.w(memberConfiguration.getEffectMembers().size()));
        } else {
            return new JoinConsensusQuorum(memberConfiguration.getEffectMembers(), memberConfiguration.getLastMembers(),
                    nwr.w(memberConfiguration.getAllMembers().size()));
        }
    }
    
    public static Quorum createReadQuorum(final MemberConfiguration memberConfiguration) {
        Nwr nwr = ExtensionLoader.getExtensionLoader(Nwr.class).getJoin();
        LOG.debug("create read quorum, nwr: {}", nwr.getClass());


        if (CollectionUtils.isEmpty(memberConfiguration.getLastMembers())) {
            return new SingleQuorum(memberConfiguration.getEffectMembers(),
                    nwr.r(memberConfiguration.getEffectMembers().size()));
        } else {
            return new JoinConsensusQuorum(memberConfiguration.getEffectMembers(), memberConfiguration.getLastMembers(),
                    nwr.r(memberConfiguration.getAllMembers().size()));
        }
    }

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

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

相关文章

NTP服务器(GPS北斗授时服务器)的市场需求及性能分析

NTP服务器&#xff08;GPS北斗授时服务器&#xff09;的市场需求及性能分析 NTP服务器&#xff08;GPS北斗授时服务器&#xff09;的市场需求及性能分析 目前国内NTP时间服务器时间精度已达到毫秒级&#xff0c;能够满足各个行业对时间同步运转的要求&#xff1b;有些企业需要…

QtitanComponents Solution 2022.4.0 Crack

2022-12-29 开始开发基于Adobe XD文件的Qt样式创建工具 包括&#xff1a; QtitanDataGrid QtitanRibbon QtitanNavigationDesignUI QtitanChart QtitanDocking QtitanFastInfoset 不要问我源码&#xff0c;没有&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#x…

Spring Boot 加载外部配置文件

Spring Boot 允许你从外部加载配置&#xff0c;这样的话&#xff0c;就可以在不同的环境中使用相同的代码。支持的外部配置源包括&#xff1a;Java属性文件、YAML文件、环境变量、命令行参数。用Value注解可以将属性值直接注入到beans中。命令行参数以 -- 开头配置文件加载的顺…

数据结构学习

数据结构 单值二叉树 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff1b;否则返回 false。 类似上述图中&#xff0c;所有结点都为1&#xff0c;那么返回true&#xff0c;只要有一个结…

QT智能停车管理系统

智能停车管理系统 密级Confidentiality level 需求说明书 内部公开 产品版本Product version Total pages 共 7页 V100R001 智能停车管理系统项目 需求规格说明书 拟制人&#xff1a; 孙献 时间&#xff1a; 2023.1.7 评审人&#xff1a; 覃丽红 时间&#xff1a;…

Java项目:网上水果超市商城设计和实现(java+SSM+springboot+redis)

源码获取&#xff1a;本博客首页 "资源" 处下载&#xff01; 主要技术实现&#xff1a;spring、 springmvc、 redis、 springboot、 mybatis 、session、 jquery 、 md5 、bootstarp.js tomcat、、拦截器等。 主要功能实现&#xff1a; 前端&#xff1a;登录、注册…

Instagram 账号被封如何申诉拿回账号?ins账号解封经验分享

不知道各位在玩转海外社媒平台时有没有遇到过Instagram账号异常的情况&#xff0c;比如会出现账号受限、帖子发不出去、账号被封号等情况? Instagram账号如果被封不用马上弃用&#xff0c;我们可以先尝试一下申诉&#xff0c;看看能不能把账号解封。所以今天东哥将会出一篇Ins…

94、【树与二叉树】leetcode ——110. 平衡二叉树(C++版本)

题目描述 原题链接&#xff1a;110. 平衡二叉树 解题思路 一、后序遍历&#xff08;自底向上&#xff09; 在这里要和 90、【树与二叉树】leetcode ——104. 二叉树的最大深度&#xff1a;层次遍历DFS子问题分解&#xff08;C版本&#xff09; 这个作比较。 深度&#xff0…

黑马前端毕业生面试攻略

为不断提升学生就业质量&#xff0c;黑马上海校区率先实施“新就业模式”&#xff0c;采用精细化管理&#xff0c;将就业动作拆解到了课程周期内的各个阶段&#xff0c;提前制定和铺垫课程阶段对应的就业动作目标和重点&#xff0c;并严格落实把控&#xff0c;更高效地完成学生…

JavaScript Event对象

文章目录JavaScript Event对象概述Event对象属性方法event对象常用属性typekeyCode获取Event对象兼容代码获取事件的目标对象target属性和currentTarget属性JavaScript Event对象 概述 事件在浏览器中是以Event对象的形式存在的&#xff0c;每触发一个事件&#xff0c;就会产…

【魅力开源】第2集:三个人每人一个想法会发生什么故事?关于Odoo的江湖

文章目录一. 关于权限控制&#xff1a;组织、角色、人员权限的说明二. 关于快速批量功能&#xff1a;有一些事情可以交给电脑来做三. 关于可以拖拉拽应用&#xff1a;技术模块3.1 可配置的MVC3.2 简单开发下附件模块也可用来作为企业的知识沉淀3.3 多语言支持&#xff1a;对于跨…

第五届“泰迪杯”数据分析技能赛 经验代码分享

第五届“泰迪杯”数据分析技能赛 经验/代码分享 品牌&#xff1a;“泰迪杯”数据分析技能赛 组织单位&#xff1a;泰迪杯数据分析技能赛组织委员会、广东泰迪智能科技股份有限公司、广东省工业与应用数学学会、人民邮电出版社、北京泰迪云智信息技术研究院、网宿科技股份有限…

内存管理详解

目录 一、C/C中内存分布 二、C语言的内存管理方式 三、C的内存管理方式 3.1 new/delete操作内置类型 3.2 new/delete操作自定义类型 3.3 operator new()和operator delete()函数 3.4 重载operator new()和operator delete() 四、new、delete的实现原理 4.1 内置类型 …

(02)Cartographer源码无死角解析-(50) 2D点云扫描匹配→相关性暴力匹配2:RealTimeCorrelativeScanMatcher2D

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…

【论文速递】TPAMI2022 - 小样本分割的整体原型激活

【论文速递】TPAMI2022 - 小样本分割的整体原型激活 【论文原文】&#xff1a;Holistic Prototype Activation for Few-Shot Segmentation 获取地址&#xff1a;https://ieeexplore.ieee.org/document/9839487 CSDN下载&#xff1a;https://download.csdn.net/download/qq_36…

三十、RabbitMQ(1)

&#x1f33b;&#x1f33b; 目录一、 关于中间件的概述二、基于消息中间件的分布式系统的架构2.1 消息中间件应用的场景2.2 常见的消息中间件2.3 消息中间件的本质及设计2.4 消息中间件的核心组成部分2.5 小总结三、消息队列协议3.1 什么是协议3.2 网络协议的三要素3.3 AMQP 协…

JAVA 23种设计模式示例

目录 一.单例模式 二.工厂方法模式 三.抽象工厂模式 四.建造者模式 五.原型模式 六.享元模式 七.门面模式 八.适配器模式 九.装饰者模式 十.策略模式 十一.模板方法模式 十二.观察者模式 十三.责任链模式 十四.代理模式 十五.桥接模式 十六.组合模式 十七.命令…

openGauss数据库PostGIS 安装与使用

目录 概述 1.PostGIS 安装 1.1 GCC-7.3编译器安装 1.2PostGIS依赖库安装 1.3.安装Postgis 2.使用Extension 2.1创建PostGIS Extension 2.2使用Extension 2.3删除Extension 概述 PostGIS Extension是PostgreSQL的空间数据库扩展&#xff0c;提供如下空间信息服务功能&…

SpringBoot+VUE前后端分离项目学习笔记 - 【21 权限菜单 中】

1 新建了sys_dict表以及相应Dict类保存菜单menu的icon数据 2 新建了sys_role_menu表以及相应RoleMenu类保存前端Role页面传来的角色菜单ID的绑定关系 3 在MenuController里增加获取Dict里icon的方法 提供前端菜单页面显示 4 在RoleController增加Post接口&#xff0c;获取前台传…

66页3万字医疗行业大数据治理解决方案

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 目 录 1. 1、医疗行业大数据管…