• Leader选举

    Ceph中的leader选举是一个Paxos Lease过程,与BasicPaxos的目的不同。后者用于解决数据一致性问题,而Paxos Lease是为了选举出一个leader承担monmap的同步任务,并负责在该leader离线之后选出新的leader。Ceph集群中只会有一个monitor作为leader,是当前所有monitor中rank值最小的那个。选举过程会产生leader和quorum成员,即所有支持leader当选的monitor。Quorum是Monitor中的多数派,也就是说它的成员数目必须大于N/2+1N为Monitor节点数目。

     
     

    Paxos Lease过程可以简述如下:

    Phase1-a:Proproser参与

    • Proproser向各个Acceptor发送Prepare消息;
    • 设置定时器Tp,在r时间后超时,超时后需要重发Prepare消息。

    Phase1-b:Proposer和Acceptor参与

    • Acceptor收到Prepare消息后,需要检查Prepare消息携带的版本号V,如果版本号比自身已接受的要大,则接受此消息,并向Proposer回复Promise消息,承诺不会接受版本号小于V的Prepare消息;
    • Proposer收到Promise消息后,统计批准版本V的Acceptor数量,如果超过半数,则认为此版本为当前最新的(可以提交)。

    Phase2-a:Proposer参与

    • Proposer重设定时器Tp,向各个Acceptor发送AcceptRequest消息;

    Phase2-b:Proposer、Acceptor和Learner参与

    • Acceptor收到AcceptRequest消息,向Proposer发送Accepted消息;
    • Proposer接受Accepted消息,如果发送者数量超过半数,则认为已经成为Leader。随后向Learner要求版本同步;
    • Learner收到版本消息后,重启Tp,准备在定时器触发后重新开始选举过程。

     
     

    Ceph中的Leader选举可以分为三个步骤:

    • Proposer提出提案,发送propose消息给所有的monitor节点;
    • monitor节点收到消息后,接受或拒绝propose;
    • Proposer接收ack消息,根据数量统计出支持者数量,如果超过半数则向其他节点发送victory消息,赢得选举。

    epoch值在leader选举中有非常重要的作用:正常情况下各monitor之间的epoch值相等,当monitor离线后,epoch值保存在数据库中。当它重新上线后,自己的epoch值要比其他monitor小。这样acceptor可以根据对方发过来的epoch值判断PN是不是最新的。还有就是如果epoch值为奇数,说明该monitor处于选举状态。选举完成后,epoch变为偶数并同步到所有quorum成员。

    Leader选举主要流程请参见下图:

  • Recovery阶段

    当发出OP_COLLECT消息之后,Cpeh集群就进入了Recovery阶段,该阶段的目的是保证所有Monitor之间的monmap版本一致,具体包括最后一个批准(Committed)的提案,最后一个没批准的提案,最后一个接受(Acceppted)的提案。对旧Quorum的所有成员来说,最后一个通过的提案应该都是相同的,但对不属于旧Quorum的成员来说,它的最后一个通过的提案是落后的。

    下图从Paxos::collect()开始描述了本阶段各网元的主要活动:

  • Lease阶段

    Lease阶段在Leader发出begin消息后开始。经典Paxos算法分为Prepare和Accept两个阶段。在Prepare阶段,Proposer向所有Acceptor发送Prepare消息,内容为<SNp,Vp>;Acceptor接到此消息后,检查自身回复过的prepare请求的最大值SNa:

    • 如果SNa>SNp,则忽略此请求;
    • 否则(此时SNp>SNa)检查上次批准过的accept请求<SNx,Vx>,并回复之;
    • 如果此前并未接受过请求,则直接回复OK。

      Proposer收到若干Acceptor的回复后,可分为以下几种情况处理:

    • 回复Acceptor超过半数,且所有回答都是OK,说明本次欲提交的值之前不存在,可以直接通过accept消息提交;
    • 回复Acceptor超过半数,但是携带了此前接受过的V,例如<SN2,V2>,<SN3,V3>。此时Proposer应选择其中编号最大的那个,并将accept消息的内容修改为<SNp,V3>(注意编号不变);
    • 回复Acceptor不超过半数,那递增SNp继续发送prepare消息,若干轮之后Proposer总能提交最新的提案。

    随后Proposer将开始发送Accept消息。Acceptor接受后分为两种情况处理:

    • 检查回复过的prepare请求的最大编号,如果SNa>SNp,则忽略此消息;
    • 否则向Proposer和Learner发送Accepted消息。对于Learner,由于Acceptor之间彼此不知道该轮通过的决议是什么,所以倾向于由Proposer向各个Learner发送<SNp, Vp>完成学习过程。

    对于Ceph而言,总体行为与Paxos算法一致。但是略有差异:Prepare阶段的活动已经在Recovery阶段完成。Peon将自己已接受的最大提案号同步给Leader,这与Paxos中的Promise消息携带着Acceptor已接受的最大提案号是一致的。随后Leader和Peon已接受的最大提案号已经相同,则Leader可以保证自己的提案是未被批准过的,且只有自己才有资格预提交,避免了活锁问题。接下来,Ceph的Lease阶段活动就是Paxos过程中Accept阶段的直接映射。

     
     

