摸鱼分布式——分布式选举

424 阅读2分钟

在分布式集群中,需要有一个主节点负责对其他节点的协调和管理。主节点的存在,可以保证其他节点有序运行,保持数据库集群中的写入数据在每个节点上的一致。

这里介绍几种常见的分布式选举算法。

Bully 算法

在 Bully 算法中,节点的角色有两种:普通节点和主节点。它的选举原则是“长者”为大,即在所有活着的节点中,选取 ID 最大的节点作为主节点。

Bully 算法在选举过程中,需要用到以下 3 种消息:

  • Election 消息,用于发起选举;
  • Alive 消息,对 Election 消息的应答;
  • Victory 消息,竞选成功的主节点向其他节点发送的宣誓主权的消息。

假设条件是,集群中每个节点均知道其他节点的 ID。

其具体的选举过程是:

  1. 集群中每个节点判断自己的 ID 是否为当前活着的节点中 ID 最大的,如果是,则直接向其他节点发送 Victory 消息,宣誓自己的主权;
  2. 如果自己不是当前活着的节点中 ID 最大的,则向比自己 ID 大的所有节点发送 Election 消息,并等待其他节点的回复;
  3. 若在给定的时间范围内,本节点没有收到其他节点回复的 Alive 消息,则认为自己成为主节点,并向其他节点发送 Victory 消息,宣誓自己成为主节点;
  4. 若接收到来自比自己 ID 大的节点的 Alive 消息,则等待其他节点发送 Victory 消息;
  5. 若本节点收到比自己 ID 小的节点发送的 Election 消息,则回复一个 Alive 消息,告知其他节点,我比你大,重新选举。

优点:

  • 选举速度快
  • 算法复杂度低
  • 简单易实现

缺点:

  • 额外信息存储较多
  • 比主节点的ID大的节点频繁进入或退出集群,容易激发多次选举。

Raft算法

Raft 算法中,获得投票最多的节点成为主。

角色:

  • Leader 主节点,同一时刻只有一个 Leader,负责协调和管理其他节点;
  • Candidate 候选者,每一个节点都可以成为 Candidate,节点在该角色下才可以被选为新的 Leader;
  • Follower Leader 的跟随者,不可以发起选举。