• 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. IDEA 配置Springboot项目热部署

    实现的方式概述 注意以下的热部署方式在IDEA是默认没有打开自动编译的,手动编译需要快捷键(Ctrl+Shift+F9),自动编译的修改配置如下:(注意刷新不要太快,会有1-2秒延迟) File-Se ...

  2. hbase shell命令及Java接口介绍

    一. shell命令 1. 进入hbase命令行  ./hbase shell 2. 显示hbase中的表  list3. 创建user表,包含info.data两个列族create 'user', ...

  3. Java第三次作业第二题

    2. [请复制本程序,作为java程序代码,进行编译,补充填写缺失代码部分,并实现题目要求功能,从而获得空白填写所需的内容.] 定义3个线程,模拟红绿灯的效果 一个线程控制画一个实心红圆 一个线程控制 ...

  4. git rebase 与 merge 的那些事儿~(详细图解,通俗易懂)

    什么是 rebase? git rebase 你其实可以把它理解成是"重新设置基线",将你的当前分支重新设置开始点.这个时候才能知道你当前分支于你需要比较的分支之间的差异. 原理很 ...

  5. new的执行过程

  6. JS中3种风格的For循环有什么异同?

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:https://blog.bitsrc.io/3-flavors-of-the-for-loop-i ...

  7. Javascript的基础

    ECMAScript(语法.标准) BOM(浏览器) DOM(网页) ECMAScript是一个标准,它规定了语法.类型.语句.关键字.保留子.操作符.对象.(相当于法律) BOM(浏览器对象模型): ...

  8. 基于操作系统原理的Red Hat Linux的基本操作

    一.实验目的 1.了解Linux操作系统的启动与登录方法. 2.掌握Red Hat Linux图形用户界面下的基本操作. 3.学会Red Hat Linux基本设置. 二.实验内容 1. 登录 2. ...

  9. 基于Coravel定时任务之物联网设备数量统计

    目录 基于Coravel定时任务之物联网设备数量统计 1 应用背景 2 对比各家定时库 2.1 TaskScheduler 2.2 Fluent Scheduler 2.3 Quartz.net 2. ...

  10. tomcat设置指定jdk版本

    windows 1.解压下载的tomcat; 2.找到bin下的setclasspath.bat文件:在文件的开始出添加如下代码来设定JAVA_HOME和JRE_HOME的路径: set JAVA_H ...