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》一书