Ceph Paxos相关代码解析
- 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+1,N为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相关代码解析的更多相关文章
- linux内存管理--slab及其代码解析
Linux内核使用了源自于 Solaris 的一种方法,但是这种方法在嵌入式系统中已经使用了很长时间了,它是将内存作为对象按照大小进行分配,被称为slab高速缓存. 内存管理的目标是提供一种方法,为实 ...
- MYSQL常见出错mysql_errno()代码解析
如题,今天遇到怎么一个问题, 在理论上代码是不会有问题的,但是还是报了如上的错误,把sql打印出來放到DB中却可以正常执行.真是郁闷,在百度里面 渡 了很久没有相关的解释,到时找到几个没有人回复的 & ...
- Postgres中postmaster代码解析(中)
今天我们对postmaster的以下细节进行讨论: backend的启动和client的连接请求的认证 客户端取消查询时的处理 接受pg_ctl的shutdown请求进行shutdown处理 2.与前 ...
- js 横屏 竖屏 相关代码 与知识点
<!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...
- Hadoop NameNode元数据相关文件目录解析
在<Hadoop NameNode元数据相关文件目录解析>文章中提到NameNode的$dfs.namenode.name.dir/current/文件夹的几个文件: 1 current/ ...
- OpenStack之虚机热迁移代码解析
OpenStack之虚机热迁移代码解析 话说虚机迁移分为冷迁移以及热迁移,所谓热迁移用度娘的话说即是:热迁移(Live Migration,又叫动态迁移.实时迁移),即虚机保存/恢复(Save/Res ...
- RobHess的SIFT代码解析步骤三
平台:win10 x64 +VS 2015专业版 +opencv-2.4.11 + gtk_-bundle_2.24.10_win32 主要参考:1.代码:RobHess的SIFT源码 2.书:王永明 ...
- Python中sort和sorted函数代码解析
Python中sort和sorted函数代码解析 本文研究的主要是Python中sort和sorted函数的相关内容,具体如下. 一.sort函数 sort函数是序列的内部函数 函数原型: L.sor ...
- BPF CO-RE 示例代码解析
BPF CO-RE 示例代码解析 在BPF的可移植性和CO-RE一文的末尾提到了一个名为runqslower的工具,该工具用于展示在CPU run队列中停留的时间大于某一值的任务.现在以该工具来展示如 ...
随机推荐
- CentOS7上OpenResty安装
1,OpenResty安装 通过repl源安装: sudo yum-config-manager --add-repo https://openresty.org/yum/cn/centos/Open ...
- spring boot的多环境部署
需求:不同的环境有不同的开关属性,比如开发系统,需要关闭短信,微信的通知功能.而演示环境,线上环境则需要打开这些配置. 那么,如何做到呢?--->在properties.application配 ...
- 使用PrepareStatement
包结构: 第一步:编写获取连接工具类 package com.atguigu.jdbc; import java.io.IOException; import java.io.InputStream; ...
- Docker详解(三)
目录 1. Docker镜像 1.1 镜像存储 1.2 base镜像 1.3 镜像Commit 2. Docker容器数据卷 2.1 基本介绍 2.2 数据卷 2.3 数据卷容器 序言:前两章我们主要 ...
- Elasticsearch(9) --- 聚合查询(Bucket聚合)
Elasticsearch(9) --- 聚合查询(Bucket聚合) 上一篇讲了Elasticsearch聚合查询中的Metric聚合:Elasticsearch(8) --- 聚合查询(Metri ...
- 接口是什么?接口长什么样?java的Interface
今天来看看java接口长哪样.接口是特殊抽象类. 一个子类只能继承一个抽象类(父类),所以就有接口这个特殊抽象类. 下面以一个电脑的USB为例: 定义接口标准 public interface USB ...
- Redis-->windows上的安装教程
Windows下安装Redis服务 说明:本文拷贝自http://www.cnblogs.com/jaign/articles/7920588.html Redis是有名的NoSql数据库,一般Lin ...
- C语言I博客作业
|这个作业属于哪个课程 | C语言程序设计I | | ---- | ---- | |对这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/SE2019-2 ...
- python爬取哦漫画
import requests from lxml import etree from bs4 import BeautifulSoup import os from selenium import ...
- Shell之命令执行的判断依据
目录 Shell之命令执行的判断依据 参考 Shell之命令执行的判断依据