dledger原理源碼分析系列(三)-選主

簡介

? ? ? ?dledger是openmessaging的一個組件, raft算法實現,用于分布式日志,本系列分析dledger如何實現raft概念,以及dledger在rocketmq的應用

? ? ? 本系列使用dledger v0.40

? ? ? 本文分析dledger的選主

關鍵詞

Raft

Openmessaging

心跳/選主

參考資料

In Search of an Understandable Consensus Algorithm ?raft論文簡版

選主

? ? ? ? ?選主是dledger的關鍵特性,主節點承擔處理Client請求,復制日志到跟隨者節點,dledger通過心跳發起選舉。

關鍵屬性

本節介紹關鍵屬性,為下面分析準備

  • term 任期/輪次

任期: 新的選舉開始到下一個選舉開始,左閉右開的時間區間,包括選舉期和工作期兩部分

輪次:任期內選舉的輪次,任期內可多輪不提升term選舉

  • needIncreaseTermImmediately

需要立即增加term的設置,只提升任期,但不對其他節點發起投票請求,用于term落后的節點

  • nextTimeToRequestVote

下次請求投票時間

System.currentTimeMillis() + minVoteIntervalMs + random.nextInt(maxVoteIntervalMs - minVoteIntervalMs)

dledger根據情況有不同的設定,下次發起選舉時間的差異正是選舉的關鍵

  • currVotedFor

本節點投票給誰了,該值提升term時設置為null;該值設置地方只有一處,處理投票handlerVote,即,不提升term節點,投票給誰不會改變

  • currTerm

節點當前所處任期

  • ledgerEndTerm/ledgerEndIndex

已寫入日志的term;已寫入日志的索引

兩個數據是節點成為leader的關鍵數據,作為leader已寫入日志的term/已寫入日志的索引越多越好

分析

選舉分3塊,第一投票邀請;第二投票;第三投票統計,部署下一步操作,其中

投票邀請

候選者定時維護狀態,maintainAsCandidate方法發起投票邀請,邀請其他節點(包括自己)為自己投票

1 檢查是否符合投票條件,投票時間到 或者 設置了需要立即提升term

2 double check 節點處于候選者角色

3 是否提升term

lastParseResult是上一輪發起投票分析結果,參考后面投票統計

只需提升term,追趕上該輪投票的term,不發起投票邀請

4 獲取節點的已寫入的term/index

5 重置needIncreaseTermImmediately

term落后,設置該標記為true,提升term后,恢復默認

6 邀請節點投自己一票,邀請也發給自己

投票

節點,包括發起投票的領導者,處理投票請求

1 投票發起者的合法性檢查

投票請求的leader是發起者,投票實際是拉票,邀請其他節點投自己一票

1.1 leader是否組內的節點

目前版本不知道集群變更,實際不會出現

1.2 不應該出現的leader

參看問題分析

-----------------------------------------分割線------------------------------------------

2 檢查已寫入日志term和index

這個好理解,想做leader,寫入的日志應該比我多;比我少的,沒資格讓我投你票

-----------------------------------------分割線------------------------------------------

term相關檢測

3? 請求節點的term < 本節點term,拒絕投票,請求節點的term落后了

4? term一致

4.1 currVoteFor為空,還沒投票

后面的檢測沒問題的話,本節點投票給發起節點

4.2? currVoteFor不為空,已投票,而且投的是發起節點

4.3? currVoteFor不為空,投票給其他節點了

下面繼續細分,本節點是否已有leader,這里考慮一個問題,有無可能currVoteFor為空,并且有leader?

不可能,分兩種情況,

  1. 本節點是跟隨者,本節點未進入本term選舉,本節點term小于發起者term
  2. 本節點是候選者,提升term置空currVoteFor,成為候選者要置空leader

4.4 本節點term落后了

設置needIncreaseTermImmediately,提升term,但不發起投票請求

5 發起節點term與本節點已寫入日志term比較

與2相同,發起節點資格不夠,不能投你

-----------------------------------------分割線------------------------------------------


6 本節點用戶設置優先當領導,而且條件符合,不投票給發起節點,自己優先

7 最后,投票給請求節點

投票統計

7 首先準備好統計量

-----------------------------------------分割線------------------------------------------

統計不詳細分析,看注釋便清楚

-----------------------------------------分割線------------------------------------------

7.3 提早通過latch等待,3個條件

1. 已有選出leader

2. 票數已過半,自己將成為leader

3. 本節點未夠票,剩下的票不過半,即,也沒有其他人選上

7.4 統計所有節點數

總數達到allNum.get() == memberState.peerSize(),所有心跳請求返回(包括連接不上),退出

* memberState.peerSize() 實為 memberState.peerSize()+1-1,peerSize從0開始,數量需+1,排除自己,數量-1

部署下一論投票行動

8 投票統計結果決定下一步投票行動

8.1 本節點term落后了

提升任期,再發起投票請求,這點跟投票者不一樣,投票者term落后設置needIncreaseTermImmediately=true,即只提升,不發起投票請求,這樣做容易理解,選出主節點,需要爭票的少,投票的多,投票發起節點只有一個,投票的節點多個

