背景
在集群中,经常会需要选举master,在很多开源分布式中间件比如ZK,ES都会有master选举问题。通常我们会使用ZK或者自己实现来做master选举。但是,因为master选举的功能,而引入ZK,代价太大,并且增加系统维护成本。自己实现你master则需要设计完整的master选举算法,目前大部分都是各自实现自己的master算法。
还有另外一个场景,集群内的机器需要相互感知到对方的存在。在当前正在处理重要事务的机器宕机后,其他机器可以立刻感知到,并继续处理。通常可以采用ZK实现。
在没有ZK的情况下,怎么去实现呢?
应用场景
- 分布式集群的master选举
- 分布式锁
- 分布式任务调度节点选举
- 适用于处理需要在集群中选举出一个节点的场景
- 集群内节点相互感知
基本功能
- 集群内相互感知,维护集群状态
- master选举服务
- 提供观察者服务,在master发生变更后,推送变更
算法调研
Bully
为集群中的每一个服务设置唯一编号,选举编号最大(小)的服务为master。他会导致脑裂问题,并且因为选举为master的服务大部分时间是一个,集群的稳定性依赖于master单机服务的稳定性。
Bully变种
ES的选举算法
Paxos
Chubby
Raft
etcd
ZAB协议
ZooKeeper
目标
本文主要在讨论了现有的master选举算法,想要实现一个不依赖任何外部服务的master选举组件,提供简单的api和配置,引入jar即可使用。