在分布式集群中,需要有一个主节点负责对其他节点的协调和管理。主节点的存在,可以保证其他节点有序运行,保持数据库集群中的写入数据在每个节点上的一致。
这里介绍几种常见的分布式选举算法。
Bully 算法
在 Bully 算法中,节点的角色有两种:普通节点和主节点。它的选举原则是“长者”为大,即在所有活着的节点中,选取 ID 最大的节点作为主节点。
Bully 算法在选举过程中,需要用到以下 3 种消息:
- Election 消息,用于发起选举;
- Alive 消息,对 Election 消息的应答;
- Victory 消息,竞选成功的主节点向其他节点发送的宣誓主权的消息。
假设条件是,集群中每个节点均知道其他节点的 ID。
其具体的选举过程是:
- 集群中每个节点判断自己的 ID 是否为当前活着的节点中 ID 最大的,如果是,则直接向其他节点发送 Victory 消息,宣誓自己的主权;
- 如果自己不是当前活着的节点中 ID 最大的,则向比自己 ID 大的所有节点发送 Election 消息,并等待其他节点的回复;
- 若在给定的时间范围内,本节点没有收到其他节点回复的 Alive 消息,则认为自己成为主节点,并向其他节点发送 Victory 消息,宣誓自己成为主节点;
- 若接收到来自比自己 ID 大的节点的 Alive 消息,则等待其他节点发送 Victory 消息;
- 若本节点收到比自己 ID 小的节点发送的 Election 消息,则回复一个 Alive 消息,告知其他节点,我比你大,重新选举。
优点:
- 选举速度快
- 算法复杂度低
- 简单易实现
缺点:
- 额外信息存储较多
- 比主节点的ID大的节点频繁进入或退出集群,容易激发多次选举。
Raft算法
Raft 算法中,获得投票最多的节点成为主。
角色:
- Leader 主节点,同一时刻只有一个 Leader,负责协调和管理其他节点;
- Candidate 候选者,每一个节点都可以成为 Candidate,节点在该角色下才可以被选为新的 Leader;
- Follower Leader 的跟随者,不可以发起选举。