目录
- 主从模式vs无主模式
- ES选举算法
- 流程
选主流程
主从模式 VS. 无主模式
分布式系统的集群方式大致可以分为主从模式(Master-Slave)和无主模式。
模式 | 代表组件 | 优点 | 缺点 |
---|---|---|---|
主从模式 | ES/HDFS/HBase | 简化系统设计,Master作为权威节点,负责维护集群原信息。 | Master节点存在单点故障,需要解决在被问题,并且集群规模会受限于Master节点的管理能力。 |
无主模式 | Cassandra | 分布式哈希表(DHT),支持每小时数千个节点的离开和加入。 | 集群没有master的概念,所有节点都是同样的角色,彻底避免了整个系统的单点问题导致的不稳定性。多个节点可能操作同一条数据,数据一致性上可能比较难以保证。 |
ES选举算法
常用的选举算法有比较简单的Bully算法和复杂而强大的Paxos算法。
Bully算法
每个节点有一个唯一ID,然后对集群中所有的节点ID进行排序,选取其中最小的ID所属的节点作为Master。
Bully算法的问题: 假设当前Master因为负载过重而假死,然后ID第二大的被选举为新的Master,这时旧的Master恢复然后又被选举为Master然后又会因为负载过重而假死......
Paxos算法
Paxos实现起来非常复杂,但非常强大,尤其在什么时机,以及如何进行选举方面的灵活性比简单的Bully算法有很大的优势,因为在现实生活中,存在比网络链接异常更多的故障模式。
ES使用的是Bully算法,并对其做了一些优化:
- 每个节点结算最小的ID,把它选举为临时Master,然后对该master进行投票;
- 每个节点收集票数,当票数大于指定的法定个数时,成为Master,然后对加入的节点进行集群信息广播。
流程
- ping所有节点,并获取PingResponse返回结果(findMaster)
- 过滤出具有Master资格的节点(filterPingResponses)
- 选出临时Master。根据PingResponse结果构建两个列表:activeMasters和masterCandidates。
- 如果activeMasters非空,则从activeMasters中选择最合适的作为Master;
- 如果activeMasters为空,则从masterCandidates中选举,结果可能选举成功,也可能选举失败。
- 判断临时Master是否是本节点。
- 如果临时Master是本节点:则等待其他节点选我,默认30秒超时,成功的话就发布新的clusterState。(当选总统候选人,只等选票过半了)
- 如果临时Master是其他节点:则不再接受其他节点的join请求,并向Master节点发送加入请求。(没资格选举,就只能送人头了)