3、通过zkCli⼯具命令和zk 的java API两种方式创建⼀个主从模式示列

1、示例说明:一个主从模型包含以下三个角色:
1) 主节点:负责监视新的从节点和任务及分配任务给可用的从节点:
创建临时主节点/master其节点值为主机信息,以便zk外部的其他进程需要与他通信,添加主机信息并不是必须的,但这样做仅仅是为了说明我们可以在需要时对主节点添加数据。一个活动的主节点可能崩溃,备份主节点需要接替活动主节点的角色,为了检测到这些,需要在/master节点上设置一个监视点。
备注:stat 命令可以得到一个znode节点的属性,并允许我们在已经存在的znode节点上设置监视点。通过在路径后面设置参数为true来添加监视点,当活动主节点崩溃是,我们观察到:NodeDeleted path:/master

2) 从节点:通过系统注册自己,以确认主节点看到他们可以执行任务,然后开始监听新任务:
创建三个父持久节点:/workers 、/tasks、/assign 并且不包含任何数据。一旦这些节点存在了,主节点就需要监视/workers和/tasks 子节点的变化情况。通过监视这些节点,可以告诉我们哪个从节点当前有效,还告诉我们当前有任务需要分配,并向从节点分配任务。从节点通过在/workers 子节点下创建临时性的znode来进行通知,并在子节点中使用主机名来标识自己。

3) 客户端:创建新任务,并等待系统的响应;
2、使⽤zkCli⼯具在命令窗口完成上述主从模式模拟:
步骤1:创建临时主节点、持久子节点
##创建临时主节点
create -e /master "master1.example.com:2223"

##尽管在任何时刻最多只能有⼀个活动的主节点,其他进程将成为备份主节点。假如其他进程不知道已经有⼀个主节点被选举出来,并尝试创建⼀个/master节点。那么ZK会告诉我们⼀个/master节点已经存在
##但是⼀个活动的主节点可能会崩溃,备份主节点需要接替活动主节点的⾓⾊。为了检测到这些,需要在/master节点上设置⼀个监视点
[zk: localhost:2181(CONNECTED) 8] create -e /master "master2.example.com:2234"
Node already exists: /master
[zk: localhost:2181(CONNECTED) 9]


##创建持久从节点,其节点内容均为空
create /wokers ""
create /tasks ""
create /assign ""

步骤2:对从节点/workers 和 /tasks 设置对各自子节点的监视点;在主节点上设置监视点;
##在主节点上调用stat命令前,我们使用ls -w 命令,先设置对应znode的子节点变化的监视
[zk: localhost:2181(CONNECTED) 12] ls -w /workers
[]
[zk: localhost:2181(CONNECTED) 13] ls -w /tasks
[]

##在主节点上设置监视点
stat -w /master

步骤3:从节点⾸先要通知主节点,告知从节点可以执⾏任务
##3.1 从节点通过在/workers 子节点下创建临时性的znode来进行通知(告知主节点我可以执行任务),并在子节点中使用主机名来标识自己
[zk: localhost:2181(CONNECTED) 16] create -e /wokers/wokers1.example.com "wokers1.example.com:2224 is created and ok,can execute task"
WATCHER::Created /wokers/wokers1.example.com
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/wokers
注:从输出的日志中可以看到一旦从节点在/workser下创建了一个通知子节点,主节点就会观察到通知信息
##3.2 从节点需要创建⼀个子节点 assing/worker1.example.com来接收任务分配,并通过ls命令对该节点设置监视点,来监视该节点的变化,以便等待新新的任务,至此,从节点就准备好了,可以接受任务分配
create /assign/workers1.example.com ""
ls -w /assign/workers1.example.com

##至此从节点就已经准备完成,可以接收任务分配,接下来我们通过讨论客户端⾓⾊来看⼀下任务分配的问题。


步骤4:
##客户端向系统中添加任务,我们按照任务添加的顺序来添加节点,其本质上是一个队列。客户端现在必须等待任务执⾏完毕。执⾏任务的从节点将任务执⾏完毕后,会创建⼀个znode来表⽰任务状态。
##客户端通过查看任务状态的znode是否创建来确定任务是否执⾏完毕,因此客户端需要监视状态znode的创建事件:
[zk: localhost:2181(CONNECTED) 19] create -s /tasks/task- "cmd"
Created /tasks/task-0000000000
[zk: localhost:2181(CONNECTED) 20]
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/tasks
注:从输出的日志中可以看到一旦从节点在/tasks 下创建了一个子节点,主节点就会观察到通知信息

##执行任务的从节点会在/tasks/task-0000000000节点下创建状态znode节点,所以我们需要⽤ls命令来监视/tasks/task-0000000000的⼦节点。
[zk: localhost:2181(CONNECTED) 21] ls -w /tasks/task-0000000000
[]

##主节点会检查新的任务,获取可用的从节点里列表,之后分配这个任务给worker1.example.com
ls /tasks
ls /workers

[zk: localhost:2181(CONNECTED) 18] create /assign/workers1.example.com/task-0000000000
WATCHER::Created /assign/workers1.example.com/task-0000000000
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/assign/workers1.example.com
注:从输出的日志可以看,从节点workers1.example.com 接收到新分配任务的通知

##从节点检查新任务,并确认任务是否分配给自己
ls /assign/workers1.example.com
[task-0000000000]

##一旦从节点完成任务的执行,他就会在/tasks中添加一个状态节点
[zk: localhost:2181(CONNECTED) 20] create /tasks/task-0000000000/status "done"
Created /tasks/task-0000000000/status
[zk: localhost:2181(CONNECTED) 21]

##之后客户端会接收到通知,并检查执行结果
get /tasks/task-0000000000
get /tasks/task-0000000000/status

总结:本列中我们看到任务执行成功,其状态为done,当然任务也可能非常复杂,甚至涉及另外一个分布式系统,最终不管是什么样的任务,执行任务的机制与通过zk来传递结果。本质上都是一样的。
posted @ 2020-09-07 16:20  爱笑的berg  阅读(185)  评论(0编辑  收藏  举报