`
kavy
  • 浏览: 865527 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

zookeeper机制原理

 
阅读更多
zookeeper机原理(长连接):
Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管。当对目录节点监控状态打开时,一旦目录节点的状态发生变化,Watcher 对象的 process 方法就会被调用。
(任何实现org.apache.zookeeper.Watcher类,持有zookeeper实例对象,只要调用zookeeper的方法,并且监控相应节点类型,
  那么zookeeper服务端该节点发生变化会通知到观察者(观察者重写方法process会被调用))
zk = new ZooKeeper(zookeeperQuorum, sessionTimeout, this); 
zookeeperQuorum=IP+端口(xxx.xxx.xxx.xxx:2181,xxx.xxx.xxx.xxx:2181,xxx.xxx.xxx.xxx:2181)多个逗号隔开
可以设置观察的操作:exists,getChildren,getData
可以触发观察的操作:create,delete,setData
 
zookeeper观察机制;
服务端只存储事件的信息,客户端存储事件的信息和Watcher的执行逻辑.ZooKeeper客户端是线程安全的每一个应用只需要实例化一个ZooKeeper客户端即可,同一个ZooKeeper客户端实例可以在不同的线程中使用。ZooKeeper客户端会将这个Watcher对应Path路径存储在ZKWatchManager中,同时通知ZooKeeper服务器记录该Client对应的Session中的Path下注册的事件类型。当ZooKeeper服务器发生了指定的事件后,ZooKeeper服务器将通知ZooKeeper客户端哪个节点下发生事件类型,ZooKeeper客户端再从ZKWatchManager中找到相应Path,取出相应watcher引用执行其回调函数process
源码分析如:
zookeeper.java
 wcb = new DataWatchRegistration(watcher, clientPath);//将观察者引用和节点路径绑定
ZKWatchManager.java
 public void register(int rc) {
            if (shouldAddWatch(rc)) {
                Map<String, Set<Watcher>> watches = getWatches(rc);
                synchronized(watches) {
                    Set<Watcher> watchers = watches.get(clientPath);
                    if (watchers == null) {
                        watchers = new HashSet<Watcher>();
                        watches.put(clientPath, watchers);//key为path,value为watcher引用
                    }
                    watchers.add(watcher);
                }
            }
        }
 
znode存储数据量最大:jute.maxbuffer默认1M
 
通知注意点:
1.一次性触发器(可以通过定时调用方法 get() 或者 exists()获取触发事件,手动访问触发,
client在一个节点上设置watch,随后节点内容改变,client将获取事件。当节点内容再次改变,client不会获取这个事件,除非它又执行了一次读操作并设置watch
2.发送至client,watch事件延迟
watch事件异步发送至观察者。比如说client执行一次写操作,节点数据内容发生变化,操作返回后,而watch事件可能还在发往client的路上。这种情况下,zookeeper提供有序保证:client不会得知数据变化,直到它获取watch事件。网络延迟或其他因素可能导致不同client在不同时刻获取watch事件和操作返回值。
循环调用:
Watcher watcher = loopWatch?this:null;
byte[] newdata = keeper.getData(path, watcher, null);//实现改变再次提醒!!
 
 
应用场景:
Zookeeper 从设计模式角度来看,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在 Zookeeper 上注册的那些观察者做出相应的反应。
通知者模式:
发布者持有订阅者的句柄引用,一单状态变化,调用订阅者接口,实现通知模式调用。
zookeeper 操作API:
客户端要连接 Zookeeper 服务器可以通过创建 org.apache.zookeeper. ZooKeeper 的一个实例对象,然后调用这个类提供的接口来和服务器交互
ZooKeeper 主要是用来维护和监控一个目录节点树中存储的数据的状态。
 
 
目录节点类型:
PERSISTENT:持久化目录节点,这个目录节点存储的数据不会丢失
PERSISTENT_SEQUENTIAL:顺序自动编号的目录节点,这种目录节点会根据当前已近存在的节点数自动加 1
EPHEMERAL:临时目录节点,一旦创建这个节点的客户端与服务器端口也就是 session 超时或者断口,这种节点会被自动删除
EPHEMERAL_SEQUENTIAL:临时自动编号节点
 
节点状态(Stat):
  private long czxid;
  private long mzxid;
  private long ctime;
  private long mtime;
  private int version;
  private int cversion;
  private int aversion;
  private long ephemeralOwner;
  private int dataLength;
  private int numChildren;
  private long pzxid;
 
Watch事件类型
ZOO_CREATED_EVENT:节点创建事件,需要watch一个不存在的节点,当节点被创建时触发,此watch通过zoo_exists()设置
ZOO_DELETED_EVENT:节点删除事件,此watch通过zoo_exists()或zoo_get()设置
ZOO_CHANGED_EVENT:节点数据改变事件,此watch通过zoo_exists()或zoo_get()设置
ZOO_CHILD_EVENT:子节点列表改变事件,此watch通过zoo_get_children()或zoo_get_children2()设置
ZOO_SESSION_EVENT:会话失效事件,客户端与服务端断开或重连时触发
ZOO_NOTWATCHING_EVENT:watch移除事件,服务端出于某些原因不再为客户端watch节点时触发
 
 
一:集群管理:
1 监控服务器健康

它们的实现方式都是在 Zookeeper 上创建一个 EPHEMERAL 类型的目录节点,然后每个 Server 在它们创建目录节点的父目录节点上调用 getChildren(String path, boolean watch) 方法并设置 watch  true,由于是 EPHEMERAL 目录节点,当创建它的 Server 死去,这个目录节点也随之被删除,所以 Children 将会变化,这时 getChildren上的 Watch 将会被调用,所以其它 Server 就知道已经有某台 Server 死去了。新增 Server 也是同样的原理。

2 Master选举

Zookeeper 如何实现 Leader Election,也就是选出一个 Master Server。和前面的一样每台 Server 创建一个 EPHEMERAL 目录节点,不同的是它还是一个 SEQUENTIAL 目录节点,所以它是个 EPHEMERAL_SEQUENTIAL 目录节点。之所以它是 EPHEMERAL_SEQUENTIAL 目录节点,是因为我们可以给每台 Server 编号,我们可以选择当前是最小编号的 Server  Master,假如这个最小编号的 Server 死去,由于是 EPHEMERAL 节点,死去的 Server 对应的节点也被删除,所以当前的节点列表中又出现一个最小编号的节点,我们就选择这个节点为当前 Master。这样就实现了动态选择 Master,避免了传统意义上单 Master 容易出现单点故障的问题。

二:分布式锁

在同一个进程中很容易实现,但是在跨进程或者在不同 Server 之间就不好实现了。Zookeeper 却很容易实现这个功能,实现方式也是需要获得锁的 Server 创建一个 EPHEMERAL_SEQUENTIAL 目录节点,然后调用 getChildren方法获取当前的目录节点列表中最小的目录节点是不是就是自己创建的目录节点,如果正是自己创建的,那么它就获得了这个锁,如果不是那么它就调用 exists(String path, boolean watch) 方法并监控 Zookeeper 上目录节点列表的变化,一直到自己创建的节点是列表中最小编号的目录节点,从而获得锁,释放锁很简单,只要删除前面它自己所创建的目录节点就行了 n lang=EN-US> Server 也是同样的原理。

分享到:
评论

相关推荐

    zookeeper理论原理

    zookeeper理论原理 ZAB机制 客户端流程 客户端源码分析 fastelection选举

    zookeeper文档

    zookeeper文档,开发必备,了解zookeeper工作原理,与机制

    zookeeper 系列整理总结

    对于zookeeper 的机制原理有一个清晰翔实的梳理。

    zookeeper面试专题.pdf

    14.Zookeeper 工作原理 15.zookeeper 是如何保证事务的顺序一致性 的? 16.Zookeeper 下 Server 工作状态 17.zookeeper 是如何选取主 leader 的? 18.Zookeeper 同步流程 19.分布式通知和协调 20.机器中为什么会有 ...

    Zookeeper篇.pdf

    1.4 zookeeper 通知机制 1.5 zookeeper 有哪些应用场景? 1.6 zk 的命名服务 1.7 zk 的配置管理服务 1.8 zk 的集群管理 1.9 zk 的分布式锁 2.0 zk 队列管理 2.1 zk 数据复制 2.2 zk 的工作原理 2.3 zk 是如何保证...

    第6章 Zookeeper 2 6.1. Zookeeper入门 2 6.1.1. 概述 2 6.1.2. 特点 3 6.1.3

    6.4. Zookeeper内部原理 28 6.4.1. 节点类型 29 6.4.2. Stat结构体 29 6.4.3. 监听器原理(面试重点) 30 6.4.4. Paxos算法(扩展) 32 6.4.5. 选举机制(面试重点) 34 6.4.6. 写数据流程 35 6.5. 企业面试真题 37 ...

    03_尚硅谷大数据之Zookeeper内部原理1

    3.1 选举机制 3.2 节点类型 3.4 监听器原理 3.5 写数据流程

    Zookeeper原理

    ZooKeeper是一个分布式的,开放源码的分布式应用程序...本文简单分析zookeeper的工作原理,对于如何使用zookeeper不是本文讨论的重点。Zookeeper中的角色主要有以下三类,如下表所示:系统模型如图所示:1.最终一致性

    zookeeper-branch-3.4.13.7z

    该代码为zookeeper的zookeeper-branch-3.4.13源码研究;...而且还包含原生方式实现的分布式注册服务中心、两种分布式锁、master领导者选举,重在理解底层的实现原理和机制,希望对小伙伴们能有所帮助。

    一文彻底理解ZooKeeper分布式锁的实现原理

    二、ZooKeeper分布式锁机制 接下来我们一起来看看,多客户端获取及释放zk分布式锁的整个流程及背后的原理。 首先大家看看下面的图,如果现在有两个客户端一起要争抢zk上的一把分布式锁,会是个什么场景? 如果大家...

    深入探索Zookeeper:实战应用与高效策略

    通过具体案例,我们理解了Zookeeper的加锁原理,包括并发问题处理、羊群效应、读写锁机制等。此外,文章还详细介绍了使用Zookeeper构建注册中心的步骤,包括服务注册、节点监听、自动发现和负载均衡等关键概念。这些...

    深入浅出Zookeeper(一)Zookeeper架构及FastLeaderElection机制

    本文来自于技术世界,本文介绍了Zookeeper的架构,并组合实例分析了原子广播(ZAB)协议的原理,希望对您的学习有所帮助。Zookeeper是一个分布式协调服务,可用于服务发现,分布式锁,分布式领导选举,配置管理等。这...

    Zookeeper介绍.docx

    zookeeper简单命令和一些简单的介绍,可以提供给大家学习和参考,其中包括一zookeeper的一些原理和实现机制,从浅入深的讲解可以更好的让大家理解和吸收

    Zookeeper中几个重要的内部原理

    但是,Zookeeper 工作时,是由一个节点为 Leader,其他则为 Follower,Leader 是通过内部的选举机制临时产生的。 3、以一个简单的例子来说明选举的过程 假设有五台服务器组成的 Zookeeper 集群,它们的 id 是从 1-5...

    分布式专题-04分布式协调服务之Zookeeper实践及与原理分析

    目录导航前言数据存储基于Java API初探zookeeper的使用事件机制如何注册事件机制watcher 事件类型什么样的操作会产生什么类型的事件呢?事务的实现原理深入分析Watcher机制的实现原理ClientCnxn 初始化客户端通过 ...

    深入浅出Zookeeper(二)基于Zookeeper的分布式锁与领导选举

    本文来自于技术世界,本文结合实例演示了使用Zookeeper实现分布式锁与领导选举的原理与具体实现方法。如上文《Zookeeper架构及FastLeaderElection机制》所述,Zookeeper提供了一个类似于Linux文件系统的树形结构。该...

    尚硅谷大数据之Zookeeper视频(笔记+代码+资料)

    Zookeeper主要应用于大数据开发中的,统一命名服务、...本套课程讲解了,Zookeeper的集群安装、选举机制、监听器原理、写数据流程、Shell命令行操作、客户端API操作、服务器节点动态上下线综合案例以及企业真实面试题。

    Hadoop开发者第四期

    ZooKeeper 权限管理机制; ZooKeeper 服务器工作原理和流程; ZooKeeper 实现共享锁; Hadoop 最佳实践; 通过Hadoop 的API 管理Job; Hadoop 集群的配置调优; Hadoop 平台的Java 规范及经验; MapReduce 开发经验...

Global site tag (gtag.js) - Google Analytics