基于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. openMP编程(上篇)之并行程序设计

    openMP简介 openMP是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计使用的. 当计算机升级到多核时,程序中创建的线程数量需要随CPU核数变化,如在CPU核数超过线程数 ...

  2. css以前忽略的一些知识点(知识体系搭建)

    一.选择器 基本选择器: 通用元素选择器 标签选择器 类选择器 id选择器 组合选择器: 多元素组合选择器 后代元素选择器 子代元素选择器 毗邻元素选择器 属性选择器: [title] & P ...

  3. python简单的爬虫

    def baidu_tieba(url,begin_page,end_page): for i in range(begin_page, end_page+1): sName = string.zfi ...

  4. C++中 set(集合容器)的用法

    set集合容器: 实现了红黑树(Red-Black Tree)的平衡二叉检索树的数据结构,在插入元素时, 它会自动调整二叉树的排列,把该元素放到适当的位置,以确保每个子树根节点的键值大于左子树所有节点 ...

  5. Android Animation 知识点速记备忘思维导图

    备注的大段文本,无法在图片中体现, 思维导图源文件放在附件中.使用 Xmind 8 制作. 附件:AndroidAnimation-xmind.zip

  6. 微信小程序scroll-view隐藏滚动条方法

    在wxss里加入以下代码: ::-webkit-scrollbar{ width: 0; height: 0; color: transparent; }   源链接:https://blog.csd ...

  7. java面试题之----IO与NIO的区别

    JAVA NIO vs IO 当我们学习了Java NIO和IO后,我们很快就会思考一个问题: 什么时候应该使用IO,什么时候我应该使用NIO 在下文中我会尝试用例子阐述java NIO 和IO的区别 ...

  8. HTML 段落p

    可以把 HTML 文档分割为若干段落. HTML 段落 段落是通过 <p> 标签定义的. 实例 <p>This is a paragraph</p> <p&g ...

  9. IE浏览器兼容问题(下)——IE6的常见问题

    IE6常见兼容性问题 1.盒模型问题 (1)DTD问题 DTD:文档定义类型,规定了要遵循的书写规范. 如果不写DTD,高级浏览器还是可以正常加载,IE6会以怪异模式进行加载. 盒模型:正常应该是外扩 ...

  10. July 16th 2017 Week 29th Sunday

    Opportunities are like sunrises, if you wait too long, you miss them. 机会如同日出,等得太久就会错过. Indecision is ...