目錄
- 主從模式vs無主模式
- ES選舉算法
- 流程
選主流程
主從模式 VS. 無主模式
分布式系統(tǒng)的集群方式大致可以分為主從模式(Master-Slave)和無主模式逐抑。
模式 | 代表組件 | 優(yōu)點 | 缺點 |
---|---|---|---|
主從模式 | ES/HDFS/HBase | 簡化系統(tǒng)設(shè)計,Master作為權(quán)威節(jié)點咽袜,負責(zé)維護集群原信息讹开。 | Master節(jié)點存在單點故障盅视,需要解決在被問題,并且集群規(guī)模會受限于Master節(jié)點的管理能力旦万。 |
無主模式 | Cassandra | 分布式哈希表(DHT)闹击,支持每小時數(shù)千個節(jié)點的離開和加入。 | 集群沒有master的概念成艘,所有節(jié)點都是同樣的角色赏半,徹底避免了整個系統(tǒng)的單點問題導(dǎo)致的不穩(wěn)定性。多個節(jié)點可能操作同一條數(shù)據(jù)淆两,數(shù)據(jù)一致性上可能比較難以保證断箫。 |
ES選舉算法
常用的選舉算法有比較簡單的Bully算法和復(fù)雜而強大的Paxos算法。
Bully算法
每個節(jié)點有一個唯一ID秋冰,然后對集群中所有的節(jié)點ID進行排序仲义,選取其中最小的ID所屬的節(jié)點作為Master。
Bully算法的問題: 假設(shè)當(dāng)前Master因為負載過重而假死剑勾,然后ID第二大的被選舉為新的Master埃撵,這時舊的Master恢復(fù)然后又被選舉為Master然后又會因為負載過重而假死......
Paxos算法
Paxos實現(xiàn)起來非常復(fù)雜,但非常強大,尤其在什么時機,以及如何進行選舉方面的靈活性比簡單的Bully算法有很大的優(yōu)勢甥材,因為在現(xiàn)實生活中盯另,存在比網(wǎng)絡(luò)鏈接異常更多的故障模式。
ES使用的是Bully算法洲赵,并對其做了一些優(yōu)化:
- 每個節(jié)點結(jié)算最小的ID鸳惯,把它選舉為臨時Master商蕴,然后對該master進行投票;
- 每個節(jié)點收集票數(shù)芝发,當(dāng)票數(shù)大于指定的法定個數(shù)時绪商,成為Master,然后對加入的節(jié)點進行集群信息廣播辅鲸。
流程
- ping所有節(jié)點格郁,并獲取PingResponse返回結(jié)果(findMaster)
- 過濾出具有Master資格的節(jié)點(filterPingResponses)
- 選出臨時Master。根據(jù)PingResponse結(jié)果構(gòu)建兩個列表:activeMasters和masterCandidates独悴。
- 如果activeMasters非空例书,則從activeMasters中選擇最合適的作為Master;
- 如果activeMasters為空刻炒,則從masterCandidates中選舉决采,結(jié)果可能選舉成功,也可能選舉失敗坟奥。
- 判斷臨時Master是否是本節(jié)點树瞭。
- 如果臨時Master是本節(jié)點:則等待其他節(jié)點選我,默認30秒超時爱谁,成功的話就發(fā)布新的clusterState晒喷。(當(dāng)選總統(tǒng)候選人,只等選票過半了)
- 如果臨時Master是其他節(jié)點:則不再接受其他節(jié)點的join請求访敌,并向Master節(jié)點發(fā)送加入請求凉敲。(沒資格選舉,就只能送人頭了)