Ceph Monitor实现

在之前的一篇博客Ceph Monitor and Paxos中介绍了Ceph Monitor利用改进的Paxos算法,以集群的形式对外提供元信息管理服务。本文讲分别从Ceph Monitor的架构,其初始化过程、选主过程、Recovery过程、读写过程、状态转换六个方面介绍Ceph Monitor的实现。本文假设读者已经了解Paxos算法的基本过程,了解Prepare、Promise、Commit、Accept、Quorum等概念。注意Ceph Monitor中的Accept概念其实相当于Paxos中的Promise。

架构

Ceph Monitor Architecture

上图所示是Ceph Monitor的结构图,自下而上有以下几个部分组成:

  • DBStore层:数据的最终存储组件,以leveldb为例;
  • Paxos层:在集群上对上层提供一致的数据访问逻辑,在这一层看来所有的数据都是kv;上层的多中PaxosService将不同的组件的map数据序列化为单条value,公用同一个paxos实例。
  • PaxosService层:每个PaxosService代表集群的一种状态信息。对应的,Ceph Moinitor中包含分别负责OSD Map,Monitor Map, PG Map, CRUSH Map的几种PaxosService。PaxosService负责将自己对应的数据序列化为kv写入Paxos层。Ceph集群所有与Monitor的交互最终都是在调用对应的PaxosSevice功能。

初始化

Ceph Monitor Initial

可以看出,Ceph Monitor在启动节点端,主要做了三件事情:

  • 自下而上依次初始化上述的三大组成部分:DBStroe,Paxos,PaxoService
  • 初始化Messager,并向其中注册命令执行回调函数。Messager是Ceph中的网络线程模块,Messager会在收到网络请求后,回调Moniotor在初始化阶段注册命令处理函数。
  • Bootstrap过程在整个Monitor的生命周期中被反复调用,下面就重点介绍一下这个过程。

Boostrap

  • 执行Boostrap的Monitor节点会首先进入PROBING状态,并开始向所有monmap中其他节点发送Probing消息。
  • 收到Probing消息的节点执行Boostrap并回复Probing_ack,并给出自己的last_commit以及first_commit,其中first_commit指示当前机器的commit记录中最早的一条,其存在使得单个节点上可以仅保存最近的几条记录。
  • 收到Probing_ack的节点发现commit数据的差距早于对方first_commit,则主动发起全同步,并在之后重新Boostrap
  • 收到超过半数的ack并不需要全同步时,则进入选主过程。

上述交互过程见下图:

Ceph Monitor Boostrap

目的:可以看出,经过了Boostrap过程,可以完成以下两步保证:

  • 可以与超过半数的节点通信;
  • 节点间commit数据历史差距不大。

选主

接着,节点进入选主过程:

  • 将election_epoch加1,向Monmap中的所有其他节点发送Propose消息;
  • 收到Propose消息的节点进入election状态并仅对有更新的election_epoch且rank值大于自己的消息答复Ack。这里的rank简单的由ip大小决定;
  • 发送Propose的节点统计收到的Ack数,超时时间内收到Monmap中大多数的ack后可进入victory过程,这些发送ack的节点形成quorum;

victory

  • election_epoch加1,可以看出election_epoch的奇偶可以表示是否在选举轮次;
  • 向quorum中的所有节点发送VICTORY消息,并告知自己的epoch及quorum;
  • 当前节点完成Election,进入Leader状态;
  • 收到VICTORY消息的节点完成Election,进入Peon状态

上述交互过程见下图:

Ceph Monitor Election

目的:可以看出,Monitor选主过程的目的如下:

  • 简单的根据ip大小选出leader,而并没有考虑commit数据长度;
  • 确定quroum,在此之前所有的操作都是针对Monmap内容的,直到这里才有了quroum,之后的所有Paxos操作便基于当前这个quorum了。

RECOVERY阶段

经过了上述的选主阶段,便确定了leader,peon角色,以及quorum成员。在真正的开始一致性读写之前,还需要经过RECOVERY阶段:

  • leader生成新的更大的新的pn,并通过collect消息发送给所有的quorum中成员;
  • 收到collect消息的节点当pn大于自己已经accept的最大pn时,接受并通过last消息返回自己的commit位置及uncommitted;
  • leader收到last消息,更新自己的commit位置及数据,并重复提升pn发送collect消息的过程,直到quorum中所有的节点都接受自己。
  • 同时leader会根据收到的commit及uncommitted位置,分别用commit消息和begin消息更新对应的peon;
  • leader向quorum中所有节点发送lease消息,使整个集群进入active状态。

这个阶段的交互过程如下图:

Ceph Monitor Collect

目的

  • 将leader及quorum节点的数据更新到最新且一致;
  • 整个集群进入可用状态。

读写流程

经过了上面的初始化、选主、恢复阶段整个集群进入到一个非常正常的状况,终于可以利用Paxos进行一致性地读写了,其中读过程比较简单,在lease内的所有quroum均可以提供服务。而所有的写都会转发给leader,写过程如下:

  • leader在本地记录要提交的value,并向quroum中的所有节点发送begin消息,其中携带了要提交的value, accept_pn及last_commit;
  • peon收到begin消息,如果accept过更高的pn则忽略,否则将value写入db并返回accept消息。同时peon会将当前的lease过期掉,在下一次收到lease前不再提供服务;
  • leader收到全部quorum的accept后进行commit。本地commit后向所有quorum节点发送commit消息;
  • peon收到commit消息,本地commit数据;
  • leader通过lease消息将整个集群带入到active状态。

交互过程如下:

Ceph Monitor Write

目的

  • 由leader发起propose,并依次完成写入,一个value完成commit才会开始下一个;
  • 通过lease分担读压力。

数据存储:我们知道commit以后的数据才算真正写入到集群,那么为什么在begin过程中,leader和peon都会将数据写入db呢?这是因为Ceph Montor利用db来完成了log和value两部分数据的存储,而commit时会将log数据反序列化后以value的格式重新存储到db。

状态

在Monitor的生命周期,贯穿于上述各个过程的包括两个层面的状态转换,Monitor自身的状态,以及Monitor进入主从状态后,其Paxos过程中的状态。

Monitor状态转换
Ceph Monitor Status
  • STATE_PROBING:boostrap过程中节点间相互探测,发现数据差距;
  • STATE_SYNCHRONIZING:当数据差距较大无法通过后续机制补齐时,进行全同步;
  • STATE_ELECTING:Monitor在进行选主
  • STATE_LEADER:当前Monitor成为leader
  • STATE_PEON:非leader节点
Paxos状态转换
Ceph Monitor Paxos Status
  • STATE_RECOVERING:对应上述RECOVERING过程;
  • STATE_ACTIVE:leader可以读写或peon拥有lease;
  • STATE_UPDATING(STATE_UPDATING_PREVIOUS):向quroum发送begin,等待accept;
  • STATE_WRITING(STATE_WRITING_PREVIOUS):收到accept
  • STATE_REFRESH:本地提交并向quorum发送commit;

参考:

RADOS: A Scalable, Reliable Storage Service for Petabyte-scale Storage Clusters

SOURCE CODE

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容