Ceph Paxos相关代码解析的更多相关文章

  1. linux内存管理--slab及其代码解析

    Linux内核使用了源自于 Solaris 的一种方法,但是这种方法在嵌入式系统中已经使用了很长时间了,它是将内存作为对象按照大小进行分配,被称为slab高速缓存. 内存管理的目标是提供一种方法,为实 ...

  2. MYSQL常见出错mysql_errno()代码解析

    如题,今天遇到怎么一个问题, 在理论上代码是不会有问题的,但是还是报了如上的错误,把sql打印出來放到DB中却可以正常执行.真是郁闷,在百度里面 渡 了很久没有相关的解释,到时找到几个没有人回复的 & ...

  3. Postgres中postmaster代码解析(中)

    今天我们对postmaster的以下细节进行讨论: backend的启动和client的连接请求的认证 客户端取消查询时的处理 接受pg_ctl的shutdown请求进行shutdown处理 2.与前 ...

  4. js 横屏 竖屏 相关代码 与知识点

    <!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...

  5. Hadoop NameNode元数据相关文件目录解析

    在<Hadoop NameNode元数据相关文件目录解析>文章中提到NameNode的$dfs.namenode.name.dir/current/文件夹的几个文件: 1 current/ ...

  6. OpenStack之虚机热迁移代码解析

    OpenStack之虚机热迁移代码解析 话说虚机迁移分为冷迁移以及热迁移,所谓热迁移用度娘的话说即是:热迁移(Live Migration,又叫动态迁移.实时迁移),即虚机保存/恢复(Save/Res ...

  7. RobHess的SIFT代码解析步骤三

    平台:win10 x64 +VS 2015专业版 +opencv-2.4.11 + gtk_-bundle_2.24.10_win32 主要参考:1.代码:RobHess的SIFT源码 2.书:王永明 ...

  8. Python中sort和sorted函数代码解析

    Python中sort和sorted函数代码解析 本文研究的主要是Python中sort和sorted函数的相关内容,具体如下. 一.sort函数 sort函数是序列的内部函数 函数原型: L.sor ...

  9. BPF CO-RE 示例代码解析

    BPF CO-RE 示例代码解析 在BPF的可移植性和CO-RE一文的末尾提到了一个名为runqslower的工具,该工具用于展示在CPU run队列中停留的时间大于某一值的任务.现在以该工具来展示如 ...

随机推荐

  1. cmd中添加目录md

    md 创建目录. MKDIR [drive:]pathMD [drive:]path 如果命令扩展被启用,MKDIR 会如下改变: 如果需要,MKDIR 会在路径中创建中级目录.例如: 假设 \a 不 ...

  2. Android MediaPlayer 播放音频

    本文链接: Android MediaPlayer 播放音频 主要介绍使用MediaPlayer播放音频的方式.关于MediaPlayer的基础知识,比如状态,可以参考Android MediaPla ...

  3. 04.Django基础四之模板系统

    一 语法 模板渲染的官方文档 关于模板渲染你只需要记两种特殊符号(语法): {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 二 变量 在Django的模板语言中按此语法使用:{ ...

  4. vue2.0生成二维码图片并且下载图片到本地兼容写法

    vue生成二维码图片,这里使用的是qrcode.js 这个插件(亲测写法,兼容没有问题) 第一步,下载插件 需要注意,这里下载的是qrcodejs2 cnpm install --save qrcod ...

  5. 代码审计之XSS及修复

    xss在平时的测试中,还是比较重要的,如果存在储存型xss,就可以做很多事情了,打cookie,添加管理员等等很多操作. 以下所有代码都是我自己写的,可能有不美观,代码错误等等问题,希望大家可以指正. ...

  6. 编程范式 --- 函数式编程(Funtional Programming,简称FP)

    函数式编程(Funtional Programming,简称FP)是一种编程范式,也就是如何编写程序的方法论 主要思想:把计算过程尽量分解成一系列可复用函数的调用 主要特征:函数是"第一等公 ...

  7. 针对媒体不实报道误导大众--抹黑C#工资垫底

    最近注意到一些媒体故意抹黑C# 工资垫底,参见 https://www.toutiao.com/i6741889572931633668/: 通过搜索引擎搜索<编程语言薪酬排行:Python薪资 ...

  8. 一个低级错误引发Netty编码解码中文异常

    前言 最近在调研Netty的使用,在编写编码解码模块的时候遇到了一个中文字符串编码和解码异常的情况,后来发现是笔者犯了个低级错误.这里做一个小小的回顾. 错误重现 在设计Netty的自定义协议的时候, ...

  9. 【原创】(六)Linux内存管理 - zoned page frame allocator - 1

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  10. WCF客户端简单动态配置服务地址

    本来想实现WCF服务无论放到哪个机器上,我的客户端都不需要重新编译,只需要配置一个服务的地址即可.各种百度找到了很多解决方案.但都比较繁琐,(只要因为个人小菜看不懂太多的代码)我对WCF内部机制还不了 ...