8.2 集群已有leader,無需再發起投票,但不立即轉為follower,延長下次投票,等待下一個leader的心跳,調整為正確的leader,便進入正常工作

8.3 有效返回節點數過少,通常是網絡原因,只有等

8.4 除去日志比自身完整的節點,還不夠票數當選,讓賢,延遲下次投票邀請的時間,讓其他節點發起投票

8.5 當選leader

8.6 加上term落后的節點夠票數讓本節點當選

此時,term落后的節點提升term,立即選舉增加本節點當選的幾率,但REVOTE_IMMEDIATELY實際沒使用

8.7 選票分散,提升任期,投票

9 選上了,趕快坐上寶座當領導

總結:行動的目標是盡快選到領導者,策略上盡量逼近目標無疑是正確的。

有效性

本節去掉異常情況,只看選舉的主體流程,分析一下選主的有效性,dledger的規則/邏輯怎樣讓分布節點獲得過半票數

去掉的異常情況

1 本節點term落后

2 有效返回過少

3 寫入日志term/index比投票節點小

4 投票節點term小于本節點

選舉主體

1 已經選出領導者

2 獲得投票過半

3 投票分散,未能選為領導者

1/2 兩種情況選舉完成

3,提升term;設置下次投票時間,投票時間有范圍的隨機值,只要有不多于2個節點率先發起投票,其他節點投票,這就可以選出主節點

問題

選舉未分析出來的點

不是預期的leader

目前沒有分析出怎么出現這種情況

系列文章

  • 架構,核心組件和rpc組件 完成
  • 心跳和選舉 完成
  • 日志寫入/復制和存儲 TBD? 包括日志寫入和復制,日志存儲組件
  • 集成rocketmq rocketmq使用dledger實現消息存儲復制;broker控制器 元數據復制
  • 快照/狀態機
  • 集群成員變更? 成員變更管理,節點的上線下線發現,dledger v0.4未實現,但計劃中,未來版本實現
  • jraft? ?“double check” ?多重分析,jraft比較忠實實現了raft算法,在dledger基礎上,再深入研究jraft對raft更深入的認識

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

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

相關文章

SpringMVC中的異常處理器

文章目錄 12異常處理器12.1基于配置的異常處理HandlerExceptionResolver接口直接在springmvc中聲明使用 12.2基于注解的異常處理需要書寫異常的配置類 12異常處理器 12.1基于配置的異常處理 HandlerExceptionResolver接口 接口實現類&#xff1a; DefaultHandlerExceptionR…

Linux安裝redis教程(超級詳細,新手必看)

環境&#xff1a; Centos 7.9 一、安裝準備工作 1.配置gcc 安裝redis前需要配置gcc&#xff1a; yum install gcc如果配置gcc出現依賴包問題&#xff0c;可以到主頁查看帖子解決&#xff1a;https://blog.csdn.net/m0_59117906/article/details/134451622?spm1001.2014.300…

這四款軟件很好用,可以提升工作、學習效率

TableConvert TableConvert是一個基于Web的在線表格轉換工具&#xff0c;能夠將多種格式的表格數據進行快速轉換。它支持將Excel、URL、HTML、JSON、CSV等格式轉換為Markdown表、CSV/TSV、XML、YAML、插入SQL、HTML、Excel和LaTeX等格式。用戶只需將表格數據粘貼到編輯器&#…

設置HTML元素的背景顏色

設置HTML元素的背景顏色 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;在本文中&#xff0c;我們將探討如何使用HTML和CSS來設置HTML元素的背景顏色。背景顏色…

本教程將指導如何通過 Vue 組件和后端 API 交互

