zookeeper实现主-从结构的一般原理

输入图片说明

以下文字只是时序图的解释说明,重点是看懂时序图。

为了避免主节点/从节点和zk的节点概念看着乱,以下就用Master/Slave称呼了。

1 选Master

系统启动后,所有slave都会尝试在zk树上创建/master节点,创建成功的节点成为Master角色。 然而Master可能会崩溃,所以其他slave要继续监视/master节点。当Master挂掉后,slave重新选举出新的Master(这里的选举就是抢占)。这就要求服务节点挂掉后,/master节点随之删除,以便能让其他slave接到通知,所以master为必须为临时节点

2 Master的准备工作

创建三个父节点/works 、/tasks、 /assign 。(也可以由一个引导程序建) 这三个父节点都是永久节点,且不包含任何数据,作为目录节点存在。其子节点分别用于存储可用的slave、任务信息、向从节点分配任务。 创建完成后,Master要监视/works和/tasks两个节点,以便能感知到由哪些slave当前可用,当前有新任务需要分配。

3 Slave的准备工作

slave向zk注册自己的信息,让zk通知Master“我上线了,有新任务分配给我!” 同样,Master也需要及时知道有哪些slave挂了,所以slave在/works目录下创建的必须是临时节点。 然后,slave还需要在/assign目录下创建一个节点/work1,并监视这个节点等待任务分配。

create -e /assign/work1 "work1_ip"
ls /assign/work1 true 

4 客户端提交任务

客户端在/assign下创建一个节点,包含任务信息,即发布一个任务。 并监视该节点,获取任务完成情况

create -s /task/task- "cmd"
ls  /task/task-000 true

5 Master分配任务

任务发布后,监视了/assign的Master就会收到新任务通知。 然后Master查看/works下的可用slave,从中选一个分配给任务(在slave的目录下新增一个任务节点)

create -e /assign/work1/task-000

6 Slave开始干活

slave收到新任务分配通知后,就开始执行任务。

ls /assign/work/task-000  //查看任务信息

然后完成后,添加执行状态,通知客户端。

create /tasks/task-000/status "done"

7 客户验收结果

客户端查看任务节点信息,查看任务状态

get /tasks/task-000

以上! 只是描述了用zk实现主从结构的一般原理。

画图挺累的,转载请说明出处。要原图邮箱吧。

内容整理自《O'REILLY Zookeeper》一书

posted @ 2018-04-10 00:00  忙碌的键盘  阅读(185)  评论(0编辑  收藏  举报