成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

云原生 Etcd 系列之Quorum 和唱票那回事

云計(jì)算 云原生
唱票是在選舉流程中的一個(gè)步驟。還記得以前選班干部的時(shí)候,在黑板上寫(xiě)“正”字,誰(shuí)得票多誰(shuí)就獲勝當(dāng)選。

[[438630]]

本文轉(zhuǎn)載自微信公眾號(hào)「奇伢云存儲(chǔ)」,作者奇伢。轉(zhuǎn)載本文請(qǐng)聯(lián)系奇伢云存儲(chǔ)公眾號(hào)。

關(guān)于 Quorum 的兩個(gè)維度

前幾回說(shuō)了那么多框架,設(shè)計(jì)思想的文章。今天分享一個(gè)很小的點(diǎn),etcd 的 quorum 是怎么實(shí)現(xiàn)的?

Quorum 機(jī)制本質(zhì)就是一個(gè)關(guān)于多數(shù)派的事情,這個(gè)多數(shù)派應(yīng)用的有兩個(gè)方面:

  • 選舉過(guò)程:獲得多數(shù)節(jié)點(diǎn)投票的節(jié)點(diǎn)才能獲勝,成為 Leader ;
  • 運(yùn)行過(guò)程:被多數(shù)節(jié)點(diǎn) commit 的日志位置,這個(gè)才是被集群可靠記錄的位置。被集群 commit 的日志才能被應(yīng)用 apply ;

那么這里有兩個(gè)小思考問(wèn)題:

既然是選舉過(guò)程,那怎么選舉結(jié)果唱票的?

既然是運(yùn)行過(guò)程,那集群的這些節(jié)點(diǎn)怎么確認(rèn)集群的 commit 位置?

有選舉自然有唱票

唱票是在選舉流程中的一個(gè)步驟。還記得以前選班干部的時(shí)候,在黑板上寫(xiě)“正”字,誰(shuí)得票多誰(shuí)就獲勝當(dāng)選。

etcd 里面也有選舉,也就是 Leader 的選舉。Leader 獲勝的依據(jù)是的票滿足大多數(shù),也就是滿足 quorum 機(jī)制。

今天我們就來(lái)看看 etcd 的唱票是怎么做的?

很簡(jiǎn)單的思路,我們給每個(gè)參與選舉的朋友計(jì)數(shù),得票超過(guò)半數(shù)的,那么就勝出。

比如說(shuō) A,B,C,D,E 五個(gè)人競(jìng)選,那么得到 3 票的就可以勝出。

來(lái)看看 etcd 的唱票

選舉屬于 quorum 機(jī)制,代碼位于 etcd/raft/quorum/ 下。quorum 的核心實(shí)現(xiàn)在 MajorityConfig 的結(jié)構(gòu)體,其實(shí)就是個(gè) map 的封裝:

  1. type MajorityConfig map[uint64]struct{} 

這個(gè) map 的 key 是節(jié)點(diǎn)的 id,這里面包含了集群的節(jié)點(diǎn),map 的 value 不重要,所用用的是 struct{} 類(lèi)型。

思考個(gè)小問(wèn)題:那既然 value 不 care ,那為什么不用 slice 結(jié)構(gòu)?

