精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

分鐘搞定分布式選舉 Bully 算法

開發 系統
本文主要介紹了在分布式系統中使用 Bully 算法進行領導者選舉的概念和流程,并以 Go 語言為例展示了具體的編碼實踐。

分布式系統通常需要在一組節點中選出一個領導者,以確保有效協調并做出決策,Bully 算法就是在分布式系統中選舉領導者的一種算法。本文將用 Go 實現 Bully 算法,以了解集群節點如何選舉領導者。

一、Bully 算法簡介

Bully 算法是一種簡單有效的分布式系統選舉算法,其工作原理如下:

  • 節點層次結構:系統中的每個節點都有一個獨一無二的 ID,節點之間可以互相知道對方的 ID。
  • 領導者探測:如果節點探測到當前領導者沒有響應(失敗),就會啟動選舉流程。
  • 選舉:發起選舉的節點("bully")向所有 ID 更高的節點發送選舉信息。如果沒有 ID 更高的節點響應,則"bully"獲勝,成為新的領導者。
  • 協調者:領導者是系統的協調者,負責決策和管理分布式任務。

二、過程概述

Bully 算法[2]的基本思想是排序(rank),假定每個節點在集群中都有序號,而領導者必須是序號最高的。因此,在選舉時需要使用節點的排序值。

選舉有兩種情況:

  • 系統剛初始化,還沒有領導者。
  • 某個節點發現領導者宕機了。

選舉方式如下:

  • 節點向其他比自己排序高的節點發送 ELECTION 消息。
  • 節點等待 ALIVE 響應:如果沒有更高排序的節點回應,自己就成為領導者;否則,排序最高節點成為新領導者。

下面來詳細說明一下:

假設節點排序為:node4 > node3 > node2 > node1

由于 node4 在該集群中排序最高,它沒有收到任何來自更高排序的節點的 ALIVE 消息。因此,node4 決定成為領導者,并發送了一條 ELECTED 消息,向其他節點通報選舉結果。

三、領導者失效

其他節點定期發送 PING 消息,探測領導者狀態,并等待領導者的 PONG 響應。

如果領導者宕機,而第一個節點沒有收到 PONG 消息,那么該節點就會重新開始選舉過程。

四、在 Go 中實現 Bully 算法

1. Node.go

var nodeAddressByID = map[string]string{
 "node-01": "node-01:6001",
 "node-02": "node-02:6002",
 "node-03": "node-03:6003",
 "node-04": "node-04:6004",
}

type Node struct {
 ID       string
 Addr     string
 Peers    *Peers
 eventBus event.Bus
}

為簡單起見,所有節點都是硬編碼。

該文件定義了 Node 結構,代表分布式系統中的一個節點。節點有 ID、網絡地址(Addr)、已知對端(Peers)列表和用于通信的事件總線(eventBus)。

  • nodeAddressByID:該映射保存了群集中所有節點的地址。每個節點都有一個映射到其網絡地址的唯一 ID。
func NewNode(nodeID string) *Node {
 node := &Node{
  ID:       nodeID,
  Addr:     nodeAddressByID[nodeID],
  Peers:    NewPeers(),
  eventBus: event.NewBus(),
 }

  node.eventBus.Subscribe(event.LeaderElected, node.PingLeaderContinuously)
  return node
}
  • NewNode(nodeID string):基于給定 ID 創建新節點,并初始化其地址、對端集合以及事件總線。
  • eventBus.Subscribe:節點訂閱 LeaderElected 事件,當該事件發生時觸發 PingLeaderContinuously 函數
func (node *Node) NewListener() (net.Listener, error) {
 addr, err := net.Listen("tcp", node.Addr)
 return addr, err
}
  • NewListener():該方法在節點的網絡地址(node.Addr)上創建新的 TCP 監聽器,用于處理來自其他節點的連接請求。
func (node *Node) ConnectToPeers() {
 for peerID, peerAddr := range nodeAddressByID {
  if node.IsItself(peerID) {
   continue
  }

  rpcClient := node.connect(peerAddr)
  pingMessage := Message{FromPeerID: node.ID, Type: PING}
  reply, _ := node.CommunicateWithPeer(rpcClient, pingMessage)

  if reply.IsPongMessage() {
   log.Debug().Msgf("%s got pong message from %s", node.ID, peerID)
   node.Peers.Add(peerID, rpcClient)
  }
 }
}
  • ConnectToPeers():與集群中所有對端節點建立 RPC 連接,遍歷 nodeAddressByID 中的每個對端節點,連接并發送 PING 消息。

