温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Ceph Monitor Paxos算法怎么用

发布时间:2021-12-17 10:04:23 来源:亿速云 阅读:216 作者:小新 栏目:云计算

小编给大家分享一下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算法怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI