简单领导人选举(无政府领导人选举)



我正在golang中构建一个应用程序,我希望它是容错的。我研究了不同的算法,如RAFT和Paxos,以及它们在golang中的实现(etcd的RAFT,hashicorp的RAFT(,但我觉得它们对我的特定用例来说可能有些过头了。

在我的应用程序中,节点只是在待机状态下等待,并在领导者失败的情况下充当故障切换。我不需要在整个集群中复制任何状态。我只需要以下属性:

如果一个节点是领导者:

  • 运行给定的代码

如果节点不是领导者:

  • 等待领导者失败
  • 一旦现有领导者失败,请重新选择领导者

有什么建议吗?

因为您想要一个领导者选举协议,所以听起来您希望避免同时有多个节点充当领导者。答案实际上取决于你对这个属性的要求有多严格。在某些情况下,偶尔有一个以上的节点充当领导者是可以接受的;也许最糟糕的情况是一些重复的工作。在其他情况下,如果有任何重复的领导者,整个系统可能会错误地运行,所以你必须更加小心。

如果你能接受偶尔出现的重复领导的情况,那么一个更简单的协议可能适合你。然而,如果你绝对不能容忍同时拥有多个领导人,那么你将不得不将你的领导人选举协议与某种状态的复制结合起来,而Paxos或Raft或类似的经验证的实现是一个非常好的方法。对此有很多微妙的不同协议,但它们基本上都在做同样的事情。

这里的根本问题是确定"立即"在现实网络中的含义,在现实网络下,消息有时可能会在很长的延迟后传递。通常,人们假设网络是完全异步的,在交付时没有时间限制,事实上,Paxos、Raft等都被设计为在这种假设下正确工作。这些算法通过定义自己的内部时间概念(Paxos中的选票,Raft中的术语(并将这个"内部时间"附加到他们控制下的所有状态转换中来解决这个问题。这提供了一些非常有力的保证,特别是确保没有两个节点可以在同一"内部时间"作为领导者采取行动。

如果你不通过Paxos或Raft之类的东西复制任何状态,那么你就无法利用这种强大的内部时间概念。

如果您将在Kubernetes集群中部署客户端go Kubernete库以满足您的特定用例,则可以使用该库。https://github.com/kubernetes-client/go

相关内容

  • 没有找到相关文章

最新更新