Etcd Raft架構設計和源碼剖析2:數據流

Etcd Raft架構設計和源碼剖析2:數據流 | Go語言充電站

前言

之前看到一幅描述etcd raft的流程圖,感覺非常直觀,但和自己看源碼的又有些不同,所以自己模仿著畫了一下,再介紹一下。

下圖從左到右依次分為4個部分:

  1. raft:raft主體功能部分
  2. Node:raft提供的接口,raft跟上層的通信接口,會運行一個run函數,持續循環處理通道上的數據
  3. raftNode:上層應用邏輯
  4. 其他:Client、Network、State

etcd raft workflow

圖中的箭頭為數據的流向,這幅圖包含了多個流程,接下來會分成4個流程介紹:

  1. 客戶端請求
  2. 發送消息給其他節點
  3. 接收其他節點消息及處理
  4. 應用達成一致的日志

客戶端請求

客戶端請求的流程,在下圖已經使用紅色箭頭標出,流程如下:

  1. 客戶端將請求發送給應用層raftNode
  2. raftNode使用Propose方法,請求寫入到propc通道
  3. raft.Step接收到通道數據,會通過append等函數加入到raftLog
  4. raftLog用來暫時存儲和查詢日志,請求會先加入到unstable

etcd raft request flow

發送消息

發送消息的數據流,已經用紅色箭頭標出,流程如下:

  1. raft發現有數據發送給其他節點,數據可以是leader要發送給follower的日志、snapshot,或者其他類型的消息,比如follower給leader的響應消息
  2. 利用NewReady創建結構體Ready,并寫入到readyc通道
  3. raftNode從通道讀到Ready,取出其中的消息,交給Network發送給其他節點

etcd raft send message flow

接收消息

接收消息的數據流,已經在下圖用紅色箭頭標出,流程如下:

  1. 從Network收到消息,可以是leader給follower的消息,也可以是follower發給leader的響應消息,Network的handler函數將數據回傳給raftNode
  2. raftNode調用Step函數,將數據發給raft,數據被寫入recvc通道
  3. raft的Step從recvc收到消息,并修改raftLog中的日志

etcd raft receive msg flow

應用日志

raft會將達成一致的log通知給raftNode,讓它應用到上層的數據庫,數據流已經在下圖用紅色箭頭標出,流程如下:

  1. raft發現有日志需要交給raftNode,調用NewReady創建Ready,從raftLog讀取日志,并存到Ready結構體
  2. Ready結構體寫入到readyc通道
  3. raftNode讀到Ready結構體,發現Ready結構體中包含日志
  4. raftNode會把日志寫入到storage和WAL,把需要應用的日志,提交給狀態機或數據庫,去修改數據
  5. raftNode處理完Ready后,調用Advance函數,通過advancec發送一個信號給raft,告知raft傳出來的Ready已經處理完畢

可以發現有2個storage,1個是raftLog.Storage,一個是raftNode.storage,Storage是一個接口,可以用來讀取storage中的數據,但不寫入,storage的數據寫入是由raftNode完成的,但raftNode.storage就是raft.MemoryStorage,所以不穩定的、穩定的都由raft存儲,持久化存儲由WAL負責,etcd中有現成實現的WAL操作可用,用來存儲歷史Entry、快照。

Storage接口更多信息請看Storage接口介紹。

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

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

相關文章

游戲心理學Day05

第三章 游戲即學習 《超級馬里奧》是游戲史上的經典之作,我們都記得第一次踩到敵人,第一次頂碎磚塊時的快樂,也記得為了通過某個關卡而付出的努力和艱辛。當我們掌握了規律和技巧之后,這些難題就不再是難題,因為我們習…

Windows 宿主機訪問 VirtualBox 虛擬機中創建的 docker 容器中的 mysql8.0 的數據

一、場景需求 在開發環境中,一般使用 windows 系統進行開發,但需要在 linux 系統中創建運行 mysql8.0 的 docker 容器中進行測試(win10特定版本或win11才能安裝 docker),為了方便還需要在 windows 系統中通過 SQLyog …

