【ETCD】【源碼閱讀】 深入解析 raftNode.start`函數:Raft 核心啟動邏輯剖析

raftNode.start方法 是 etcd 中 Raft 模塊的核心啟動點,其職責是管理 Raft 狀態機的狀態變遷、日志處理及集群通信等邏輯。通過對源碼的逐行分析,我們將全面揭示其運行機制,探討其設計背后的分布式系統理念。


函數核心結構

raftNode.start 方法在一個新的 goroutine 中啟動了 Raft 主循環,核心邏輯是通過 for-select 結構不斷處理以下任務:

  1. 定時器驅動的 Raft 心跳與選舉。
  2. 接收并處理 Raft 的狀態變更。
  3. 應用已提交的日志。
  4. 管理快照和硬狀態的持久化。
  5. 發送消息以維持集群通信。

逐步拆解與分析

1. 初始化與 goroutine 啟動

go func() {defer r.onStop()islead := false
  • onStop:確保 goroutine 優雅退出時清理資源。
  • islead:標記當前節點是否為領導者(Leader),影響后續消息發送與日志處理。

2. 定時心跳驅動

case <-r.ticker.C:r.tick()
  • 作用
    • Raft 使用定時器驅動節點的選舉與心跳邏輯。
    • 調用 r.tick(),觸發內部邏輯,包括增加心跳計數器或超時選舉。
  • 意義:這是 Raft 協議中維持活躍性的核心機制。

3. 處理 Ready 狀態

case rd := <-r.Ready():

Ready 是 Raft 狀態機生成的待處理對象,包含領導者變更、已提交日志、快照等狀態信息。

處理領導者變更
if rd.SoftState != nil {newLeader := rd.SoftState.Lead != raft.None && rh.getLead() != rd.SoftState.Leadif newLeader {leaderChanges.Inc()}if rd.SoftState.Lead == raft.None {hasLeader.Set(0)} else {hasLeader.Set(1)}rh.updateLead(rd.SoftState.Lead)islead = rd.RaftState == raft.StateLeaderif islead {isLeader.Set(1)} else {isLeader.Set(0)}rh.updateLeadership(newLeader)r.td.Reset()
}
  • SoftState:包含領導者 ID 及節點狀態(LeaderFollower)。
  • updateLead:更新領導者信息。
  • updateLeadership:處理領導者身份的切換,包括暫停或恢復租約管理及日志壓縮。
應用已提交日志
ap := toApply{entries:       rd.CommittedEntries,snapshot:      rd.Snapshot,notifyc:       notifyc,raftAdvancedC: raftAdvancedC,
}
updateCommittedIndex(&ap, rh)select {
case r.applyc <- ap:
case <-r.stopped:return
}
  • CommittedEntries:已被集群達成共識的日志。
  • updateCommittedIndex:更新已提交的日志索引。
  • applyc 通道:將日志傳遞給狀態機應用層。
消息發送與持久化
if islead {r.transport.Send(r.processMessages(rd.Messages))
}
if err := r.storage.Save(rd.HardState, rd.Entries); err != nil {r.lg.Fatal("failed to save Raft hard state and entries", zap.Error(err))
}
  • 領導者:并行發送日志復制消息(Messages)給其他節點。
  • 持久化:存儲日志條目(Entries)與硬狀態(HardState),確保數據可靠性。
快照處理
if !raft.IsEmptySnap(rd.Snapshot) {if err := r.storage.SaveSnap(rd.Snapshot); err != nil {r.lg.Fatal("failed to save Raft snapshot", zap.Error(err))}notifyc <- struct{}{}r.raftStorage.ApplySnapshot(rd.Snapshot)r.lg.Info("applied incoming Raft snapshot", zap.Uint64("snapshot-index", rd.Snapshot.Metadata.Index))
}
  • 保存快照:優先持久化快照,保證系統能夠從快照中恢復。
  • 應用快照:將快照數據加載到 Raft 存儲,更新系統狀態。

4. 通信與配置變更

confChanged := false
for _, ent := range rd.CommittedEntries {if ent.Type == raftpb.EntryConfChange {confChanged = truebreak}
}if confChanged {select {case notifyc <- struct{}{}:case <-r.stopped:return}
}
  • 配置變更:處理 EntryConfChange 類型的日志,涉及集群成員的增加或刪除。
  • 同步機制:確保配置變更日志在所有節點應用后生效。

5. 優雅退出

case <-r.stopped:return
  • 關閉信號:通過監聽 r.stopped 通道,結束循環并退出 goroutine。

設計亮點與分布式理念

  1. 解耦與擴展性

    • Raft 狀態的變更通過 Ready 對象傳遞。
    • 應用層通過 applyc 通道獨立處理日志,增強模塊化設計。
  2. 并行與性能優化

    • 領導者通過并行發送日志復制消息提升性能。
    • 快照優先持久化,避免數據不一致。
  3. 可靠性

    • 所有狀態變更均通過持久化操作保證數據一致性。
    • 通過定時器和心跳機制維持集群活躍。

總結

raftNode.start 是 etcd 中實現 Raft 協議的核心方法,涵蓋了領導者選舉、日志復制、狀態持久化及快照管理等功能。其設計不僅符合 Raft 協議的理論要求,還通過模塊化和并行優化,提升了分布式系統的可靠性與性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62487.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62487.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62487.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

車站值班員題庫

1. 聯系用手信號顯示十、五、三車距離信號中的“三車”&#xff08;約33m&#xff09;信號時&#xff0c;晝間的顯示方式為展開的綠色信號旗單臂平伸下壓 &#xff08; 一 &#xff09;次。J442 2. 聯系用手信號顯示股道號碼時&#xff0c;晝間右臂向上直伸&#xff0c…

BI中場戰事:國外廠商退,國產廠商進

從沉睡的黃金到經濟的新寵&#xff0c;數據要素正上演華麗轉身。 近年來&#xff0c;數字經濟的長驅向前&#xff0c;離不開數據要素價值釋放所帶來的持續動力。作為第五大生產要素&#xff0c;數據要素的價值釋放需要從數據采集、傳輸到存儲、治理&#xff0c;再到分析和可視…

2024年華中杯數學建模C題基于光纖傳感器的平面曲線重建算法建模解題全過程文檔及程序

2024年華中杯數學建模 C題 基于光纖傳感器的平面曲線重建算法建模 原題再現 光纖傳感技術是伴隨著光纖及光通信技術發展起來的一種新型傳感器技術。它是以光波為傳感信號、光纖為傳輸載體來感知外界環境中的信號&#xff0c;其基本原理是當外界環境參數發生變化時&#xff0c…

【LeetCode每日一題】LeetCode 209.長度最小的子數組

LeetCode 209.長度最小的子數組 題目描述 給定一個正整數數組 nums 和一個正整數 target&#xff0c;找出連續子數組的最小長度&#xff0c;使得子數組的和大于或等于 target。如果不存在符合條件的子數組&#xff0c;返回 0。 Java 實現代碼 public class Solution {publi…

【openwrt】openwrt-21.02 基于IP地址使用ipset實現策略路由操作說明

openwrt版本信息 DISTRIB_ID=OpenWrt DISTRIB_RELEASE=21.02-SNAPSHOT DISTRIB_REVISION=r0-6bf6af1d5 DISTRIB_TARGET=mediatek/mt7981 DISTRIB_ARCH=aarch64_cortex-a53 DISTRIB_DESCRIPTION=OpenWrt 21.02-SNAPSHOT r0-6bf6af1d5 DISTRIB_TAINTS=no-all busybox override …

【H2O2|全棧】MySQL的基本操作(三)

目錄 前言 開篇語 準備工作 案例準備 多表查詢 笛卡爾積 等值連接 外連接 內連接 自連接 子查詢 存在和所有 含于 分頁查詢 建表語句 結束語 前言 開篇語 本篇繼續講解MySQL的一些基礎的操作——數據字段的查詢中的多表查詢和分頁查詢&#xff0c;與單表查詢…

從單體到微服務:如何借助 Spring Cloud 實現架構轉型

一、Spring Cloud簡介 Spring Cloud 是一套基于 Spring 框架的微服務架構解決方案&#xff0c;它提供了一系列的工具和組件&#xff0c;幫助開發者快速構建分布式系統&#xff0c;尤其是微服務架構。 Spring Cloud 提供了諸如服務發現、配置管理、負載均衡、斷路器、消息總線…

yarn : 無法加載文件 C:\Users\L\AppData\Roaming\npm\yarn.ps1,因為在此系統上禁

關于執行安裝yarn命令后執行yarn -v報錯&#xff1a; 先確認執行安裝yarn命令是否有誤 # 安裝yarn npm install yarn -g 終端輸入set-ExecutionPolicy RemoteSigned 當然如果yarn -v仍然執行失敗&#xff0c;考慮使用管理員方式運行IDEA&#xff0c; 注&#xff1a;如上操作…

centos 常見問題處理

免密登錄配置 # 在當前機器下 執行命令 生成 私鑰和公鑰 ~/.ssh 目錄下 ssh-keygen -t rsa # 執行如下命令 把公鑰 放到 對應機器上的 ~/.ssh/authorized_keys ssh-copy-id 172.17.68.220 # 如此 兩臺機器兩兩配置 centos ssh連接慢 vim /etc/ssh/sshd_config # UseD…

java全棧day12-后端Web實戰(IOC+DI)

前言&#xff1a;前面的基礎知識了解后進入實戰篇&#xff0c;從以下四個方面進行準備 一、開發規范 1.1前后端分離開發 前言回顧 二、Restful風格 引言&#xff1a;前端與后端在進行交互的時候&#xff0c;所使用的url風格叫Restful。 2.1概述 小結 2.2環境準備 2.2.1apif…

鏈式設計模式——裝飾模式和職責鏈模式

一、裝飾模式 1、概述 動態地給一個對象添加一些額外的職責&#xff0c;就增加功能來說&#xff0c;裝飾模式比生成子類更為靈活。 ConcreteComponent &#xff1a;是定義了一個具體的對象&#xff0c;可以給這個對象添加一些職責&#xff1b;Decorator &#xff1a;裝飾抽象…

Cmake+基礎命令

一、版本要求&#xff1a; 檢查 cmake 版本號的最低要求&#xff0c;不滿足條件時報錯。 cmake_minimum_required(VERSION <version>)參數&#xff1a; version&#xff1a;最低要求的版本號 例子&#xff1a; # 最低要求安裝3.21版本的cmake cmake_minimum_required…

Java——容器(單例集合)(上)

一 容器介紹 容器&#xff0c;是用來容納物體、管理物體。生活中,我們會用到各種各樣的容器。如鍋碗瓢盆、箱子和包等 程序中的“容器”也有類似的功能&#xff0c;用來容納和管理數據。比如&#xff0c;如下新聞網站的新聞列表、教育網站的課程列表就是用“容器”來管理 視頻…

word poi-tl 表格功能增強,實現表格功能垂直合并

目錄 問題解決問題poi-tl介紹 功能實現引入依賴模版代碼效果圖 附加&#xff08;插件實現&#xff09;MergeColumnData 對象MergeGroupData 類ServerMergeTableData 數據信息ServerMergeTablePolicy 合并插件 問題 由于在開發功能需求中&#xff0c;word文檔需要垂直合并表格&…

OpenCV相機標定與3D重建(11)機器人世界手眼標定函數calibrateRobotWorldHandEye()的使用

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 計算機器人世界/手眼標定&#xff1a; w T b _{}^{w}\textrm{T}_b w?Tb? 和 c T g _{}^{c}\textrm{T}_g c?Tg?。 cv::calibrateRobotWorldHa…

GPT系列模型簡要概述

GPT-1&#xff1a;&#xff08;0.117B參數量&#xff0c;0.8B words預訓練數據) 動機&#xff1a; 在RNN和Transformer之間&#xff0c;選擇了后者。 和《All your need is Attention》翻譯模型的Encoder-Decoder架構相比&#xff0c;只保留Decoder&#xff0c;因此去掉了Cross…

汽車升級到底應不應該設置“可取消“功能

最近&#xff0c;汽車OTA&#xff08;Over-the-Air&#xff09;升級頻頻成為車主討論的熱點。有些車主反映&#xff0c;一些升級增加了實用功能&#xff0c;而另一些卻讓體驗變得復雜甚至帶來不便。于是&#xff0c;大家不禁發問&#xff1a;汽車升級功能究竟應不應該允許“可取…

單片機 PCB 設計要點

一、引言 單片機作為現代科技的重要組成部分&#xff0c;其 PCB 設計至關重要。本文將詳細介紹單片機 PCB 設計的要點和流程&#xff0c;幫助讀者更好地掌握這一關鍵技術。 在電子世界的浩瀚星海中&#xff0c;單片機無疑是現代科技中一顆閃爍的明珠。作為掌握嵌入式系統的基…

Django+Apscheduler 開發定時任務模塊【六】

目錄 回顧 前五個文章講述了django-autojob的部分代碼和執行邏輯 【DjangoApscheduler 開發定時任務模塊】【一】 【DjangoApscheduler 開發定時任務模塊】【二】 【DjangoApscheduler 開發定時任務模塊】【三】 【DjangoApscheduler 開發定時任務模塊】【四】 【DjangoApsch…

Ubuntu中配置交叉編譯工具的三條命令的詳細研究

關于該把下面的三條交叉編譯配置語句加到哪里&#xff0c;詳情見 https://blog.csdn.net/wenhao_ir/article/details/144326545 的第2點。 現在試解釋下面三條交叉編譯配置語句&#xff1a; export ARCHarm export CROSS_COMPILEarm-buildroot-linux-gnueabihf- export PATH$…