Ceph Monitor Paxos算法怎么用

92次阅读
没有评论

共计 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 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计4052字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)