植物大戰僵尸雜交版2.0.88最新版+防閃退工具V2+修改工具+高清工具

植物大戰僵尸雜交版,不僅繼承原作的經典玩法,而且引入了全新的植物融合玩法,將各式各樣的植物進行巧妙的雜交,孕育出前所未有、功能各異的全新植物。 創新的雜交合成系統 游戲引入了創新的雜交合成系統,讓玩家可以將不…

Unity DOTS技術(五)Archetype,Chunk,NativeArray

文章目錄 一.Chunk和Archetype什么是Chunk?什么是ArchType 二.Archetype創建1.創建實體2.創建并添加組件3.批量創建 三.多線程數組NativeArray 本次介紹的內容如下: 一.Chunk和Archetype 什么是Chunk? Chunk是一個空間,ECS系統會將相同類型的實體放在Chunk中.當一個Chunk…

JS包裝類:循環中為什么建議用變量存儲str.length進行循環判斷?

前言 在Javascript通常我們在遍歷一個字符串的時候通常使用的方式是 var str "abcdefg"; for(let i0;i<str.length;i){}但在最近的學習中&#xff0c;有人建議我最好應該是下面這樣執行。 var str "abcdefg"; for(let i0,len str.length;i<len;i)…

DP讀書:《ModelArts人工智能應用開發指南》(一)人工智能技術、應用平臺

怎么用ModelArts人工智能應用 訓練底座訓練案例 盤古礦山模型Main config.py 訓練底座 訓練案例 盤古礦山模型 Main 下面是快速助手 https://support.huaweicloud.com/qs-modelarts/modelarts_06_0006.html 準備開發環境 在ModelArts控制臺的“ 開發環境 > Notebook”頁面…

【C#學習筆記】屬性和字段

文章目錄 前言屬性和字段的區別字段訪問修飾符和關鍵字定義變量類型的定義變量命名變量的賦值 屬性 不同的使用情況 前言 最近在工作的過程中常常會覺得自己在程序設計方面的能力還是有欠缺。例如一直對于變量的聲明感到不足&#xff0c;在工作中為了圖方便總是直接public定義…

聲音突破:so 索

小孩兒看完武俠劇&#xff0c;就決定從二樓往地面上跳&#xff0c;年輕的老媽看到了&#xff0c;就在那里罵&#xff0c;喝斥不準逞能&#xff0c;不許亂來&#xff0c;不許跳。但小孩子不聽話&#xff0c;心里全是影視劇的畫面&#xff0c;那叫一個俠之能也&#xff0c;于是飛…

llvm 常用命令備忘

執行 IR 上的指令合并優化 pass $ opt –S –instcombine testfile.ll –o output1.ll 執行無效參數優化 pass $ opt –S –deadargelim testfile.ll –o output2.ll C 語言生成 IR 文件 $ clang -emit-llvm -S multiply.c -o multiply.ll C 語言生成 IR 文件 $ clang -cc1 -…

面向長文本處理的鍵值緩存壓縮技術:智能壓縮,無損性能,免微調

隨著輸入長度的增加&#xff0c;大型語言模型&#xff08;LLMs&#xff09;中的鍵值&#xff08;KV&#xff09;緩存需要存儲更多的上下文信息以維持性能&#xff0c;這導致內存消耗和計算時間急劇上升。KV緩存的增長對內存和時間效率的挑戰主要表現在兩個方面&#xff1a;一是…

使用JavaScript實現網頁通知功能

如何使用js來實現網頁通知功能。即使在用戶瀏覽其他頁面時&#xff0c;也能向他們推送通知信息。 廢話不多說直接上代碼 function showAutoNotification() {if ("Notification" in window) {Notification.requestPermission().then(function(permission) {if (permis…

元宇宙數字藏品交易所,未來發展的大趨勢

