- 我们知道,对于类似zookeeper这种强一致性分布式服务框架,需要一种保证任意时刻只有一个Leader存在的机制。不过我有个疑问,为什么一定要用“选举机制”来保证呢?什么ZAB协议,什么Serverid,Zxid,Epoch这些东西,不复杂吗?
- 我的想法是能否用类似“顺位继承”机制来代替,具体算法是:任意一个节点在加入集群的时候就获得一个唯一序号,并且每个节点都保存一份最新的序号列表、当前Leader序号、自己的序号。最先成为Leader的序号最小,当Leader挂了,集群存活的节点之间无需“选举”,都自动认为比该Leader的序号大的下一个序号所在的节点成为下一任Leader,这就是所谓的“顺位继承”。至于节点进入集群时的序号生成算法,选择就太多了,如:随机、自增、按节点自身的资源权重进行计算(比如自身的资源CPU、内存、硬盘比其他节点高,自身生成的序号就可以更靠近当前Leader的序号)等等都可以。
- 当然,这种依赖“序号”的顺位继承机制也是有缺陷的,比如当前Leader的序号可能会一直变大,最终用尽,到时候需要一种序号重排的算法为集群里的所有节点进行序号重排。但是比起“选举”所消耗的资源和时间,我认为“顺位继承”显然是更香的。
选举可以保证能从集群中找出一个最优的服务晋升为Leader继续处理事务和调度等一系列职责