在分布式系统中采用的是主从架构,也就是有一个主节点,若干个从节点。主节点可以执行读写操作,从节点只执行读操作。采用这种一主多从的方案,可以有效保证了数据的一致性(哪怕不是强一致性,也能有效保证最终一致性)。
在开源的Redis,MongoDB,Zookeeper等软件中也都采用了的选举算法,常用的选举算法有以下三种:Bully算法,Raft算法,ZAB算法。
1、Bully算法
Bully算法是一种简单直接的算法,因为它的选举原则是取ID的最大值作为主节点。在Bully算法中,有两种节点角色:普通节点和主节点。初始化的时候,所有节点都是普通节点。当主节点挂掉了,才会发起下一轮选举。
在选举中,有三种消息,分别是Election消息,用于发起选举。Alive消息,对Elelction消息的回复。Victory消息是选主成功后向其他节点发送的通知消息。选举过程如下:
- 集群中每个节点判断一下自己的节点ID是否为存活节点中最大,如果是则直接发送Victory消息,宣布自己为主节点。
- 如果自己不是最大的ID节点,则向比自己大的节点发送Election消息,等待其他节点回复。
- 在指定时间内没有收到其他节点Alive信息,则认为自己是主节点,然后向其他节点发送Victory消息,宣布自己是主节点。如果收到比自己ID大的节点Alive消息,则等待其他节点发送Victory消息。
- 如果收到比自己节点ID小的消息,则回复Alive消息,告诉对方重新选举。
该算法简单易于实现,但是当频繁有节点加入或退出,会