共计 4052 个字符,预计需要花费 11 分钟才能阅读完成。
丸趣 TV 小编给大家分享一下 Ceph Monitor Paxos 算法怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
一些相关变量
last_pn:最新的 proposal number;
accepted_pn:最新的接受的 proposal number;
accepted_pn_from:peon 接受最新的 proposal number 的 leader 的 last_committed(也就是说只接受比 accepted_pn_from 大的 pn 值)
first_committed:
last_committed:leader 和 peon 都存在的,接受最新 value 的版本号;
peer_first_committed:记录集群成员中第一次 commit 的版本号;
peer_last_committed:记录集群成员中最新 commit 的版本号;
一些函数解析
Paxos::init()
从 MonitorDB 中读取 last_pn/accepted_pn/last_committed/first_committed 的值;
leader
Paxos::collect()
|__state = STATE_RECOVERING 设置当前状态为 RECOVERING
|__初始化相关变量 uncommitted_v/uncommitted_pn/uncommitted_value/peer_first_committed/peer_last_committed
|__检查是否存在 uncommitted value 存在,通过查看 MonitorDB 中是否存在 last_committed+ 1 的值存在,若存在则初始化 uncommitted_pn/uncommitted_v/uncommitted_value
|__Paxos::get_new_proposal_number() 生成一个单调递增的且全局唯一的 last_pn 值
|__初始化 accepted_pn=last_pn/accepted_pn_from=last_committed
|__遍历 mon- get_quorum(),创建 MMonPaxos 消息且设置消息的 last_committed/first_committed/pn(accepted_pn)
|__向 mon- get_quorum() 中所有 monitor 节点发送 MMonPaxos 消息
Paxos::handle_last()
|__更新 peer_first_committed/peer_last_committed 数组
|__对于 peon.first_committed leader.last_committed+1,则 leader 调用 mon- bootstrap()
|__Paxos::store_state() 保存 MMonPaxos 消息中 value 值的 version_t leader.last_committed version_t =peon.last_committed 到 leader 的 MonitorDB 中
|__遍历 peer_last_committed 数组中所有 peon,对于数组中 peon.version_t leader.last_committed 来说,创建 MMonPaxos 消息且消息类型是 MMonPaxos::OP_COMMIT 且将该消息发送给 peon
|__对于 peon.accepted_pn leader.accepted_pn,则调用 Paxos::collect()
|__对于 peon.accetped_pn == leader.accepted_pn,则认为 peon 认可 leader 的 proposal number,对于所有 peon 都认可 leader 的 proposal number,则设置当前状态为 STATE_UPDATING_PREVIOUS
|__Paxos::begin(),调用参数是 peon 传过来的 uncommitted_value
Paxos::begin()
|__初始化 accepted 数组
|__对于 last_committed== 0 的情况,设置 first_committed=1
|__将参数中传递进来的 peon 的 uncommitted_value 写入到 MonitorDB 中
|__更新 pending_v = last_committed+1/pending_pn=aceepted_pn 且写入到 MonitorDB 中
|__遍历 mon- get_quorum(),创建 MMonPaxos 消息且设置消息类型是 MMonPaxos::OP_BEGIN
|__设置消息的 pn=accepted_pn/last_committed=last_committed/value[last_committed+1]=new_value
|__发送 MMonPaxos 消息到 peon
Paxos::handle_accept()
|__对于 peon.accepted_pn != leader.accepted_pn,则直接拒绝
|__将 peon 插入到 accepted 数组中
|__若所有 peon 都返回 OP_ACCEPT 消息,则调用 Paxos::commit_start()
Paxos::commit_start()
|__写 last_committed=last_committed+ 1 到 MonitorDB 中
|__将 uncommited_value 写入到 MonitorDB 中
|__写 MonitorDB 成功后回调 Paxos::commit_finish() 函数
Paxos::commit_finish()
|__遍历 mon- get_quorum(),创建 MMonPaxos 消息且消息类型是 MMonPaxos::OP_COMMIT
|__设置消息的 value[last_committed]=new_value/pn=accepted_pn/last_committed=last_committed
|__将消息发送给 peon
|__设置当前状态为 STATE_REFRESH
peon
Paxos::handle_collect()
|__state = STATE_RECOVERING 设置当前状态为 RECOVERING
|__对于 leader 的 first_committed peon 的 last_committed+1,则调用 mon- bootstrap()
|__创建 MMonPaxos 消息且设置消息类型为 MMonPaxos::OP_LAST
|__设置消息的 last_committed/first_committed
|__若 leader.accepted_pn peon.accepted_pn,则设置 peon.accepted_pn=leader.accepted_pn,同时设置 peon.accepted_pn_from=leader.pn_from
|__将 peon.accepted_pn 写入到 MonitorDB 中
|__设置 MMonPaxos 消息的 pn/pn_from=accepted_pn/accepted_pn_from
|__若 leader.last_committed peon.last_committed,则说明 peon 存在 uncommitted value,于是从 MonitorDB 读取出 pending_pn/pending_value 且设置到 MMonPaxos 消息中的 uncommitted_pn/value[pending_v] 中
|__发送 MMonPaxos 消息给 leader
Paxos::handle_begin()
|__对于 leader.pn peon.accepted_pn,则直接拒绝
|__state = STATE_UPDATING
|__保存 leader.uncommitted_value 到 MonitorDB
|__保存 pending_v=last_committed+1/pending_pn=accepted_pn 到 MonitorDB
|__创建 MMonPaxos 消息且设置消息类型为 MMonPaxos::OP_ACCEPT
|__设置消息 pn=accepted_pn/last_committed=last_committed
|__将 MMonPaxos 消息发送给 leader
Paxos::handle_commit()
|__Paxos::store_state() 将 leader committed 的 value 写入到 MonitorDB 中
leader 和 peon 之间的处理流程对应关系如下:
leader peon
collect() handle_collect()
handle_last()
begin() handle_begin()
handle_accept()
commit_start()
commit_finish() handle_commit()
以上是“Ceph Monitor Paxos 算法怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!