Zookeeper学习-04 ZooKeeper实现 Master-Worker协同

1、master-worker架构

master-work是一个广泛使用的分布式架构。master-work架构中有一个master负责监控worker的状态,并为worker分配任务。

  1. 在任何时刻,系统中最多只能有一个master,不可以出现两个master的情况,多个master共存会导致脑裂。
  2. 系统中除了处于active状态的master还有一个backup master,如果active master失败了,backup master可以很快的进入active状态。
  3. master实时监控worker的状态,能够及时收集worker成员变化的通知。master在收到worker成员变化时,通常重新进行任务的重新分配。


    04-01 worker-master架构.png

2、master-worker架构实例- HBase

HBase 采用的是mater-worker的架构,HMBase是系统中的master,HRegionServer是系统中的worker。
HMBase监控HBase Cluster中的worker的成员变化,把region分配给各个HRegionServer.系统中有一个HMaster处于active状态,其他HMaster处于备用状态。


04-04HBase master-worker架构.png

3、master-worker架构实例-Kafka

一个Kafka集群是有多个broker组成,这些broker是系统中的worker,Kafka会从这些worker选举出一个controller,这个controller是系统中的master,负责把topic partition分配给各个broker。


Kafka master-worker架构.png

4、master-worker架构实例- HDFS

HDFS采用的也是一个master-worker的架构,NameNode是系统中的master,DataNode是系统中的worker。NameNode用来保存整个分布式文件系统的metadata,并把数据块分配给cluster中的DataNode进行保存。


HDFS master-worker架构.png

5、如何使用ZooKeeper实现master-worker

  1. 使用一个临时节点/master表示master。master在行驶master的职能之前,首先要创建这个znode.如果能创建成功,进入active状态,开始行驶master职能。否则的话,进入backup状态,使用watch机制监控/master。假设系统中有一个active master和一个backup master,如果active master失败,它创建的/master就会被Zookeeper自动删除。这时backup master就会收到通知,通过再次创建/master节点成为新的active master。
  2. worker通过在/workers下面创建临时节点来加入集群。
  3. 处于active状态的master会通过watch机制监控/workers下面的znode列表来实时获取worker成员的变化。


    zookeeper实现master-worker.png

6、通过zkCli.sh模拟实现master-worker

1) 通过命令 ls -R / 查看znode状态


04-05查看节点状态.png

2)创建 workers,并退出

create /workers
quit
04-06 create-workers.png

3)创建master1并配置主机名和端口号

create -e /master "m1:2223"

创建成功,此时处于active状态,可以行使master职能


创建master104-07.png

4)另启动一个客户端,创建master2并配置主机名和端口号

create -e /master "m2:2223"

此时会创建失败,只能处于backup状态


04-07m2创建失败.png

通过stat命令,来监控master节点的变化

stat -w /master
04-08查看master节点变化.png

5)假设master1失败(quit退出)


04-09 master1 退出.png

此时master2 会收到一个通知,然后再去创建master的znode节点,则会创建成功

create -e /master "m2:2223"
04-10master2创建成功.png

6)如果master创建成功,通过命令

ls -w /workers 

来监控workers目录下znode 节点的变化


04-11 查看workers目录变化.png

7)另启动客户端,在workers目录下创建一个znode节点

create -e /workers/w1 "w1:2224"

此时master会收到一个通知:type:NodeChildrenChanged path:/workers


04-12创建w1成功.png

04-13查看works状态.png

8)在master中,再次监控workers目录变化:

ls -w /workers
04-14查看workers目录.png

9)另启动客户端,再创建一个workers节点

create -e /workers/w2 "w2:2224"

此时master又收到一个通知:type:NodeChildrenChanged path:/workers


04-15创建w2.png
04-16 master收到通知.png

10)在master中,通过命令:

ls -w /workers

查看workers目录下的节点状况


04-17 查看workers目录.png

11)此时退出(quit)w2节点来假设w2节点失败,此时master节点也会收到一个通知:
type:NodeChildrenChanged path:/workers


04-18 退出w2.png
04-19master收到通知.png

12)在master中,通过命令

ls -w /workers

查看workers目录下节点情况


04-20 查看workers目录.png

以上说明master可以实时监控workers目录下节点的变化,从而来做出相应的反应。

7、 其他问题

1)ZooKeeper的watch是one-time trigger。一个Watch收一次通知。
2)ls -w 和 stat -w 的区别。
ls列出一个znode下的子znode列表,stat是返回一个znode的stat信息。
-w选项是用来一个设置一个watch,适用于ls和stat。
3)
1.为什么第一个创建的znode:m1会成为master?这跟创建顺序有关系吗?
2.如果创建了两个znode来监听/workers下的worker,两个znode都收到了监听消息,是否跟唯一master监听worker相悖了?
在ZooKeeper上面创建/master这个znode,如果/master这个znode已经存在,这个创建就会失败。只有一个节点创建/master节点成功了,它才可以确认自已成了master。因为master1节点先做的创建,所以它的创建成功了,它就成了master。因为master2后做的创建,它的创建就会失败,它就知道自己没能成为master。
多个节点必须遵循先成功创建/master这个znode,再监听/workers下的worker才能能保证master的唯一性。

你可能感兴趣的:(Zookeeper学习-04 ZooKeeper实现 Master-Worker协同)