本人詳解 作者:王文峰,參加過 CSDN 2020年度博客之星,《Java王大師王天師》 公眾號:JAVA開發王大師,專注于天道酬勤的 Java 開發問題中國國學、傳統文化和代碼愛好者的程序人生,期待你的關注和支持!本人外號:神秘小峯 山峯 轉載說明:務必注明來源(注明:作者:王文峰…

常用TELNET命令及其應用

常用TELNET命令及其應用 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; TELNET是一種基于文本協議的網絡協議&#xff0c;主要用于遠程登錄到網絡設備和服務器…

計算機視覺全系列實戰教程 (十五):使用opencv對視頻進行基本處理

視頻處理基本介紹 1、基本概述(1)opencv中視頻處理的兩個基礎類(2)視頻的屬性&#xff1a;獲取屬性和設置屬性 2、VideoCapture的介紹(1)Why( VideoCapture類的作用)(2)How( 如何使用VideoCapture)A.播放視頻文件函數B.播放視頻文件并實現暫停和繼續 3、VideoWriter類的介紹(1)…

CJSON庫

目錄 一、介紹 1、JSON是什么 2、為什么使用CJSON 3、JSON格式 二、使用CJSON構造JSON 1、創建對象 2、添加字段 3、轉換格式 4、釋放對象 三、使用CJSON解析JSON 1、解析數據 2、 獲取字段 3、釋放對象 一、介紹 1、JSON是什么 JSON是什么呢&#xff1f;JSON全稱…

折半查找詳解

一&#xff1a;折半查找概念 折半查找&#xff08;也稱為二分查找&#xff09;是一種在有序數組中查找某一特定元素的搜索算法。搜索過程從數組的中間元素開始&#xff0c;如果中間元素正好是目標值&#xff0c;則搜索過程結束&#xff1b;如果目標值大于或小于中間元素&#x…

OceanBase 4.2.1 離線安裝

OceanBase 4.2.1 離線安裝 4.2 版本的OceanBase支持一鍵安裝&#xff0c;所以在線版本的安裝簡單了很多&#xff0c;但在無法連接網絡的情況下安裝就只能手動離線安裝。 注&#xff1a;如下安裝過程都是在同一臺機器上面進行&#xff0c;也就是只有一個節點&#xff0c;多個節…

SSM網上旅游信息管理系統-計算機畢業設計源碼06975

目 錄 摘要 1 緒論 1.1 研究背景 1.2 研究意義 1.3論文結構與章節安排 2 系統分析 2.1 可行性分析 2.2 系統流程分析 2.2.1 數據新增流程 2.2.2 數據刪除流程 2.3 系統功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系統用例分析 2.5本章小結 3 系統總體設…

Oracle、MySQL、PostGreSQL、SQL Server-查詢每秒事務數

Oracle、MySQL、PostGreSQL、SQL Server-查詢每秒事務數 在做 db benchmarks 時&#xff0c;qps、tps 是衡量數據庫性能的關鍵指標,TPS : Transactions Per Second 是每秒事務數&#xff0c;即數據庫服務器在單位時間內處理的事務數。 橫向對比計劃幾類數據庫計算tps的方法。 …

微信小程序畢業設計-垃圾分類系統項目開發實戰(附源碼+論文)

大家好&#xff01;我是程序猿老A&#xff0c;感謝您閱讀本文&#xff0c;歡迎一鍵三連哦。 &#x1f49e;當前專欄&#xff1a;微信小程序畢業設計 精彩專欄推薦&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python畢業設計…

AI產品哲學深探:從Perplexity CEO視角看搜索引擎的智慧啟示

一、開篇:歷史的分岔路口 在科技史的長河中,有些對話悄然決定了行業的走向。回溯至互聯網搜索的黎明時期,一場未被充分重視的會談在兩位科技巨擘之間展開。谷歌聯合創始人Larry Page與昔日搜索引擎巨頭Excite的CEO坐在了談判桌兩端,他們的對話不僅關乎一次潛在的并購,更預…

elasticsearch的查詢原理

數據結構 在 Elasticsearch 中,數據結構分布如下: 索引(Index) 索引是 Elasticsearch 中存儲數據的基本單元,相當于關系型數據庫中的數據庫。一個 Elasticsearch 集群中可以包含多個索引。 類型(Type) (從 Elasticsearch 7.0 開始已經被棄用): 在較早版本的 Elasticsearch…

Mathematica訓練課(46)-- 一些常用的畫圖函數

在前面的課程中&#xff0c;我們已經梳理了Plot的畫圖用法&#xff0c;今天就詳細梳理一下其他的畫圖函數用法&#xff1b; 1. 畫一條直線 2. Circle(圓) 3. Disk&#xff08;圓盤&#xff09; 4. 畫出一個矩形 5. 箭頭

c-前綴平方和序列(牛客小白月賽97)

題目&#xff1a; 假如一個長度為 n的正整數序列滿足所有前綴和 都是平方數&#xff0c;那么稱這種序列為前綴平方序列。 條件1<si<x 取模1e97 首先找出小于x的平方數有幾個。 然后用二項式定理 算出小于x的平方數中取n個的種數。 #include<bits/stdc.h> using…

大數據可視化實驗(六)——ECharts與pyecharts數據可視化

目錄 一、實驗目的... 1 二、實驗環境... 1 三、實驗內容... 1 1、ECharts可視化制作.. 1 1&#xff09;使用ECharts繪制折線圖顯示一周的天氣變換。... 1 2&#xff09;使用ECharts繪制柱狀圖顯示商品銷量的變化。... 4 2、pyecharts可視化制作.. 7 1&#xff09;使用…

beautifulSoup庫

是什么? Beautiful Soup(簡稱BS4)是一種強大而靈活的HTML和XML解析庫,廣泛用于Python爬蟲和數據采集中。相比正則表達式更加簡潔. Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔為用戶提供需要抓取的…

【知識學習】Unity3D中Shader Graph的概念及使用方法示例

Unity3D中的Shader Graph是一個強大的可視化Shader編輯工具&#xff0c;它允許用戶通過拖拽和連接節點的方式來創建Shader&#xff0c;而不是通過傳統的編寫代碼的方式。Shader Graph使得Shader的創建過程更加直觀和易于理解&#xff0c;特別是對于那些不熟悉Shader語言編程的美…