小编给大家分享一下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算法怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。