zookeeper其中的一个功能就是实现集群master的选举功能,这篇文章就来实现一下这个master选举功能,并附上相应的demo
首先是应用原理,先上一个原理图
结构图解释:左侧树状结构为zookeeper集群,右侧为程序服务器。所有的服务器在启动的时候,都会订阅zookeeper中master节点的删除事件,以便在主服务器挂掉的时候进行抢主操作;所有服务器同时会在servers节点下注册一个临时节点(保存自己的基本信息),以便于应用程序读取当前可用的服务器列表。
选主原理介绍:zookeeper的节点有两种类型,持久节点跟临时节点。临时节点有个特性,就是如果注册这个节点的机器失去连接(通常是宕机),那么这个节点会被zookeeper删除。选主过程就是利用这个特性,在服务器启动的时候,去zookeeper特定的一个目录下注册一个临时节点(这个节点作为master,谁注册了这个节点谁就是master),注册的时候,如果发现该节点已经存在,则说明已经有别的服务器注册了(也就是有别的服务器已经抢主成功),那么当前服务器只能放弃抢主,作为从机存在。同时,抢主失败的当前服务器需要订阅该临时节点的删除事件,以便该节点删除时(也就是注册该节点的服务器宕机了或者网络断了之类的)进行再次抢主操作。从机具体需要去哪里注册服务器列表的临时节点,节点保存什么信息,根据具体的业务不同自行约定。选主的过程,其实就是简单的争抢在zookeeper注册临时节点的操作,谁注册了约定的临时节点,谁就是master。
其实简单来说就是利用了zookeeper的临时节点特性,服务器心跳宕机之后,节点会自动删除,新master会注册
接下来直接看demo
1、javaApi实现
此处的此时代码,个人觉得不是很好,应该写成那种多线程通过访问选举的过程,多个线程多个zookeeper客户端,同时进行访问,这样更能模拟出真实的运行环境
2、zkclient实现,大部分逻辑代码都是一样的,可以参考javaApi原生代码实现
3、curator实现