基于ZooKeeper实现主从协作

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

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

从节点:通过注册自己,确保主节点看到它们可以执行任务,收到主节点分配的任务后,执行并记录状态;

客户端:创建新的任务并等待系统响应。

1. Zookeeper节点介绍

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

 1. 持久节点:节点创建后就一直存在,直到有删除操作来主动删除该节点

2. 临时节点:临时节点的生命周期和创建该节点的客户端会话绑定,即如果客户端会话失效(客户端宕机或下线),这个节点自动删除

3. 时序节点:创建节点是可以设置这个属性,ZooKeeper会自动为给定的节点加上一个数字后缀,作为新的节点名。数字后缀的范围是整型的最大值

4. 临时性时序节点:同时具备临时节点与时序节点的特性,主要用于分布式锁的实现

2. 各个角色的实现

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

/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来传递结果,本质上都是一样的。

欢迎关注我的微信公众号(Sunnick,请扫码关注),随时留言交流~

ZooKeeper系列(3)--基于ZooKeeper实现主从协作的更多相关文章

  1. 【ZooKeeper系列】3.ZooKeeper源码环境搭建

    前文阅读: [ZooKeeper系列]1.ZooKeeper单机版.伪集群和集群环境搭建 [ZooKeeper系列]2.用Java实现ZooKeeper API的调用 在系列的前两篇文章中,介绍了Zo ...

  2. Zookeeper系列四:Zookeeper实现分布式锁、Zookeeper实现配置中心

    一.Zookeeper实现分布式锁 分布式锁主要用于在分布式环境中保证数据的一致性. 包括跨进程.跨机器.跨网络导致共享资源不一致的问题. 1. 分布式锁的实现思路 说明: 这种实现会有一个缺点,即当 ...

  3. ZooKeeper系列(4):ZooKeeper的配置文件详解

    ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk zkServer.sh读取的默认配置文件是$ZOOKEEPER_ ...

  4. zookeeper系列之:zookeeper简介浅谈

    一.zookeeper的定义 打开zookeeper官网,赫然一行大字,写着:“Apache ZooKeeper致力于开发和维护实现高度可靠的分布式协调的开源服务器”.什么意思呢?就是Apache Z ...

  5. ZooKeeper系列(2):ZooKeeper命令行工具zkCli.sh

    ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk 1.简介 ZooKeeper提供了一个非常简单的命令行客户端zk ...

  6. ZooKeeper系列(5):ZooKeeper的日志和快照

    ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk ZooKeeper有两种日志.一种快照.日志分为事务日志和Zoo ...

  7. ZooKeeper系列(6):ZooKeeper的伸缩性和Observer角色

    ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk 1.ZooKeeper中的角色 在比较老的ZooKeeper版本 ...

  8. Zookeeper系列一:Zookeeper介绍、Zookeeper安装配置、ZK Shell的使用

    https://www.cnblogs.com/leeSmall/p/9563547.html 一.Zookeeper介绍 1. 介绍Zookeeper之前先来介绍一下分布式 1.1 分布式主要是下面 ...

  9. 【Zookeeper系列】构建ZooKeeper应用(转)

    原文地址:https://www.cnblogs.com/sunddenly/p/4064992.html 一.配置服务 配置服务是分布式应用所需要的基本服务之一,它使集群中的机器可以共享配置信息中那 ...

  10. ZooKeeper系列4:ZooKeeper API简介及编程

    问题导读: 1.ZooKeeper API 共包含几个包? 2.如何使用ZooKeeper API 创建zookeeper应用程序? 1)ZooKeeper API 简介   ZooKeeper AP ...

随机推荐

  1. [转]Shared——React Native与原生关系理解与对比

    零.关系理解 这个是我对RN和原生关系的理解.简单解释下这个图. RN js编写完业务代码后,通过react-native bundle命令,将代码分别编译成一个index.ios.bundle和in ...

  2. java.util.concurrent.CountDownLatch 使用

    1. 概述 CountDownLatch是java的一个并发工具(java.util.concurrent.CountDownLatch), 闭锁. 主要功能是阻塞调用其await()方法的线程,直到 ...

  3. 什么是APP???APP的开发类型又分哪几种???

    开发者们都知道在高端智能手机系统中有两种应用程序: 一种是基于本地(操作系统)运行的APP —-Native App: 一种是基于高端机的浏览器运行的App —-WebApp因为这些高端智能手机(Ip ...

  4. Java BeanUtils 组件 使用

    1. BeanUtils组件 1.1 简介 程序中对javabean的操作很频繁, 所以apache提供了一套开源的api,方便对javabean的操作!即BeanUtils组件. BeanUtils ...

  5. C# CRC16算法实现【转】

    /// <summary> /// CRC校验 /// </summary> public class CRC { #region CRC16 public static by ...

  6. KMP算法的一个简单实现

    今天学习KMP算法,参考网上内容,实现算法,摘录网页内容并记录自己的实现如下: 原文出处: http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93M ...

  7. MySQL性能优化的20+条经验

    1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一 ...

  8. 获取当前时间CTime

    std::string getcurtime(){ USES_CONVERSION; CTime z_CurTime; CString z_TimeStr; z_CurTime = CTime::Ge ...

  9. Oracle中用户和方案的区别

    从定义中我们可以看出方案(Schema)为数据库对象的集合,为了区分各个集合,我们需要给这个集合起个名字,这些名字就是我们在企业管理器的方案下看到的许多类似用户名的节点,这些类似用户名的节点其实就是一 ...

  10. CSS/LESS tips and snippets

    如何style line-through? <style type="text/css"> span.inner { color: green; } span.oute ...