数据库修仙元婴篇四——openguass dcf启动详解

文章详细介绍了OpenGauss数据库中的分布式一致性框架(DCF)启动过程,包括先启动walreceiver,然后启动dcf模块。在DCF中,主要处理逻辑围绕接收和发送消息,如集群间通信和节点间通信。注册的回调函数用于处理不同类型的事件,如领导者写入数据成功、接收数据成功、角色变化和选举通知。发送消息也分为集群间消息和节点间消息,涉及XLogWritePaxos和DCFSendMsg等关键操作。

openguass dcf启动详解

  • 先启动walreceiver
PMSIGNAL_START_WALRECEIVER
WALRECEIVER
WALRECEIVER
RequestXLogStreaming
SendPostmasterSignal
CheckPostmasterSignal
initialize_util_thread
InternalThreadFunc
GetThreadEntry
GaussDbThreadMain
GaussDbAuxiliaryThreadMain
WalReceiverMain
  • 启动walreceiver后,再启动dcf
WalReceiverMain
LaunchPaxos
InitPaxosModule
RegisterDcfCallBacks
InitDcfAndStart
dcf_start

openguass dcf主要处理逻辑

接收

dcf收到消息处理函数如下:

static bool RegisterDcfCallBacks()
{
    if (dcf_register_after_writer(ConsensusLogCbFunc) != 0) {
        ereport(WARNING, (errmsg("Failed to register ConsensusLogCbFunc.")));
        return false;
    }
    if (dcf_register_consensus_notify(ReceiveLogCbFunc) != 0) {
        ereport(WARNING, (errmsg("Failed to register ReceiveLogCbFunc.")));
        return false;
    }
    if (dcf_register_status_notify(PromoteOrDemote) != 0) {
        ereport(WARNING, (errmsg("Failed to register PromoteOrDemote.")));
        return false;
    }
    if (dcf_register_exception_report(DCFExceptionCbFunc) != 0) {
        ereport(WARNING, (errmsg("Failed to register DCFExceptionCbFunc.")));
        return false;
    }
    if (dcf_register_election_notify(ElectionCbFunc) != 0) {
        ereport(WARNING, (errmsg("Failed to register ElectionCbFunc.")));
        return false;
    }
    if (dcf_register_msg_proc(ProcessMsgCbFunc) != 0) {
        ereport(WARNING, (errmsg("Failed to register ProcessMsgCbFunc.")));
        return false;
    }
    if (dcf_register_thread_memctx_init(DcfThreadShmemInit) != 0) {
        ereport(WARNING, (errmsg("Failed to register DcfThreadShmemInit.")));
        return false;
    }
    return true;
}

其中根据是否属于paxos消息通信又分为两类:

  • 集群间消息

    集群信息是集群内的通信消息,某一节点发出其他节点均需要处理。

    • dcf_register_after_writer(ConsensusLogCbFunc)

      注册leader节点写入数据成功的回调函数(仅leader节点会触发该回调)

ConsensusLogCbFunc
SyncConfigFile
dcf_send_msg
dcf_broadcast_msg
DcfUpdateConsensusLsnAndIndex
DcfUpdateAppliedRecordIndex
SyncPaxosReleaseWaiters
  • dcf_register_consensus_notify(ReceiveLogCbFunc)

    follower节点写入数据成功的回调函数(仅follower节点会触发回调)

ReceiveLogCbFunc
CheckBuildReasons
CheckConfigFile
XLogWalRcvReceive
DcfUpdateAppliedRecordIndex
  • dcf_register_status_notify(PromoteOrDemote)

    节点角色变化的回调函数(只有当本节点变为leader会收到该回调)

PromoteOrDemote
PromoteCallbackFunc
SendNotifySignal
DemoteCallbackFunc
ResetDCFNodesInfo
SendPostmasterSignal
ProcessDemoteRequest
  • dcf_register_election_notify(ElectionCbFunc)

    选举leader变化的回调函数.

  • 节点间消息

    节点间消息为1对1消息,为普通tcp通信,为某一节点明确分为某一节点的消息。

    • dcf_register_msg_proc(ProcessMsgCbFunc)

      节点收到另一个节点发来的消息的回调函数

检查是否有leader
当前节点是leader
收到来自leader的消息
ProcessMsgCbFunc
QueryLeaderNodeInfo
ReplyFollower
CheckLeaderReply

发送消息

发送消息同样分为集群间消息和节点间消息。

集群间消息所有节点都会收到并处理,节点间消息为一对一的tcp通信。

  • 集群间消息发送

    • XLogWritePaxos
往dcf集群写入数据仅leader节点能写入成功
WalWriterMain
XLogBackgroundFlush
XLogWritePaxos
dcf_write
XLogSelfFlush
XLogInsert
XLogInsertRecord
XLogInsertRecordSingle
CopyXLogRecordToWAL
XLogSelfFlushWithoutStatus
  • 节点间消息发送

    • DCFSendMsg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我在数据库世界里修仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值