隨著科技的飛速進步&#xff0c;元宇宙以其獨特的魅力為數字世界繪制了一幅前所未有的宏偉藍圖。在這一宏大的背景下&#xff0c;數字藏品交易所作為連接虛擬與現實的橋梁&#xff0c;正以其卓越的優勢&#xff0c;引領著數字藏品市場邁向新的高度。 首先&#xff0c;元宇宙為…

Vue 的服務端渲染(SSR)有哪些鉤子可以用

在 Vue 的服務端渲染&#xff08;SSR&#xff09;過程中&#xff0c;并不會執行完整的生命周期鉤子&#xff0c;只有一部分鉤子會在服務器端執行。以下是 Vue SSR 中支持的生命周期鉤子&#xff1a; beforeCreate&#xff1a;在實例初始化之后&#xff0c;數據觀測 (data obser…

【ARM Cache 與 MMU 系列文章 7.8 – ARMv8/v9 MMU Table 表分配原理及其代碼實現 2】

文章目錄 MMU Table 表分配原理及其代碼實現MMU Table 分配代碼實現MMU Table 表分配原理及其代碼實現 在做映射的時候所映射的地址范圍最大只能是某一級 level table 中 entry 所能支持的最大范圍,如果超過這個范圍需要在對應 level table 中新增一個entry,這里還是以映射虛…

【相關概念】經濟金融中的Momentum

張張張三豐de思考與總結&#xff1a; 最近做的期貨價格泡沫中&#xff0c;一直在說&#xff0c;momentum&#xff0c;momentum&#xff0c;momentum&#xff0c;那么究竟什么是momentum呢&#xff1f; 目前&#xff0c;在有關期貨價格泡沫的研究文獻中&#xff0c;一般都是研究…

本輪牛市新趨勢,跟隨The First捕捉牛市Alpha

與以往牛市“百花齊放”的繁榮景象相比&#xff0c;本輪牛市頗具獨特走勢&#xff0c;呈現出了資金集中度高、財富聚集效應小的特點&#xff0c;絕大部分加密資產甚至跑不贏BTC的漲幅幅度。而以往大放色彩的公鏈幣價值幣的走勢&#xff0c;甚至比不過牛尾才爆發的MEME幣。這使得…

Java項目之消息隊列(手寫java模擬實現mq)【三、MQ的核心類-消息類的存儲(用文件存儲消息)】? ★

Java項目之MQ 七. 消息存儲設計設計思路為什么要用文件存儲文件存儲結構queue_data.txt ?件格式:queue_stat.txt ?件格式: 創建 MessageFileManager 類定義一個內部類, 來表示該隊列的統計信息 Stat實現統計?件Stat讀寫&#xff08;文本文件的讀寫&#xff09;InputStream—…

python爬蟲入門教程(一)

上一篇文章講了爬蟲的工作原理&#xff0c;這篇文章以后就要重點開始講編程序了。 簡單爬蟲的的兩個步驟&#xff1a; 使用HTTPRequest工具模擬HTTP請求&#xff0c;接收到返回的文本。用于請求的包有: requests、urllib等。 對接收的文本進行篩選,獲取想要的內容。用戶篩選文…

JavaScript-內存分配,關鍵字const

內存空間 內存分為棧和堆 棧&#xff1a;由操作系統自動釋放存放的變量值和函數值等。簡單數據類型存放在棧中 棧會由低到高先入后出 堆&#xff1a;存儲引用類型 &#xff08;數組&#xff0c;對象&#xff09; 對象會先將數據存放在堆里面&#xff0c;堆的地址放在棧里面 關鍵…

【ArcGISProSDK】獲取要素中某字段最大值

public static async Task<double> GetMaxValueFromField(string vectorFilePath, string fieldName){double maxValue = 0;//矢量所在文件夾var filePath = System.IO.Path.GetDirectoryName(vectorFilePath);//矢量名稱var fileName = System.IO.Path.GetFileNameWitho…