ZooKeeper系列(3)--基于ZooKeeper实现主从协做

主-从模式的模型中,主要包括三个角色:程序员

  • 主节点: 主要负责监视新的节点和任务,分配任务给可用的从节点;分布式

  • 从节点: 经过注册本身,确保主节点看到它们能够执行任务,收到主节点分配的任务后,执行并记录状态;cdn

  • 客户端: 建立新的任务并等待系统响应。生命周期

1. Zookeeper节点介绍

现经过ZooKeeper的API完成简单的主从协做。在此以前,需了解下ZooKeeper中节点的基本概念。节点的类型分为如下几类:队列

  • 持久节点:节点建立后就一直存在,直到有删除操做来主动删除该节点进程

  • 临时节点:临时节点的生命周期和建立该节点的客户端会话绑定,即若是客户端会话失效(客户端宕机或下线),这个节点自动删除it

  • 时序节点:建立节点是能够设置这个属性,ZooKeeper会自动为给定的节点加上一个数字后缀,做为新的节点名。数字后缀的范围是整型的最大值io

  • 临时性时序节点:同时具有临时节点与时序节点的特性,主要用于分布式锁的实现ast

2. 各个角色的实现

基于Zookeeper各个类型节点的特色,实现主从模式中的各个角色。在ZooKeeper中建立如下节点用于主从协做:class

  • /master 表示主节点;

  • /workers/worker-id 表示从节点;

  • /tasks/task-id 表示任务;

  • /assign 表示任务分配状况。

2.1 主节点角色

由于只有一个进程会成为主节点,因此进程成为主节点后必须锁定管理权,所以进程须要建立名为/master的临时节点,并写入数据,记录该进程的信息,如IP,编号等。

其它进程在尝试建立/master成为主节点时,ZooKeeper会报错,提示该节点已存在。然而主节点可能会崩溃,其它节点须要接替它成为主节点,所以须要在主节点/master上设置监视点(watch)。当监视到/master不存在时,该进程再次建立/master节点,尝试成为主节点。

2.2 从节点角色

从节点首先要通知主节点,告知主节点本身能够执行任务。从节点经过在/workers子节点下建立临时节点,并在字节点中使用主机名或IP来标识本身,如:/workers/worker1.example.com。主节点经过监视(watch)/workers节点,获取全部可用的从节点信息。

从节点须要在/assign下建立本身的子节点,用于接收任务分配,如/assign/worker1.example.com,并监视这个节点的变化,等待新的任务。

2.3 客户端角色

客户端向系统中添加任务(有序节点),咱们须要按照任务添加的顺序建立节点,其本质上是一个队列。如执行操做create -s /tasks/task-,会生成/tasks/task-00(数字依次递增),客户端须要知道该任务的完成状态,所以须要监视(watch)该节点。

3. 各个角色相互配合实现主从协做

主节点监视/tasks,当客户端添加任务时,建立/tasks/task-00,主节点收到通知,会去/workers下检查可用的从节点。

获取到从节点列表后,选择其中一个从节点,分派任务:/assign/worker1.example.com/task-00。

从节点经过监视/assign/worker1.example.com,获取本身的任务,并执行。任务完成后,从节点会在/tasks/task-00下更新状态,告知客户端该任务已完成:/tasks/task-00/status。

客户端收到完成任务完成的通知后,整个任务的执行就结束了。固然任务可能会很是复杂,甚至涉及另外一个分布式系统。可是无论是什么样的任务,执行的机制与经过ZooKeeper来传递结果,本质上都是同样的。

若是各位有好的想法,欢迎关注个人公众号(程序员顺仔)留言讨论~

相关文章
相关标签/搜索