其實(shí)就是為了查找的需求,map 的查找是常數(shù)級(jí)別,value 又用的 struct{} ,不占空間,一舉兩得。

  1. // etcd/raft/quorum/majority.go 
  2. func (c MajorityConfig) VoteResult(votes map[uint64]bool) VoteResult { 
  3.     // 搞個(gè)長(zhǎng)度為 2 的數(shù)組 
  4.     ny := [2]int{} 
  5.     // 遍歷集群節(jié)點(diǎn) 
  6.     for id := range c { 
  7.         v, ok := votes[id] 
  8.         if !ok { 
  9.             // 暫時(shí)沒(méi)投票的 
  10.             missing++ 
  11.             continue 
  12.         } 
  13.         if v { 
  14.             // 投票贊同的 
  15.             ny[1]++ 
  16.         } else { 
  17.             // 投票拒絕的 
  18.             ny[0]++ 
  19.         } 
  20.     } 
  21.     q := len(c)/2 + 1 
  22.     if ny[1] >= q { 
  23.         // 選舉成功:得票數(shù)超過(guò)半數(shù),,比如 votes => [yes, yes, yes] 
  24.         return VoteWon 
  25.     } 
  26.     if ny[1]+missing >= q { 
  27.         // 未知情況:不確定成功,也不確定失敗 
  28.         return VotePending 
  29.     } 
  30.     // 選舉失敗 
  31.     return VoteLost 

唱票的實(shí)現(xiàn)很簡(jiǎn)單,就如下幾個(gè)步驟:

  • 遍歷集群節(jié)點(diǎn);
  • 統(tǒng)計(jì)誰(shuí)贊同了、誰(shuí)拒絕了、誰(shuí)還沒(méi)投票;
  • 唱票的結(jié)果有三種:成功,失敗,待定;
  • 贊同投票的超過(guò)半數(shù)( len(c)/2+1 ),則勝利;

這實(shí)現(xiàn)可太簡(jiǎn)單了,就是一個(gè)遍歷投票結(jié)果,寫(xiě)“正”字,“正”字超過(guò)半數(shù)則勝出。

集群的節(jié)點(diǎn)怎么確認(rèn)集群的 commit 位置?

集群內(nèi)被多數(shù)節(jié)點(diǎn) commit 的位置才是集群的 commit 點(diǎn)。也就是說(shuō)這個(gè)也需要滿足 quorum 。這個(gè)就有意思了。

關(guān)鍵步驟:排序,然后取中間的位置。

取的這個(gè)中間的位置就是滿足 quorum 的 commit 。

  1. // etcd/raft/quorum/majority.go 
  2. func (c MajorityConfig) CommittedIndex(l AckedIndexer) Index { 
  3.     // 遍歷集群節(jié)點(diǎn):取出每個(gè)節(jié)點(diǎn)的 commit 
  4.     for id := range c { 
  5.         if idx, ok := l.AckedIndex(id); ok { 
  6.             srt[i] = uint64(idx) 
  7.             i-- 
  8.         } 
  9.     } 
  10.     // 排個(gè)序 
  11.     insertionSort(srt) 
  12.  
  13.     // 取中間,這個(gè)位置就是大多數(shù) commit 的位置,屬集群共識(shí) 
  14.     pos := n - (n/2 + 1) 
  15.     return Index(srt[pos]) 

這個(gè)實(shí)現(xiàn)就很有意思了,撈出每個(gè)節(jié)點(diǎn)當(dāng)前的 commit 位置,組成一個(gè)數(shù)組,然后給這個(gè)數(shù)組排個(gè)序,取中間的位置。這個(gè)位置就是集群的 commit 位置,也就是 apply 的位置。

先把集群每個(gè)節(jié)點(diǎn)的 commit 位置取出來(lái),是這樣的:

后來(lái)排個(gè)序是這樣的,黑色的節(jié)點(diǎn) commit 位置則是集群的 commit 位置:

總結(jié)

Quorum 機(jī)制是分布式系統(tǒng)中很重要的理論部分,這是一個(gè)關(guān)于多數(shù)派的機(jī)制。etcd 關(guān)于多數(shù)派有兩個(gè)方面:Leader 選舉和 raft 日志運(yùn)行;

etcd 的唱票實(shí)現(xiàn)非常簡(jiǎn)單,就是一個(gè)計(jì)數(shù)“正”字的實(shí)現(xiàn),用一個(gè) map 記錄集群的節(jié)點(diǎn),投票計(jì)數(shù)超過(guò)多數(shù)則勝出;

etcd 確認(rèn)集群 commit 位置則是先把每個(gè)節(jié)點(diǎn)的 commit 位置放在數(shù)組,然后排個(gè)序,然后取中間位置,這個(gè)位置就是集群的 commit 位置;

多數(shù)節(jié)點(diǎn) commit 過(guò)的日志才是集群 commit 的位置,集群 commit 的日志才能 apply ,這個(gè)要記住嘍;

 

集群 commit 位置將由 Leader 通過(guò)心跳或者日志復(fù)制的消息告訴其他節(jié)點(diǎn);

 

責(zé)任編輯:武曉燕 來(lái)源: 奇伢云存儲(chǔ)
相關(guān)推薦

2018-03-12 10:49:46

熱管散熱誤區(qū)

2024-05-30 11:53:51

2024-06-18 13:22:42

Nginx云原生Kubernetes

2024-06-12 13:21:06

2024-06-21 09:28:05

2020-03-04 09:56:56

網(wǎng)絡(luò)安全云原生容器

2021-07-13 07:52:03

云原生彈性模式

2024-06-06 09:19:09

2013-05-27 09:32:07

構(gòu)建私有云OpenStack開(kāi)源云計(jì)算

2021-11-15 08:00:00

云原生端點(diǎn)漏洞

2022-05-26 15:02:35

Docker容器云原生

2023-05-15 07:33:06

云原生自身業(yè)務(wù)云廠商

2021-04-13 05:38:35

Kubernetes存儲(chǔ)數(shù)據(jù)庫(kù)

2022-10-27 18:03:04

GogRPC云原生

2022-04-25 12:39:57

云原生云計(jì)算

2022-12-15 11:26:44

云原生

2017-03-24 17:55:47

互聯(lián)網(wǎng)

2022-02-02 21:37:57

云計(jì)算全棧云運(yùn)營(yíng)

2022-02-08 07:56:38

云廠商云計(jì)算云服務(wù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩电影免费在线观看中文字幕 | 91在线精品播放 | 国产精品一区二区视频 | www.99精品| 性色av网站 | 亚洲免费一区 | 伊人热久久| 国产精品一区二区三区在线 | 91素人| 久久神马 | 久久中文字幕在线 | 精品中文字幕视频 | 成人一区二区三区在线观看 | 一级片子| 91麻豆精品国产91久久久更新资源速度超快 | 日韩精品视频在线播放 | 久久精品国产精品青草 | 99热这里 | 国产精品一区久久久 | 在线欧美亚洲 | 天天久久 | 亚洲电影一区二区三区 | 国产一区二区av | 综合色在线| 中文字幕亚洲视频 | 中文字幕一区二区三区在线视频 | 草草视频在线观看 | 国产精品久久欧美久久一区 | 国产在线观看 | 亚洲精品欧美一区二区三区 | 国产精品久久久久久婷婷天堂 | 中文字幕在线一区二区三区 | 亚洲午夜精品久久久久久app | 国产高清一二三区 | 91大神在线资源观看无广告 | 欧美天堂一区 | 一级特黄色毛片 | 日韩精品一区二区三区视频播放 | 中文日韩在线视频 | 亚洲精品自在在线观看 | 91成人影院|