如果對端節點回應了 PONG 消息,就將該對端節點添加到已知對端節點列表中。

func (node *Node) connect(peerAddr string) *rpc.Client {
retry:
 client, err := rpc.Dial("tcp", peerAddr)
 if err != nil {
  log.Debug().Msgf("Error dialing rpc dial %s", err.Error())
  time.Sleep(50 * time.Millisecond)
  goto retry
 }
 return client
}
  • connect(peerAddr string) *rpc.Client:與給定的 peerAddr(對端網絡地址)建立 RPC 客戶端連接。

如果連接報錯,利用 goto 語句延遲 50 毫秒后重試。

func (node *Node) CommunicateWithPeer(RPCClient *rpc.Client, args Message) (Message, error) {
 var reply Message

 err := RPCClient.Call("Node.HandleMessage", args, &reply)
 if err != nil {
  log.Debug().Msgf("Error calling HandleMessage %s", err.Error())
 }

 return reply, err
}
  • CommunicateWithPeer:該方法通過 RPC 客戶端 RPCClient 向對端發送信息 args,并等待回復。

2. Peer.go

type Peer struct {
 ID        string
 RPCClient *rpc.Client
}

type Peers struct {
 *sync.RWMutex
 peerByID map[string]*Peer
}

func NewPeers() *Peers {
 return &Peers{
  RWMutex:  &sync.RWMutex{},
  peerByID: make(map[string]*Peer),
 }
}

func (p *Peers) Add(ID string, client *rpc.Client) {
                ...
}

func (p *Peers) Delete(ID string) {
                ...
}

func (p *Peers) Get(ID string) *Peer {
                ...
}

這是 Peer 和 Peers 結構及其方法。Peer 代表系統中的單個節點,而 Peers 則是對端節點的集合,包含添加、刪除、獲取和轉換為列表或 ID 的方法。

五、實現

  • 通過 Docker Compose 模擬集群中的節點,每個節點都基于相同的 dockerfile。
  • 為了讓算法發揮作用,每個節點都需要了解其他節點的情況,這就需要一種服務發現機制。
  • 每個節點都被硬編碼了其他節點的網絡信息,而不是實現完整的服務發現功能。
  • 這種簡化是為了演示目的。更穩健的實現方式應包括適當的服務發現機制,以動態處理節點的添加和刪除。

在通信過程中,如果領導者出現故障,其連接將被中斷,并返回錯誤信息,以便開始新的選舉過程。

當節點啟動時,node4 成為領導者,因為根據其 ID,它的排序最高。在沒有領導者的情況下,node4 發起選舉,宣布自己為領導者,并廣播 ELECTED 消息通知其他節點。

接下來,我們模擬 node4 被終止的情況,觀察新的領導者是如何被選出來的。

六、算法面臨的挑戰

當出現網絡分區時,該算法就會違反安全保證,導致不同節點子集可能出現多個領導者,這種情況被稱為 "腦裂"。

排序靠前的節點有很強的偏向性,如果它們不穩定,就會出現問題。當不穩定的高排序節點屢次失敗并試圖再次成為領導者時,這種偏向會導致不斷循環重復選舉。

盡管存在這些挑戰,Bully 算法還是為領導者選舉提供了一種清晰實用的方法,使其在可容錯分布式系統中發揮重要作用。

參考資料:

  • [1] Leader Election: Using Bully Algorithm in Golang: https://medium.com/@jitenderkmr/leader-election-using-bully-algorithm-in-go-60ec03bd277c
  • [2] Bully 算法: https://en.wikipedia.org/wiki/Bully_algorithm
責任編輯:趙寧寧 來源: DeepNoMind
相關推薦

2021-12-20 07:51:17

分布式 Kv分布式 Kv

2024-04-29 07:57:46

分布式流控算法

2022-05-23 09:10:00

分布式工具算法

2024-06-06 08:40:07

2021-08-26 08:03:30

大數據Zookeeper選舉

2021-03-18 09:18:39

分布式事務Saga

2022-06-27 08:36:27

分布式事務XA規范

2021-03-04 17:55:27

算法Raft分布式

2025-05-07 00:15:00

