精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

成年人视频软件| 国产原创av在线| 乱亲女h秽乱长久久久| 亚洲成av人片在线| 欧美久久综合性欧美| 亚洲视频中文字幕在线观看| 午夜精品电影| 亚洲天堂av高清| 一区二区三区高清视频在线观看| 色88888久久久久久影院按摩 | 99久久久国产精品无码免费| 国产精品99视频| 91丝袜呻吟高潮美腿白嫩在线观看| 4k岛国日韩精品**专区| 日韩精品一区二区三区色偷偷| 国产一区二区三区三州| 国产伦精品一区二区三区免费优势| 亚洲大片在线观看| 欧美重口乱码一区二区| 亚洲精品无码专区| 久久精品国产精品亚洲精品| 91精品国产91久久久久| 亚洲人成无码www久久久| 亚洲国产精品午夜在线观看| 国产免费久久久久| 成人短视频在线| 97久久精品人人澡人人爽| 69堂亚洲精品首页| www.亚洲天堂网| 特黄视频在线观看| 国内精品免费在线观看| 欧美一级大片视频| 麻豆一区产品精品蜜桃的特点| 色综合综合网| 亚洲精品久久久久中文字幕欢迎你| 国产不卡一区二区视频| 免费在线一级片| 色狠狠一区二区三区| 亚洲二区在线观看| 日韩av电影免费在线观看| 欧美 日韩 国产 成人 在线| 肉肉视频在线观看| 国产精品成人久久| 久久夜色精品国产欧美乱极品| 日本韩国欧美| 久久成人精品无人区| 91禁国产网站| 欧美日韩在线视频免费播放| 精品少妇av| 欧美videos中文字幕| 2014国产精品| 中文资源在线播放| 日产欧产美韩系列久久99| www.久久久久久.com| 蜜乳av中文字幕| 老牛国内精品亚洲成av人片| 欧美丰满一区二区免费视频| 高清一区二区视频| av免费不卡国产观看| 亚洲综合一二三区| 国产日韩精品一区观看| 亚洲男人第一av| 日韩人妻精品中文字幕| 视频污在线观看| 蜜臀99久久精品久久久久久软件| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲精品无码一区二区| 免费精品一区| 91精品国产综合久久精品麻豆| 污污的网站18| 国产精品麻豆| 成人美女视频在线观看18| 成人黄色片视频网站| 精品无码久久久久| 国产精品99久久免费观看| 日韩欧美中文字幕公布| 超碰在线播放91| eeuss影院www在线观看| 综合久久一区二区三区| 亚洲伊人婷婷| 午夜影院免费在线| 亚洲午夜在线视频| 欧美中日韩在线| 午夜激情成人网| 91精品欧美综合在线观看最新| 中文字幕亚洲电影| 岛国视频一区免费观看| 高h放荡受浪受bl| 久久免费电影网| 亚洲永久一区二区三区在线| 污视频免费在线观看| 午夜精品成人在线| www.涩涩涩| 丁香一区二区| 一区二区在线视频| 久久久国产精品黄毛片| 欧美福利在线| 欧美最猛性xxxx| 国产乡下妇女三片| 国产精品18久久久久久vr| 2014亚洲精品| 国产小视频在线| 久久午夜色播影院免费高清 | 免费萌白酱国产一区二区三区| 亚洲国产精品免费| 一级特黄曰皮片视频| 欧美午夜不卡| 国产精品一区二区久久久久| 久久久久久久久久免费视频| 视频一区中文字幕国产| 欧美激情理论| 在线观看国产精品日韩av| 日韩一级片在线免费观看| 欧美日韩国产高清| 91国内揄拍国内精品对白| 91麻豆成人精品国产| 99久久婷婷国产精品综合| 国产精品夜间视频香蕉| www.激情五月.com| 26uuu精品一区二区| 亚洲bt天天射| 手机看片一区二区| 最好看的中文字幕久久| 看欧美ab黄色大片视频免费| 香蕉成人app| 欧美精品一区二区精品网| 久久久久无码精品| 国产精品毛片av| 久久成人免费视频| 欧美一级片免费在线观看| 国产一区二区调教| 一级做a爰片久久| 日韩久久一区二区三区| 精品视频在线观看日韩| 亚洲乱码中文字幕久久孕妇黑人| 麻豆成人免费视频| 国产精品123区| 在线观看免费黄色片| 丰满少妇高潮久久三区| 中文无码久久精品| 久久免费国产精品1| 扒开伸进免费视频| 国产精品久久久久一区二区三区厕所| 欧美成人精品三级在线观看| 丁香六月婷婷综合| 99久久免费视频.com| 日本xxxxxxxxxx75| 福利欧美精品在线| 亚洲日本中文字幕| 国产成人亚洲精品自产在线| 老司机午夜免费精品视频 | 欧美成人午夜77777| 久久艳片www.17c.com| 国产探花在线播放| 亚洲精品字幕| 精品日本一区二区三区在线观看| rebdb初裸写真在线观看| 精品国产成人系列| 91精品国产乱码在线观看| av欧美精品.com| 成人xxxx视频| 日日噜噜夜夜狠狠久久丁香五月| 国产写真视频在线观看| 欧美色窝79yyyycom| 91精品人妻一区二区三区| 亚洲天堂偷拍| av一区二区三区四区电影| 日本电影在线观看网站| 国产精品一区免费在线| 在线日韩av观看| 加勒比av在线播放| 看国产成人h片视频| 在线播放 亚洲| 亚洲成av在线| 国产亚洲精品91在线| 97免费在线观看视频| 国产农村妇女精品| 国产欧美精品一二三| 一个色综合网| 国产精选一区二区| 亚洲人成午夜免电影费观看| 在线亚洲男人天堂| 国产丰满果冻videossex| 精品久久久中文| 亚洲一二三四视频| 国产伦一区二区| av成人黄色| 日韩免费电影一区二区| 久久久国产精品网站| 中文字幕日韩av电影| 一级黄色小视频| 午夜精彩视频在线观看不卡| 五月天精品视频| 国产美女主播视频一区| 午夜肉伦伦影院| 亚洲欧洲美洲一区二区三区| 国产亚洲二区| 精品美女一区| 性色av一区二区咪爱| 最新国产在线观看| 亚洲精品在线免费播放| 在线免费a视频| 精品久久久久久久久久ntr影视| 日本不卡一区视频| 99视频精品免费视频| 美女少妇一区二区| 亚洲综合国产| 99久热在线精品视频| 精品国产不卡| 国产精品久久久久av福利动漫| 国产极品一区| 欧美怡春院一区二区三区| 久cao在线| 在线播放日韩av| 香蕉视频免费在线看| 日韩免费高清视频| 国产乱国产乱老熟300| 97精品久久久午夜一区二区三区| 婷婷中文字幕在线观看| 久久三级视频| www.av91| 亚洲综合婷婷| 亚洲欧洲一区二区福利| 免费成人av| 国产精品日韩一区二区三区| 九九99久久精品在免费线bt| 国产成人a亚洲精品| sm在线播放| 欧美激情视频一区| 国产黄色av网站| 欧美视频日韩视频| 99精品人妻国产毛片| 精品女厕一区二区三区| 欧美人妻一区二区| 自拍av一区二区三区| 免费黄色片网站| 久久一夜天堂av一区二区三区 | 一级片视频在线观看| 一区二区三区免费在线观看| 99久久婷婷国产综合| 亚洲欧美在线观看| 国产7777777| 国产精品少妇自拍| 91激情视频在线观看| 国产日韩av一区| 天天操天天干天天操天天干| 欧美激情一区在线观看| 丰满的亚洲女人毛茸茸| 欧美国产日本韩| 国产黄色片在线| 亚洲欧洲日韩在线| 裸体武打性艳史| 亚洲一区二区三区中文字幕在线| 男人的午夜天堂| 亚洲美女在线一区| 精品无码一区二区三区电影桃花| 一区二区三区在线免费观看| 九九免费精品视频| 性做久久久久久| 自拍偷拍欧美亚洲| 欧美性三三影院| 国产精品一区二区三区在线免费观看| 日韩人在线观看| 中文字幕黄色av| 欧美一级二级在线观看| 亚洲免费国产视频| 日韩国产欧美区| 成人免费高清在线播放| 久久亚洲综合国产精品99麻豆精品福利| 成人三级网址| 性色av一区二区三区| 成人看片网站| 亚洲伊人久久大香线蕉av| 久久视频在线观看| 欧洲亚洲一区| 日韩一区电影| 青草青青在线视频| 日本欧美大码aⅴ在线播放| 日本网站在线看| 99久久99精品久久久久久| 成人无码www在线看免费| 91麻豆精品一区二区三区| 高潮毛片无遮挡| 国产精品久久久久久久久免费桃花 | 国产三级中文字幕| 国产欧美精品| 色乱码一区二区三区在线| 成人午夜碰碰视频| 99国产一区二区三精品乱码| 日本人69视频| 国产一区二区三区四区五区美女| 国产精品日韩久久久久| 久久免费影院| 国产精品国色综合久久| 国产乱码精品一区二区亚洲 | 色婷婷久久久亚洲一区二区三区| 岳乳丰满一区二区三区| 欧美精品一区二区在线播放| 国产美女视频一区二区三区 | 蜜臀久久精品| 亚洲无亚洲人成网站77777| 毛片av在线| 日韩免费高清在线观看| 久久伊人久久| 鬼打鬼之黄金道士1992林正英| 亚洲开心激情| 亚洲蜜桃av| 亚洲每日更新| 欧美视频亚洲图片| 久久这里只有精品视频网| 欧美视频www| 狠狠躁夜夜躁人人爽超碰91| 国产精品视频无码| 亚洲人成五月天| а天堂中文在线官网| 国产精品69久久| 牛牛影视一区二区三区免费看| 日本10禁啪啪无遮挡免费一区二区| 欧美极品一区二区三区| 亚洲xxx在线观看| 国产欧美va欧美不卡在线| wwwav国产| 欧美精品久久久久久久久老牛影院| 亚洲av电影一区| 国模私拍视频一区| 日韩最新av| 国产成人免费高清视频| 丝袜亚洲另类欧美| 免费黄色在线视频| 精品久久久久久久久久ntr影视| 亚洲精品国偷拍自产在线观看蜜桃| 一本久久综合亚洲鲁鲁| 中文字幕在线视频久| 国偷自产av一区二区三区小尤奈| 国产精品大片| 中文字幕一区二区三区四| 国产精品的网站| 国产精品久久久久久久免费| 日韩在线视频网站| 日本免费在线一区| 一区二区不卡视频| 美国av一区二区| 亚洲精品自拍视频在线观看| 色爱区综合激月婷婷| 欧美理论在线观看| 国产91精品久久久久久| 清纯唯美亚洲经典中文字幕| 九九爱精品视频| www成人在线观看| 久久久久久久中文字幕| 91精品国产综合久久精品| 青春草在线视频| 国产欧美亚洲日本| 亚洲国产国产亚洲一二三| 少妇精品无码一区二区三区| 美美哒免费高清在线观看视频一区二区 | 亚洲最大av网| 国产精品豆花视频| 亚洲精品乱码久久久久久不卡 | 一级片在线免费观看视频| 国产一区二区免费| 91精品麻豆| 毛片在线视频观看| av一本久道久久综合久久鬼色| 国产大片aaa| 日韩欧美中文字幕制服| 在线xxxx| 久久久久久99| 美日韩一区二区| 青青青在线视频| 精品国产免费视频| 亚洲精品成人图区| 色一情一乱一伦一区二区三区丨| 日韩精品免费专区| 91丨porny丨九色| 亚洲图片一区二区| 每日更新av在线播放| 国产日本欧美一区二区三区在线| 午夜精品久久| 亚洲区自拍偷拍| 欧美一区日韩一区| 成人免费观看在线观看| 欧美精品亚洲| 国产乱码精品一区二区三| 麻豆亚洲av熟女国产一区二| 亚洲男人天堂久| 欧美在线在线| aⅴ在线免费观看| 亚洲欧洲99久久| 五月婷中文字幕| 成人伊人精品色xxxx视频| 亚洲理论在线| 中国一级片在线观看| 欧美久久久久久蜜桃| 在线手机中文字幕| 日韩专区第三页| 亚洲国产成人自拍| 天天射,天天干| 亚洲一区二区中文| 日韩精品午夜视频|