ZooKeeper(集群管理与Leader 选举)

ZooKeeper(集群管理与Leader 选举)

集群管理(Group Membership)

Zookeeper 能够很容易的实现集群管理的功能,如有多台 Server 组成一个服务集群,那么必须要一个“总管”知道当前集群中每台机器的服务状态,一旦有机器不能提供服务,集群中其它集群必须知道,从而做出调整重新分配服务策略。同样当增加集群的服务能力时,就会增加一台或多台 Server,同样也必须让“总管”知道。

Zookeeper 不仅能够帮你维护当前的集群中机器的服务状态,而且能够帮你选出一个“总管”,让这个总管来管理集群,这就是 Zookeeper 的另一个功能 Leader Election。

它们的实现方式都是在 Zookeeper 上创建一个 EPHEMERAL 类型的目录节点,然后每个 Server 在它们创建目录节点的父目录节点上调用getChildren(String path, boolean watch) 方法并设置 watch 为 true,由于是 EPHEMERAL 目录节点,当创建它的 Server 死去,这个目录节点也随之被删除,所以 Children 将会变化,这时 getChildren上的 Watch 将会被调用,所以其它 Server 就知道已经有某台 Server 死去了。新增 Server 也是同样的原理。

Zookeeper 如何实现 Leader Election,也就是选出一个 Master Server。和前面的一样每台 Server 创建一个 EPHEMERAL 目录节点,不同的是它还是一个 SEQUENTIAL 目录节点,所以它是个 EPHEMERAL_SEQUENTIAL 目录节点。之所以它是 EPHEMERAL_SEQUENTIAL 目录节点,是因为我们可以给每台 Server 编号,我们可以选择当前是最小编号的 Server 为 Master,假如这个最小编号的 Server 死去,由于是 EPHEMERAL 节点,死去的 Server 对应的节点也被删除,所以当前的节点列表中又出现一个最小编号的节点,我们就选择这个节点为当前 Master。这样就实现了动态选择 Master,避免了传统意义上单 Master 容易出现单点故障的问题。


本demo要求:

1. 每个节点是一个TCP Server,Server有一个Name,全局唯一,比如node1,node2,节点的监听IP、端口、以及TCP参数等配置信息在ZK的Config路径下保存,当节点启动的时候,根据其Name,去查找自己的配置信息,并生成为本地config目录下的配置文件 Name.properities (如node1.properties),然后节点从配置文件中加载参数并启动,当ZK无法连接的时候,也仍然能通过读取本地配置文件而启动。
2. 节点启动成功以后,注册自己到Node路径下,并监听Node路径中其他节点的上线和下线行为,记录下每个节点ip地址等其他连接信息,当节点停止后,对应的ZK路径消失,其他节点获取这一通知。
3. 多个节点需要选举为一个leader节点,数据的传输通过leader协调,如果leader挂掉重新选举,如果zookeeper挂掉,节点之间可以简单互相通信。

4.每个节点连线后互相给各个节点发送“hello world” 一直发送,每个节点保存所有节点的接受信息,当某个节点挂掉之后停止发送。


代码下载:/attached/file/20150614/20150614164227_171.zip