1、master-worker架构
master-work是一个广泛使用的分布式架构。master-work架构中有一个master负责监控worker的状态,并为worker分配任务。
- 在任何时刻,系统中最多只能有一个master,不可以出现两个master的情况,多个master共存会导致脑裂。
- 系统中除了处于active状态的master还有一个backup master,如果active master失败了,backup master可以很快的进入active状态。
-
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处于备用状态。

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

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

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

2)创建 workers,并退出
create /workers
quit

3)创建master1并配置主机名和端口号
create -e /master "m1:2223"
创建成功,此时处于active状态,可以行使master职能

4)另启动一个客户端,创建master2并配置主机名和端口号
create -e /master "m2:2223"
此时会创建失败,只能处于backup状态

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

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

此时master2 会收到一个通知,然后再去创建master的znode节点,则会创建成功
create -e /master "m2:2223"

6)如果master创建成功,通过命令
ls -w /workers
来监控workers目录下znode 节点的变化

7)另启动客户端,在workers目录下创建一个znode节点
create -e /workers/w1 "w1:2224"
此时master会收到一个通知:type:NodeChildrenChanged path:/workers


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

9)另启动客户端,再创建一个workers节点
create -e /workers/w2 "w2:2224"
此时master又收到一个通知:type:NodeChildrenChanged path:/workers


10)在master中,通过命令:
ls -w /workers
查看workers目录下的节点状况

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


12)在master中,通过命令
ls -w /workers
查看workers目录下节点情况

以上说明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的唯一性。
网友评论