zookeeper实现一主多从协同服务的示例
介绍
本文介绍zookeeper如何实现对一主多从的集群进行协同,要求系统中只能有一个master,master能实时监控系统中worker的情况。
前期准备
需要安装zookeeper,配好配置文件,启动zkServer.sh服务。可以参考:通过Zookeeper实现分布式锁示例
实现只能有一个master
启动两个zkCli.sh服务,其中一个客户端创建/master节点,此时另外一个就会创建失败:
当master1创建/master临时节点,带上节点名m1和端口号8081,创建成功。此时master2进行创建/master节点失败。此时master2可以对/master节点注册一个监听,这样当master节点发生变化时,就会收到通知。
此时主节点/master宕机,监听节点就会收到type:NodeDeleted path:/master的通知。
收到主节点移除的回调后:
master2可以再次尝试获取master:
由此保证了只有一个master节点。(这个原理与zookeeper实现分布式锁一样)
主节点实现对worker节点的监控
我们创建三个客户端,前面我们说过,节点会尝试成为主节点,/master节点创建失败的节点就会申请成为从节点,我们这里假设从节点就在/worker节点下:
主节点对worker节点进行监控:
-w表示对/workers节点进行监控,此时两个从节点进行节点注册:
小贴士:
这里的worker节点需为持久性节点,zookeeper规定,临时节点下不允许有子节点。如果你创建的/workers是一个临时节点,那么当你创建它的子节点时会报Ephemerals cannot have children: /workers/w1错误。
注册w1从节点,master就会收到通知,此时查看/workers从节点就可以看到w1:
同理,创建w2从节点,master节点也会收到通知。
与此同时,当从节点宕机,master节点也能收到回调:
这样就实现了zookeeper对从节点的监控。