Mon选举流程
ceph monitor----初始化和选举 - yimuxi - 博客园 (cnblogs.com)
一、Paxos算法
Paxos算法通过一个决议分为两个阶段(Learn阶段之前决议已经形成):
-
第一阶段:Prepare阶段。Proposer向Acceptors发出Prepare请求,Acceptors针对收到的Prepare请求进行Promise承诺。
-
第二阶段:Accept阶段。Proposer收到多数Acceptors承诺的Promise后,向Acceptors发出Propose请求,Acceptors针对收到的Propose请求进行Accept处理。
-
第三阶段:Learn阶段。Proposer在收到多数Acceptors的Accept之后,标志着本次Accept成功,决议形成,将形成的决议发送给所有Learners。
-
Paxos算法流程中的每条消息描述如下:
-
Prepare: Proposer生成全局唯一且递增的Proposal ID (可使用时间戳加Server ID),向所有Acceptors发送Prepare请求,这里无需携带提案内容,只携带Proposal ID即可。
-
Promise: Acceptors收到Prepare请求后,做出“两个承诺,一个应答”。
两个承诺:
-
不再接受Proposal ID小于等于(注意:这里是<= )当前请求的Prepare请求。
-
不再接受Proposal ID小于(注意:这里是< )当前请求的Propose请求。
一个应答:
1、不违背以前作出的承诺下,回复已经Accept过的提案中Proposal ID最大的那个提案的Value和Proposal ID,没有则返回空值。
-
Propose: Proposer 收到多数Acceptors的Promise应答后,从应答中选择Proposal ID最大的提案的Value,作为本次要发起的提案。如果所有应答的提案Value均为空值,则可以自己随意决定提案Value。然后携带当前Proposal ID,向所有Acceptors发送Propose请求。
-
Accept: Acceptor收到Propose请求后,在不违背自己之前作出的承诺下,接受并持久化当前Proposal ID和提案Value。
-
Learn: Proposer收到多数Acceptors的Accept后,决议形成,将形成的决议发送给所有Learners。
-
获取一个Proposal ID n,为了保证Proposal ID唯一,可采用时间戳+Server ID生成;
-
Proposer向所有Acceptors广播Prepare(n)请求;
-
Acceptor比较n和minProposal,如果n>minProposal,minProposal=n,并且将 acceptedProposal 和 acceptedValue 返回;
-
Proposer接收到过半数回复后,如果发现有acceptedValue返回,将所有回复中acceptedProposal最大的acceptedValue作为本次提案的value,否则可以任意决定本次提案的value;
-
到这里可以进入第二阶段,广播Accept (n,value) 到所有节点;
-
Acceptor比较n和minProposal,如果n>=minProposal,则acceptedProposal=minProposal=n,acceptedValue=value,本地持久化后,返回;否则,返回minProposal。
-
提议者接收到过半数请求后,如果发现有返回值result >n,表示有更新的提议,跳转到1;否则value达成一致。
-
既 Prepare->promise->propose->accept->learn
二、mon选举流程
1.Monitor业务消息
1.1 Monitor self
消息类型 | 消息结构体 | 消息作用 | 处理接口 |
---|---|---|---|
MSG_MON_PROBE | MMonProbe | 启动加入时需要向其他Monitor发送Probe请求 | handle_probe |
MSG_MON_JOIN | MMonJoin | 如果不在MonMap中申请加入到MonMap | MonmapMonitor::prepare_join |
MSG_MON_ELECTION | MMonElection | 发起选举流程 | Elector::dispatch |
1.2 mon启动阶段
mon启动两个阶段:mon准备阶段和启动阶段
mon启动需要如下数据:
-
fsid 集群独一的标记
-
cluster 默认就是ceph,可以通过--cluster指定
-
monitor name