千家信息网

Ceph Monitor Paxos算法怎么用

发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,小编给大家分享一下Ceph Monitor Paxos算法怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一些相关变量
千家信息网最后更新 2025年02月05日Ceph Monitor Paxos算法怎么用

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

0