分布式算法Election

2021-03-03 08:13:23

程序員分布式網絡

2024-11-19 15:55:49

2019-10-10 09:16:34

Zookeeper架構分布式

2019-09-05 13:06:08

雪花算法分布式ID

2017-09-01 05:35:58

分布式計算存儲

2023-05-29 14:07:00

Zuul網關系統

2019-06-19 15:40:06

分布式鎖RedisJava

2022-08-16 18:52:20

分布式容錯架構

2017-10-27 08:40:44

分布式存儲剪枝系統

2023-10-26 18:10:43

分布式并行技術系統

2016-12-16 11:05:00

分布式互斥線程
點贊
收藏

51CTO技術棧公眾號

里番在线观看网站| 国产高潮国产高潮久久久91| 久久电影tv| 国产婷婷精品av在线| 国产美女精品免费电影| 538精品在线视频| 久久影视三级福利片| 国产网站在线| 国产东北露脸精品视频| 欧美一区二三区| 精品伦精品一区二区三区视频密桃 | 一级免费在线观看| 欧美一区二区三区激情视频| 欧美一区二区三区影视| 日本一区二区黄色| 国产在线观看a视频| 91网站视频在线观看| 91亚洲va在线va天堂va国 | 亚洲永久无码7777kkk| 国产亚洲精品精品国产亚洲综合| 亚洲综合一区在线| 亚洲成人网上| 婷婷五月综合激情| 国产一区不卡在线| 国产成人久久久| 久久婷婷一区二区| 99精品国产一区二区三区| 日韩av有码在线| 奇米777在线视频| av成人在线播放| 欧美日韩亚洲激情| 精品视频在线观看一区二区| 91青青在线视频| 久久网站最新地址| 精品久久sese| 国产夫妻在线观看| 久久成人免费电影| 中文字幕一区三区| 日韩电视剧在线观看免费网站| 天堂在线资源视频| 中文字幕这里只有精品| 亚洲国产日日夜夜| 欧美精品久久96人妻无码| 北条麻妃在线| 久久综合色之久久综合| 国产精品久久久久久久久久久久冷| 中文字幕 欧美激情| 视频在线观看一区| 日本成人免费在线| 久久久久久不卡| 亚洲一区免费| 91高潮精品免费porn| 亚洲一区二区91| 欧美体内she精视频在线观看| 日韩中文字在线| 日韩av片在线| 成人精品电影| 中文字幕视频一区二区在线有码| 精品人妻无码一区二区三区换脸| 亚洲bt欧美bt精品777| 亚洲精品乱码久久久久久金桔影视| 精品国产免费久久久久久婷婷| 欧美一级大片在线视频| 欧美一区二区在线免费播放| 午夜免费一级片| 国产一区二区三区免费在线| 在线综合视频播放| 无套白嫩进入乌克兰美女| 久久国际精品| 亚洲成人网在线观看| 少妇激情一区二区三区视频| 久久国产精品色av免费看| 日韩av一区在线| 第一次破处视频| 成人影视亚洲图片在线| 久久久999国产| 久久久久久久久99| 99国产精品99久久久久久粉嫩| 97高清免费视频| 噜噜噜噜噜久久久久久91| 亚洲av无码片一区二区三区| 北条麻妃一区二区三区| 欧美不卡1区2区3区| 成人午夜电影在线观看| 综合欧美亚洲日本| 99er在线视频| 国产精品av一区二区三区| 在线观看日韩一区| 亚洲av无日韩毛片久久| 韩国精品福利一区二区三区| 国产网站欧美日韩免费精品在线观看| 亚洲欧洲久久久| 亚洲va在线| 午夜精品三级视频福利| 91麻豆精品在线| 国产一区二区三区免费看| 国产私拍一区| 99青草视频在线播放视| 亚洲国产精品久久人人爱| 大肉大捧一进一出好爽动态图| 成人黄色免费观看| 日韩欧美123| 美女久久久久久久久久| 亚洲精品成人无限看| 69精品小视频| hs视频在线观看| 久久夜色精品国产噜噜av| 天堂v在线视频| 校园春色亚洲| 欧美一区日韩一区| 久久久久久久毛片| 亚洲片区在线| 国产日韩在线播放| 日本中文字幕一区二区有码在线| 亚洲欧美怡红院| 日韩视频第二页| 中文在线免费一区三区| 中文字幕日韩精品在线| 日韩字幕在线观看| 精品麻豆一区二区三区| 国产精品亚洲成人| 四虎影院一区二区三区| 日本免费一区二区六区| 日韩欧美国产一区二区在线播放| 三区四区在线观看| 亚洲久久视频| 99爱精品视频| 九色porny在线| 91久久久免费一区二区| 国产麻豆天美果冻无码视频| 综合激情一区| 国产精品一二区| 猫咪在线永久网站| 精品女厕一区二区三区| 久久无码专区国产精品s| 国产精品99久久精品| 国产va免费精品高清在线观看| 亚洲精品视频91| 亚洲美女精品一区| 午夜一区二区视频| 日韩中文首页| 国产精品狼人色视频一区| 日本高清中文字幕二区在线| 亚洲韩国一区二区三区| 黄色片子免费看| 亚洲国产精品成人| 91免费国产视频| 色三级在线观看| 在线免费观看一区| 免费看污片网站| 久久国产精品99国产| 久久精品中文字幕一区二区三区| 俺来俺也去www色在线观看| 欧美成人aa大片| 久久机热这里只有精品| 国产精品一区二区久激情瑜伽| 99热这里只有精品7| 婷婷激情成人| 欧美成人免费网| 国产黄色小视频在线观看| 亚洲另类在线一区| 久久久久99人妻一区二区三区| 欧美激情无毛| 国产一区二区三区奇米久涩| 成人三级高清视频在线看| 亚洲激情视频在线播放| 超碰超碰超碰超碰| 26uuu欧美| 91n.com在线观看| 97精品国产| 色综合天天综合色综合av| 亚洲a∨一区二区三区| 成人网ww555视频免费看| 日韩一区二区av| www日本在线| 婷婷中文字幕综合| 日韩视频在线观看免费视频| 麻豆精品久久久| 亚洲天堂第一区| 国产精品香蕉| 国产成人久久精品| 国产黄色在线观看| 亚洲第一区第一页| av手机天堂网| 亚洲女与黑人做爰| 波多野结衣有码| 日韩综合小视频| 日本一本草久p| 免费看成人人体视频| 国产精品美乳在线观看| av免费在线免费观看| 亚洲精品成人久久| 亚洲视频在线观看免费视频| 亚洲精品成人悠悠色影视| 亚洲黄色在线网站| 精品一区二区三区日韩| 黄网站欧美内射| 成人免费看片39| 国产伦精品一区二区三毛| 性欧美freehd18| 欧美极品少妇与黑人| 成人av电影观看| 精品少妇一区二区三区视频免付费| 欧美性猛交bbbbb精品| 亚洲欧美在线aaa| 麻豆精品免费视频| 高清在线不卡av| 色国产在线视频| 99人久久精品视频最新地址| 中文网丁香综合网| 亚洲欧美校园春色| yellow视频在线观看一区二区| 色香欲www7777综合网| 国内精品久久久久影院 日本资源| 国产中文字幕在线| 亚洲第一中文字幕在线观看| 一级片在线观看视频| 欧美性猛交xxxx| 精品午夜福利在线观看| 国产精品三级av| 青青草视频成人| 国产不卡视频在线观看| 亚洲高清免费在线观看| 久久精品综合| 日本国产在线播放| 少妇高潮久久久| 成人妖精视频yjsp地址| 美女在线视频一区二区| 久久国产毛片| 一区二区传媒有限公司| 欧美日韩精品一本二本三本| 综合久久国产| 青青草成人影院| 日本免费一区二区三区| 天天躁日日躁成人字幕aⅴ| 成人性色av| 欧美高清hd| 亚洲一区二区三区sesese| 国产精品99| 国产精品欧美久久久| 最新日韩精品| 欧美最猛黑人xxxx黑人猛叫黄| 好看的中文字幕在线播放| 久操成人在线视频| 国产乱色在线观看| 久久影院免费观看| 日本在线免费看| 日韩中文第一页| 91高清在线| 日韩在线播放一区| 麻豆tv在线| 久久综合伊人77777蜜臀| 成人video亚洲精品| 美女少妇精品视频| 2024最新电影免费在线观看| 久久国产精品免费视频 | 丁香五月缴情综合网| 动漫美女被爆操久久久| 999久久久久久久久6666| 91九色在线免费视频| 欧美日本三级| 国产精华一区二区三区| 久久1电影院| 久久精品国产99精品国产亚洲性色| 欧美尿孔扩张虐视频| 欧美一区二区三区四区五区六区 | 国产精品一二三四区| 91福利视频免费观看| 成人永久看片免费视频天堂| 亚州av综合色区无码一区| 97久久超碰国产精品| 国产又粗又猛又爽视频| 国产精品色哟哟网站| 男人与禽猛交狂配| 午夜电影一区二区| 亚洲图片欧美日韩| 在线播放一区二区三区| www.国产黄色| 日韩电影中文字幕在线| 成人福利在线| 欧美高清自拍一区| 貂蝉被到爽流白浆在线观看| 一区二区三区四区在线观看国产日韩| 视频在线观看成人| 欧美日韩国产综合网| 久久久久人妻精品一区三寸| 免费精品99久久国产综合精品| 久久精品国产99久久99久久久| 成人深夜视频在线观看| 无码人妻精品一区二区中文| 亚洲女子a中天字幕| 青青国产在线观看| 欧美老肥妇做.爰bbww| 人人妻人人澡人人爽精品日本 | 91久久精品在线| 国产日韩三级| 亚洲一区美女| 99re国产精品| 久久久久久久久久毛片| 26uuu亚洲| 久久精品www| 欧美午夜片在线看| 欧日韩在线视频| 综合国产在线观看| av男人的天堂在线观看| 国产免费一区二区三区在线能观看 | 在线黄色免费网站| 国产精品福利一区二区| 天海翼一区二区| 91精品国产综合久久久久| 青青青草网站免费视频在线观看| 久久香蕉频线观| 国精产品一区二区三区有限公司| 成人av网站观看| 日韩专区精品| 37pao成人国产永久免费视频| 国产乱码精品1区2区3区| 欧美18—19性高清hd4k| 五月婷婷激情综合| 国产视频在线一区| 在线精品视频视频中文字幕| 国产免费拔擦拔擦8x高清在线人| 成人免费视频网| 欧美伦理影院| 欧美精品一区二区三区免费播放| 成人在线综合网站| 国产免费美女视频| 欧美性生交片4| 免费黄网站在线观看| 国内精品美女av在线播放| 日韩中文字幕在线一区| 在线视频不卡一区二区| 日韩成人一区二区| 成人乱码一区二区三区av| 图片区小说区区亚洲影院| 亚洲精品第五页| 欧美精品在线免费播放| 香蕉久久久久久| 日韩精品另类天天更新| 欧美在线综合| 国产视频在线观看一区| 国产亚洲一区二区手机在线观看 | 午夜老司机福利| www.日韩av.com| 国产精品66| 影音先锋亚洲视频| 久久精品国产久精国产| 99久久99久久精品免费看小说.| 欧美性色19p| 精品无人乱码| 国产成人91久久精品| 国产调教一区二区三区| 黄色三级视频片| 中文字幕av一区二区三区高| 波多野结衣一二区| 一区二区亚洲欧洲国产日韩| 91天天综合| 一区二区三区四区欧美| 国产一区视频导航| 欧美激情一区二区视频| 精品国产一二三| av资源一区| 久久久久久a亚洲欧洲aⅴ| 欧美综合二区| 国产成人一区二区在线观看| 精品视频1区2区| 国产三级在线播放| 国产精品一区二区av| 亚洲一区二区免费看| 成年人免费观看视频网站| 欧美伊人久久大香线蕉综合69| 日本在线免费播放| 成人片在线免费看| 国产精品免费看| 中文字幕第24页| 日韩欧美一卡二卡| 黄色在线网站噜噜噜| 日本不卡一二三区| 精品一区二区免费在线观看| 欧美成人精品一区二区免费看片| 欧美精品一区二区久久久| 在线最新版中文在线| 亚洲黄色成人久久久| 国产精品自拍在线| aaa人片在线| 中文字幕亚洲欧美日韩2019| 日本精品一区二区三区在线观看视频| 日本一区午夜艳熟免费| 国产亚洲短视频| 国产高清免费观看| 全球成人中文在线| 999久久久91| 国产麻豆天美果冻无码视频| 欧美人xxxx| 波多野结依一区| 一区二区三区四区五区视频 | 福利精品视频| 久久久天天操| 强行糟蹋人妻hd中文| 亚洲性生活视频|