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队列中停留的时间大于某一值的任务.现在以该工具来展示如 ...
随机推荐
- SQLServer的网络协议
一.总结 1.SQL Server访问协议包括Shared Memory.Named Pipes.TCP/IP.VIA四种,多数应用系统都是通过TCP/IP协议访问数据库.安装数据库后需要启用TCP/ ...
- 新建Servlet工程——IDEA
Servlet是sun公司提供的一套接口规范,是运行在服务端的java程序.实现了Servlet的类能够被服务器识别,而普通的java类不能被识别. 1.新建工程 2. 3.工程名字“: 4.在WEB ...
- 关于canvas合成分享图
最近在uni-app项目中遇到一个合成分享图的需求,其实最开始是用原生写法来做的,后台发现在PC端测试是可以的,但在APP模拟器中会出现问题,可能是因为两者的js环境不同吧,uni-app官网也说了这 ...
- Sentinel Cluster流程分析
前面介绍了sentinel-core的流程,提到在进行流控判断时,会判断当前是本地限流,还是集群限流,若是集群模式,则会走另一个分支,这节便对集群模式做分析. 一.基本概念 namespace:限 ...
- Spring框架学习笔记(3)——SpringMVC框架
SpringMVC框架是基于Spring框架,可以让我们更为方便的进行Web的开发,实现前后端分离 思路和原理 我们之前仿照SpringMVC定义了一个自定义MVC框架,两者的思路其实都是一样的. 建 ...
- 站内搜索(ELK)之数据目录
在使用elasticsearch建设站内搜索时,随着数据不断丰富,为了数据管理更加精细化,必须建立并实时维护“数据目录”(在程序设计中对应的叫法“数据字典”). 数据目录需要包含以下几个维度:数据名称 ...
- Python简单的抓取静态网页内容
import requests from bs4 import BeautifulSoup res = requests.get('http://news.sina.com.cn/china/')#获 ...
- Nginx+PHP7.3.9 Docker镜像制作
最近因项目需要制作了多个版本的php docker镜像,制作过程可谓是一波三折,因基于yum的方式安装php的方式在安装扩展插件时很不方便,不容易找到插件对应的yum源,所以PHP在docker镜像中 ...
- linux脚本入门之终端显示输出
主要基本命令为 echo 与 printf. 关于echo: 其语法结构为:echo -选项参数 字符串: 例如:echo hello,world echo 'hello,world' echo ...
- 当我们在聊 Serverless 时你应该知道这些
作者 | 杨泽强(竹涧)阿里云技术专家 说起当前最火的技术,除了最新的区块链.AI,还有一个不得不提的概念是 Serverless.Serverless 作为一种新型的互联网架构,直接或间接推动了云计 ...