zookeeper 订阅
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。ZooKeeper包含一个简单的原语集,提供Java和C的接口。ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在$zookeeper_home\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。(概述图片来源: [1]  ) 展开全文
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。ZooKeeper包含一个简单的原语集,提供Java和C的接口。ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在$zookeeper_home\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。(概述图片来源: [1]  )
信息
领    域
大数据技术,分布式系统
类    别
分布式系统的可靠协调系统
特    点
高效,可靠
所    属
Hadoop的正式子项目
外文名
ZooKeeper
zookeeper原理
ZooKeeper是以Fast Paxos算法为基础的,Paxos 算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fast Paxos做了一些优化,通过选举产生一个leader (领导者),只有leader才能提交proposer,具体算法可见Fast Paxos。因此,要想弄懂ZooKeeper首先得对Fast Paxos有所了解。ZooKeeper的基本运转流程:1、选举Leader。2、同步数据。3、选举Leader过程中算法有很多,但要达到的选举标准是一致的。4、Leader要具有最高的执行ID,类似root权限。5、集群中大多数的机器得到响应并接受选出的Leader。
收起全文
精华内容
参与话题
问答
  • ZooKeeper入门视频课程

    千人学习 2018-12-18 19:42:41
    本课程以通俗易懂的方式讲解ZooKeeper技术,课程内容包括: 1. ZooKeeper简介、应用场景 2. ZooKeeper文件系统和通知机制 3. ZooKeeper安装 4. 客户端操作、常用命令 5. ZooKeeper集群(配置集群、集群特性、...
  • ZooKeeper概念详解,最全整理

    万次阅读 多人点赞 2018-09-11 22:05:33
    相信大家对 ZooKeeper 应该不算陌生,但是你真的了解 ZooKeeper 是什么吗?如果别人/面试官让你讲讲 ZooKeeper 是什么,你能回答到哪个地步呢? 我本人曾经使用过 ZooKeeper 作为 Dubbo 的注册中心,另外在搭建 ...

    相信大家对 ZooKeeper 应该不算陌生,但是你真的了解 ZooKeeper 是什么吗?如果别人/面试官让你讲讲 ZooKeeper 是什么,你能回答到哪个地步呢?

    我本人曾经使用过 ZooKeeper 作为 Dubbo 的注册中心,另外在搭建 Solr 集群的时候,我使用到了 ZooKeeper 作为 Solr 集群的管理工具。

    前几天,总结项目经验的时候,我突然问自己 ZooKeeper 到底是个什么东西?

    想了半天,脑海中只是简单的能浮现出几句话:

    • Zookeeper 可以被用作注册中心

    • Zookeeper 是 Hadoop 生态系统的一员。

    • 构建 Zookeeper 集群的时候,使用的服务器最好是奇数台。

    可见,我对于 Zookeeper 的理解仅仅是停留在了表面。所以,通过本文,希望带大家稍微详细的了解一下 ZooKeeper 。

    如果没有学过 ZooKeeper,那么本文将会是你进入 ZooKeeper 大门的垫脚砖;如果你已经接触过 ZooKeeper ,那么本文将带你回顾一下 ZooKeeper 的一些基础概念。

    最后,本文只涉及 ZooKeeper 的一些概念,并不涉及 ZooKeeper 的使用以及 ZooKeeper 集群的搭建。

    网上有介绍 ZooKeeper 的使用以及搭建 ZooKeeper 集群的文章,大家有需要可以自行查阅。

    什么是 ZooKeeper

    ZooKeeper 的由来

    下面这段内容摘自《从 Paxos 到 ZooKeeper 》第四章第一节的某段内容,推荐大家阅读一下:

    Zookeeper 最早起源于雅虎研究院的一个研究小组。在当时,研究人员发现,在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调,但是这些系统往往都存在分布式单点问题。

    所以,雅虎的开发人员就试图开发一个通用的无单点问题的分布式协调框架,以便让开发人员将精力集中在处理业务逻辑上。

    关于“ZooKeeper”这个项目的名字,其实也有一段趣闻。在立项初期,考虑到之前内部很多项目都是使用动物的名字来命名的(例如著名的Pig项目),雅虎的工程师希望给这个项目也取一个动物的名字。

    时任研究院的首席科学家 Raghu Ramakrishnan 开玩笑地说:“在这样下去,我们这儿就变成动物园了!”

    此话一出,大家纷纷表示就叫动物园管理员吧,因为各个以动物命名的分布式组件放在一起,雅虎的整个分布式系统看上去就像一个大型的动物园了。

    而 Zookeeper 正好要用来进行分布式环境的协调,于是,Zookeeper 的名字也就由此诞生了。

    ZooKeeper 概览

    ZooKeeper 是一个开源的分布式协调服务,ZooKeeper 框架最初是在“Yahoo!"上构建的,用于以简单而稳健的方式访问他们的应用程序。

    后来,Apache ZooKeeper 成为 Hadoop,HBase 和其他分布式框架使用的有组织服务的标准。

    例如,Apache HBase 使用 ZooKeeper 跟踪分布式数据的状态。

    ZooKeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。

    原语: 操作系统或计算机网络用语范畴。它是由若干条指令组成的,用于完成一定功能的一个过程。具有不可分割性,即原语的执行必须是连续的,在执行过程中不允许被中断。

    ZooKeeper 是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅负载均衡命名服务分布式协调/通知集群管理Master 选举分布式锁分布式队列等功能。

    ZooKeeper 一个最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心。

    服务生产者将自己提供的服务注册到 ZooKeeper 中心,服务的消费者在进行服务调用的时候先到 ZooKeeper 中查找服务,获取到服务生产者的详细信息之后,再去调用服务生产者的内容与数据。

    如下图所示,在 Dubbo 架构中 ZooKeeper 就担任了注册中心这一角色。

    Dubbo 架构图

    结合个人使用讲一下 ZooKeeper

    在我自己做过的项目中,主要使用到了 ZooKeeper 作为 Dubbo 的注册中心(Dubbo 官方推荐使用 ZooKeeper 注册中心)。

    另外在搭建 Solr 集群的时候,我使用  ZooKeeper 作为 Solr 集群的管理工具。

    这时,ZooKeeper 主要提供下面几个功能:

    • 集群管理:容错、负载均衡

    • 配置文件的集中管理。

    • 集群的入口。

    我个人觉得在使用 ZooKeeper 的时候,最好是使用集群版的 ZooKeeper 而不是单机版的。

    官网给出的架构图就描述的是一个集群版的 ZooKeeper 。通常 3 台服务器就可以构成一个  ZooKeeper 集群

    为什么最好使用奇数台服务器构成 ZooKeeper 集群?

    我们知道在 ZooKeeper 中 Leader 选举算法采用了 Zab 协议。Zab 核心思想是当多数 Server 写成功,则任务数据写成功:

    • 如果有 3 个 Server,则最多允许 1 个 Server 挂掉。

    • 如果有 4 个 Server,则同样最多允许 1 个 Server 挂掉。

    既然 3 个或者 4 个 Server,同样最多允许 1 个 Server 挂掉,那么它们的可靠性是一样的。

    所以选择奇数个 ZooKeeper Server 即可,这里选择 3 个 Server。

    关于 ZooKeeper  的一些重要概念

    重要概念总结

    关于 ZooKeeper  的一些重要概念:

    • ZooKeeper 本身就是一个分布式程序只要半数以上节点存活,ZooKeeper 就能正常服务)。

    • 为了保证高可用,最好是以集群形态来部署 ZooKeeper,这样只要集群中大部分机器是可用的(能够容忍一定的机器故障),那么 ZooKeeper 本身仍然是可用的。

    • ZooKeeper 将数据保存在内存中这也就保证了 高吞吐量和低延迟(但是内存限制了能够存储的容量不太大,此限制也是保持 Znode 中存储的数据量较小的进一步原因)。

    • ZooKeeper 是高性能的。在“读”多于“写”的应用程序中尤其地高性能,因为“写”会导致所有的服务器间同步状态。(“读”多于“写”是协调服务的典型场景。)

    • ZooKeeper 有临时节点的概念。当创建临时节点的客户端会话一直保持活动,瞬时节点就一直存在。

      而当会话终结时,瞬时节点被删除。持久节点是指一旦这个 ZNode 被创建了,除非主动进行 ZNode 的移除操作,否则这个 ZNode 将一直保存在 Zookeeper 上。

    • ZooKeeper 底层其实只提供了两个功能:①管理(存储、读取)用户程序提交的数据;②为用户程序提交数据节点监听服务。

    下面关于会话(Session)、 Znode、版本、Watcher、ACL 概念的总结都在《从 Paxos 到 ZooKeeper 》第四章第一节以及第七章第八节有提到,感兴趣的可以看看!

    会话(Session)

    Session 指的是 ZooKeeper  服务器与客户端会话。在 ZooKeeper 中,一个客户端连接是指客户端和服务器之间的一个 TCP 长连接。

    客户端启动的时候,首先会与服务器建立一个 TCP 连接,从第一次连接建立开始,客户端会话的生命周期也开始了。

    通过这个连接,客户端能够通过心跳检测与服务器保持有效的会话,也能够向 Zookeeper 服务器发送请求并接受响应,同时还能够通过该连接接收来自服务器的 Watch 事件通知。

    Session 的 sessionTimeout 值用来设置一个客户端会话的超时时间。

    当由于服务器压力太大、网络故障或是客户端主动断开连接等各种原因导致客户端连接断开时,只要在 sessionTimeout 规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话仍然有效。

    在为客户端创建会话之前,服务端首先会为每个客户端都分配一个 sessionID。

    由于 sessionID 是 Zookeeper 会话的一个重要标识,许多与会话相关的运行机制都是基于这个 sessionID 的。

    因此,无论是哪台服务器为客户端分配的 sessionID,都务必保证全局唯一。

    Znode

    在谈到分布式的时候,我们通常说的“节点"是指组成集群的每一台机器。

    然而,在 ZooKeeper 中,“节点"分为两类:

    • 第一类同样是指构成集群的机器,我们称之为机器节点

    • 第二类则是指数据模型中的数据单元,我们称之为数据节点一ZNode。

    ZooKeeper 将所有数据存储在内存中,数据模型是一棵树(Znode Tree),由斜杠(/)的进行分割的路径,就是一个 Znode,例如/foo/path1。每个上都会保存自己的数据内容,同时还会保存一系列属性信息。

    在 Zookeeper 中,Node 可以分为持久节点和临时节点两类。所谓持久节点是指一旦这个 ZNode 被创建了,除非主动进行 ZNode 的移除操作,否则这个 ZNode 将一直保存在 ZooKeeper 上。

    而临时节点就不一样了,它的生命周期和客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点都会被移除。

    另外,ZooKeeper 还允许用户为每个节点添加一个特殊的属性:SEQUENTIAL。

    一旦节点被标记上这个属性,那么在这个节点被创建的时候,ZooKeeper 会自动在其节点名后面追加上一个整型数字,这个整型数字是一个由父节点维护的自增数字。

    版本

    在前面我们已经提到,Zookeeper 的每个 ZNode 上都会存储数据,对应于每个 ZNode,Zookeeper 都会为其维护一个叫作 Stat 的数据结构。

    Stat 中记录了这个 ZNode 的三个数据版本,分别是:

    • version(当前 ZNode 的版本)

    • cversion(当前 ZNode 子节点的版本)

    • aversion(当前 ZNode 的 ACL 版本)

    Watcher

    Watcher(事件监听器),是 ZooKeeper 中的一个很重要的特性。

    ZooKeeper 允许用户在指定节点上注册一些 Watcher,并且在一些特定事件触发的时候,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去,该机制是 ZooKeeper 实现分布式协调服务的重要特性。

    ACL

    ZooKeeper 采用 ACL(AccessControlLists)策略来进行权限控制,类似于  UNIX 文件系统的权限控制。

    ZooKeeper 定义了 5 种权限,如下图:

     

    其中尤其需要注意的是,CREATE 和 DELETE 这两种权限都是针对子节点的权限控制。

    ZooKeeper 特点

    ZooKeeper 有哪些特点呢?具体如下:

    • 顺序一致性:从同一客户端发起的事务请求,最终将会严格地按照顺序被应用到 ZooKeeper 中去。

    • 原子性:所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,要么整个集群中所有的机器都成功应用了某一个事务,要么都没有应用。

    • 单一系统映像:无论客户端连到哪一个 ZooKeeper 服务器上,其看到的服务端数据模型都是一致的。

    • 可靠性:一旦一次更改请求被应用,更改的结果就会被持久化,直到被下一次更改覆盖。

    ZooKeeper 设计目标

    简单的数据模型

    ZooKeeper 允许分布式进程通过共享的层次结构命名空间进行相互协调,这与标准文件系统类似。

    名称空间由 ZooKeeper 中的数据寄存器组成,称为 Znode,这些类似于文件和目录。

    与为存储设计的典型文件系统不同,ZooKeeper 数据保存在内存中,这意味着 ZooKeeper 可以实现高吞吐量和低延迟。

     

    可构建集群

    为了保证高可用,最好是以集群形态来部署 ZooKeeper,这样只要集群中大部分机器是可用的(能够容忍一定的机器故障),那么 ZooKeeper 本身仍然是可用的。 

    客户端在使用 ZooKeeper 时,需要知道集群机器列表,通过与集群中的某一台机器建立 TCP 连接来使用服务。

    客户端使用这个 TCP 链接来发送请求、获取结果、获取监听事件以及发送心跳包。如果这个连接异常断开了,客户端可以连接到另外的机器上。

    ZooKeeper 官方提供的架构图:

    上图中每一个 Server 代表一个安装 ZooKeeper 服务的服务器。组成 ZooKeeper 服务的服务器都会在内存中维护当前的服务器状态,并且每台服务器之间都互相保持着通信。

    集群间通过 Zab 协议(Zookeeper Atomic Broadcast)来保持数据的一致性。

    顺序访问

    对于来自客户端的每个更新请求,ZooKeeper 都会分配一个全局唯一的递增编号。

    这个编号反应了所有事务操作的先后顺序,应用程序可以使用 ZooKeeper 这个特性来实现更高层次的同步原语。这个编号也叫做时间戳—zxid(ZooKeeper Transaction Id)。

    高性能

    ZooKeeper 是高性能的。在“读”多于“写”的应用程序中尤其地高性能,因为“写”会导致所有的服务器间同步状态。(“读”多于“写”是协调服务的典型场景。)

    ZooKeeper 集群角色介绍

    最典型集群模式:Master/Slave 模式(主备模式)。在这种模式中,通常 Master 服务器作为主服务器提供写服务,其他的 Slave 服务器从服务器通过异步复制的方式获取 Master 服务器最新的数据提供读服务。

    但是,在 ZooKeeper 中没有选择传统的 Master/Slave 概念,而是引入了Leader、Follower 和 Observer 三种角色。

    如下图所示:

     

    ZooKeeper 集群中的所有机器通过一个 Leader 选举过程来选定一台称为 “Leader” 的机器。

    Leader 既可以为客户端提供写服务又能提供读服务。除了 Leader 外,Follower 和  Observer 都只能提供读服务。

    Follower 和 Observer 唯一的区别在于 Observer 机器不参与 Leader 的选举过程,也不参与写操作的“过半写成功”策略,因此 Observer 机器可以在不影响写性能的情况下提升集群的读性能。

     

    ZooKeeper & ZAB 协议 & Paxos 算法

    ZAB 协议 & Paxos 算法

    Paxos 算法可以说是  ZooKeeper 的灵魂了。但是,ZooKeeper 并没有完全采用 Paxos 算法 ,而是使用 ZAB 协议作为其保证数据一致性的核心算法。

    另外,在 ZooKeeper 的官方文档中也指出,ZAB 协议并不像 Paxos 算法那样,是一种通用的分布式一致性算法,它是一种特别为 ZooKeeper 设计的崩溃可恢复的原子消息广播算法。

    ZAB 协议介绍

    ZAB(ZooKeeper Atomic Broadcast 原子广播)协议是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的原子广播协议。

    在 ZooKeeper 中,主要依赖 ZAB 协议来实现分布式数据一致性,基于该协议,ZooKeeper 实现了一种主备模式的系统架构来保持集群中各个副本之间的数据一致性。

    ZAB 协议两种基本的模式

    ZAB 协议包括两种基本的模式,分别是崩溃恢复和消息广播。

    当整个服务框架在启动过程中,或是当 Leader 服务器出现网络中断、崩溃退出与重启等异常情况时,ZAB 协议就会进入恢复模式并选举产生新的 Leader 服务器。

    当选举产生了新的 Leader 服务器,同时集群中已经有过半的机器与该 Leader 服务器完成了状态同步之后,ZAB 协议就会退出恢复模式。

    其中,所谓的状态同步是指数据同步,用来保证集群中存在过半的机器能够和 Leader 服务器的数据状态保持一致。

    当集群中已经有过半的 Follower 服务器完成了和 Leader 服务器的状态同步,那么整个服务框架就可以进人消息广播模式了。 

    当一台同样遵守 ZAB 协议的服务器启动后加入到集群中时,如果此时集群中已经存在一个 Leader 服务器在负责进行消息广播。

    那么新加入的服务器就会自觉地进人数据恢复模式:找到 Leader 所在的服务器,并与其进行数据同步,然后一起参与到消息广播流程中去。

    正如上文介绍中所说的,ZooKeeper 设计成只允许唯一的一个 Leader 服务器来进行事务请求的处理。

    Leader 服务器在接收到客户端的事务请求后,会生成对应的事务提案并发起一轮广播协议。

    而如果集群中的其他机器接收到客户端的事务请求,那么这些非 Leader 服务器会首先将这个事务请求转发给 Leader 服务器。

    关于 ZAB 协议 & Paxos 算法需要讲和理解的东西太多了,推荐阅读下面两篇文章:

    • 图解 Paxos 一致性协议:

      http://blog.xiaohansong.com/2016/09/30/Paxos/

    • Zookeeper ZAB 协议分析:

      http://blog.xiaohansong.com/2016/08/25/zab/

    关于如何使用 ZooKeeper 实现分布式锁,可以查看下面这篇文章:

    • Zookeeper ZAB 协议分析:

      https://blog.csdn.net/qiangcuo6087/article/details/79067136

    总结

    通过阅读本文,想必大家已从以下这七点了解了 ZooKeeper:

    • ZooKeeper 的由来

    • ZooKeeper 到底是什么

    • ZooKeeper 的一些重要概念(会话(Session)、Znode、版本、Watcher、ACL)

    • ZooKeeper 的特点

    • ZooKeeper 的设计目标

    • ZooKeeper 集群角色介绍(Leader、Follower 和 Observer 三种角色)

    • ZooKeeper & ZAB 协议 & Paxos 算法

    参考文章:

    • 《从Paxos到Zookeeper 》

    • https://cwiki.apache.org/confluence/display/ZOOKEEPER/ProjectDescription

    • https://cwiki.apache.org/confluence/display/ZOOKEEPER/Index

    • https://www.cnblogs.com/raphael5200/p/5285583.html

    • https://zhuanlan.zhihu.com/p/30024403

    作者:SnailClimb

    编辑:陶家龙、孙淑娟

    出处:本文经授权转载自Java 面试通关手册(ID:Java_Guide)微信公众号

    展开全文
  • Zookeeper入门看这篇就够了

    万次阅读 多人点赞 2018-07-12 14:48:06
    Zookeeper是什么官方文档上这么解释zookeeper,它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、...
    Zookeeper是什么

    官方文档上这么解释zookeeper,它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

    上面的解释有点抽象,简单来说zookeeper=文件系统+监听通知机制。

    1、 文件系统

    Zookeeper维护一个类似文件系统的数据结构:


    每个子目录项如 NameService 都被称作为 znode(目录节点),和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。

    有四种类型的znode:

    • PERSISTENT-持久化目录节点

      客户端与zookeeper断开连接后,该节点依旧存在

    • PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点

      客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号

    • EPHEMERAL-临时目录节点

      客户端与zookeeper断开连接后,该节点被删除

    • EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点

      客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

    2、 监听通知机制

    客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。

    就这么简单,下面我们看看Zookeeper能做点什么呢?

    Zookeeper能做什么

    zookeeper功能非常强大,可以实现诸如分布式应用配置管理、统一命名服务、状态同步服务、集群管理等功能,我们这里拿比较简单的分布式应用配置管理为例来说明。

    假设我们的程序是分布式部署在多台机器上,如果我们要改变程序的配置文件,需要逐台机器去修改,非常麻烦,现在把这些配置全部放到zookeeper上去,保存在 zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 zookeeper 的通知,然后从 zookeeper 获取新的配置信息应用到系统中。

    如上,你大致应该了解zookeeper是个什么东西,大概能做些什么了,我们马上来学习下zookeeper的安装及使用,并开发一个小程序来实现zookeeper这个分布式配置管理的功能。

    Zookeeper单机模式安装

    Step1:配置JAVA环境,检验环境:java -version

    Step2:下载并解压zookeeper

    # cd /usr/local
    # wget http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz
    # tar -zxvf zookeeper-3.4.12.tar.gz
    # cd zookeeper-3.4.12

    Step3:重命名配置文件zoo_sample.cfg

    # cp conf/zoo_sample.cfg conf/zoo.cfg

    Step4:启动zookeeper

    # bin/zkServer.sh start

    Step5:检测是否成功启动,用zookeeper客户端连接下服务端

    # bin/zkCli.sh

    Zookeeper使用

    使用客户端命令操作zookeeper

    1、使用 ls 命令来查看当前 ZooKeeper 中所包含的内容



    2、创建一个新的 znode ,使用 create /zkPro myData


    3、再次使用 ls 命令来查看现在 zookeeper 中所包含的内容:


    4、下面我们运行 get 命令来确认第二步中所创建的 znode 是否包含我们所创建的字符串:


    5、下面我们通过 set 命令来对 zk 所关联的字符串进行设置:


    6、下面我们将刚才创建的 znode 删除


    使用Java API操作zookeeper

    使用Java API操作zookeeper需要引用下面的包


    下面我们来实现上面说的分布式配置中心:

    1、在zookeeper里增加一个目录节点,并且把配置信息存储在里面

    2、启动两个zookeeper客户端程序,代码如下所示

    import java.util.concurrent.CountDownLatch;
    import org.apache.zookeeper.WatchedEvent;
    import org.apache.zookeeper.Watcher;
    import org.apache.zookeeper.Watcher.Event.EventType;
    import org.apache.zookeeper.Watcher.Event.KeeperState;
    import org.apache.zookeeper.ZooKeeper;
    import org.apache.zookeeper.data.Stat;
    
    /**
     * 分布式配置中心demo
     * @author 
     *
     */
    public class ZooKeeperProSync implements Watcher {
    
        private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
        private static ZooKeeper zk = null;
        private static Stat stat = new Stat();
    
        public static void main(String[] args) throws Exception {
            //zookeeper配置数据存放路径
            String path = "/username";
            //连接zookeeper并且注册一个默认的监听器
            zk = new ZooKeeper("192.168.31.100:2181", 5000, //
                    new ZooKeeperProSync());
            //等待zk连接成功的通知
            connectedSemaphore.await();
            //获取path目录节点的配置数据,并注册默认的监听器
            System.out.println(new String(zk.getData(path, true, stat)));
    
            Thread.sleep(Integer.MAX_VALUE);
        }
    
        public void process(WatchedEvent event) {
            if (KeeperState.SyncConnected == event.getState()) {  //zk连接成功通知事件
                if (EventType.None == event.getType() && null == event.getPath()) {
                    connectedSemaphore.countDown();
                } else if (event.getType() == EventType.NodeDataChanged) {  //zk目录节点数据变化通知事件
                    try {
                        System.out.println("配置已修改,新值为:" + new String(zk.getData(event.getPath(), true, stat)));
                    } catch (Exception e) {
                    }
                }
            }
        }
    }

    两个程序启动后都正确的读取到了zookeeper的/username目录节点下的数据'qingfeng'

    3、我们在zookeeper里修改下目录节点/username下的数据


    修改完成后,我们看见两个程序后台都及时收到了他们监听的目录节点数据变更后的值,如下所示


    Zookeeper集群模式安装

    本例搭建的是伪集群模式,即一台机器上启动三个zookeeper实例组成集群,真正的集群模式无非就是实例IP地址不同,搭建方法没有区别

    Step1:配置JAVA环境,检验环境:java -version

    Step2:下载并解压zookeeper

    # cd /usr/local
    # wget http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz
    # tar -zxvf zookeeper-3.4.12.tar.gz
    # cd zookeeper-3.4.12

    Step3:重命名 zoo_sample.cfg文件

    # cp conf/zoo_sample.cfg conf/zoo-1.cfg

    Step4:修改配置文件zoo-1.cfg,原配置文件里有的,修改成下面的值,没有的则加上

    # vim conf/zoo-1.cfg
    dataDir=/tmp/zookeeper-1
    clientPort=2181
    server.1=127.0.0.1:2888:3888
    server.2=127.0.0.1:2889:3889
    server.3=127.0.0.1:2890:3890

    配置说明

    • tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
    • initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20 秒
    • syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 5*2000=10秒
    • dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
    • clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
    • server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。

    Step4:再从zoo-1.cfg复制两个配置文件zoo-2.cfg和zoo-3.cfg,只需修改dataDir和clientPort不同即可

    # cp conf/zoo-1.cfg conf/zoo-2.cfg
    # cp conf/zoo-1.cfg conf/zoo-3.cfg
    # vim conf/zoo-2.cfg
    dataDir=/tmp/zookeeper-2
    clientPort=2182
    # vim conf/zoo-2.cfg
    dataDir=/tmp/zookeeper-3
    clientPort=2183

    Step5:标识Server ID

    创建三个文件夹/tmp/zookeeper-1,/tmp/zookeeper-2,/tmp/zookeeper-2,在每个目录中创建文件myid 文件,写入当前实例的server id,即1.2.3

    # cd /tmp/zookeeper-1
    # vim myid
    1
    # cd /tmp/zookeeper-2
    # vim myid
    2
    # cd /tmp/zookeeper-3
    # vim myid
    3

    Step6:启动三个zookeeper实例

    # bin/zkServer.sh start conf/zoo-1.cfg
    # bin/zkServer.sh start conf/zoo-2.cfg
    # bin/zkServer.sh start conf/zoo-3.cfg

    Step7:检测集群状态,也可以直接用命令“zkCli.sh -server IP:PORT”连接zookeeper服务端检测


    至此,我们对zookeeper就算有了一个入门的了解,当然zookeeper远比我们这里描述的功能多,比如用zookeeper实现集群管理,分布式锁,分布式队列,zookeeper集群leader选举等等

    推荐阅读:https://www.roncoo.com/course/view/255bac222b1b4300b42838b58fea3a2e

    文章来源:https://my.oschina.net/u/3796575/blog/1845035

    展开全文
  • ZooKeeper之(一)ZooKeeper是什么

    万次阅读 多人点赞 2016-10-23 13:38:33
    鉴于CSDN对**版权保护的不作为**以及落后的运营手段,本博客将于近期关闭,并清空全部文章。 原有文章将会经过再次的校对、整理,转移至本人在**简书**的[博客空间](https://www.jianshu.com/u/3ec23ef9a408)... ...


    鉴于CSDN对**版权保护的不作为**以及落后的运营手段,本博客将于近期关闭,并清空全部文章。

    原有文章将会经过再次的校对、整理,转移至本人在**简书**的[博客空间](https://www.jianshu.com/u/3ec23ef9a408)。

    展开全文
  • zookeeper

    万次阅读 2017-11-15 17:19:42
    zookeeper有配置维护、域名服务、分布式同步、组服务等这些功能,它可以通过投票选举机制选举出leader,并且在hbase中,zookeeper尤为重要,zookeeper存储了hbase的元数据,所以想要搭建hbase集群之前,必

    一、zookeeper

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。zookeeper有配置维护、域名服务、分布式同步、组服务等这些功能,它可以通过投票选举机制选举出leader,并且在hbase中,zookeeper尤为重要,zookeeper存储了hbase的元数据,所以想要搭建hbase集群之前,必须要搭建zookeeper。

    操作步骤

    1. zookeeper3.4.10下载

    zookeeper下载地址,并上传到主服务器的/opt目录下
    虽然zookeeper在我们hadoop集群的三个节点都需要安装,但我们可以先在主服务器上做好配置,然后分发到从服务器

    2. zookeeper解压并修改目录名

     # cd /opt
     # tar -xzvf zookeeper-3.4.10.tar.gz
     # mv zookeeper-3.4.10 zookeeper3.4.10
    

    3. 创建data和dataLog目录

     # mkdir /opt/zookeeper3.4.10/data                      # 创建data目录
     # mkdir /opt/zookeeper3.4.10/dataLog                # 创建dataLog目录
    

    4. 创建myid文件

     # cd /opt/zookeeper3.4.10/data
     # vim myid                  # 输入数字1,然后保存,第二个节点输入2,第三个节点输入3
    
     # chmod 777 -R /opt/zookeeper3.4.10    # 对zookeeper的目录进行授权
    

    5. 修改配置文件zoo.cfg

     # cd /opt/zookeeper3.4.10/conf
     # cp zoo_sample.cfg zoo.cfg
     # vim zoo.cfg             #在文件末尾添加如下内容
    
    dataDir=/opt/zookeeper3.4.10/data  
    dataLogDir=/opt/zookeeper3.4.10/dataLog  
    server.1=hadoop0:2888:3888  
    server.2=hadoop1:2888:3888  
    server.3=hadoop2:2888:3888  
    
     # 注hadoop0,hadoop1,hadoop2为三个节点的主机名!
    

    6. 把在主节点上修改的zookeeper分发到hadoop1和hadoop2

     # cd /opt/
     # scp -r zookeeper3.4.10  root@hadoop1:/opt/
     # scp -r zookeeper3.4.10  root@hadoop2:/opt/
    

    分发后别忘了修改data目录下的myid文件中的内容,也给从节点的zookeeper目录赋权

    7. 启动和测试集群

    分别在三台服务器上运行如下命令
     # zkServer.sh start
    

    8. 验证效果

    分别在三台服务器上运行如下命令
     # zkServer.sh status
    

    这里写图片描述

    这里写图片描述

    这里写图片描述

    查看zookeeper集群中的zookeeper节点的状态,会发现其中一个是leader,其余是follower。这就是zookeeper的投票选举机制,所以一般zookeeper为单数个节点的集群,这样投票容易一些;当然如果双数节点也可以,只是投票难度大了一些,比如6个节点的zookeeper,那么必须一个节点票数为4票及以上,才行,而不像单数个节点!

    二、注意

    安装了zookeeper集群之后,应用命令zkServer.sh start后,启动了zookeeper服务,用jps进程发现存在QuorumPeerMain进程,但是查看zookeeper状态的时候,发现报Error contacting service. It is probably not running.错误,提示服务并没有启动,那这是什么原因呢?原因可能有多种造成的,下面我们来分析一下。

    操作步骤

    报错提示如下:

    这里写图片描述

    1. 查看zoo.cfg文件

    查看最后添加的内容,server后面的数字为data目录下myid中的数字,hadoop0,hadoop1,hadoop2为自己的主机名!

     # vim /opt/zookeeper3.4.10/conf/zoo.cfg
     
     dataDir=/opt/zookeeper3.4.10/data  
     dataLogDir=/opt/zookeeper3.4.10/dataLog  
     server.1=hadoop0:2888:3888  
     server.2=hadoop1:2888:3888  
     server.3=hadoop2:2888:3888
    

    2. 查看data目录中的myid文件

    如果myid文件中的数字不和zoo.cfg中的数字对应,也会造成错误!

    # vim /opt/zookeeper3.4.10/data/myid
    

    我当时就是把数字搞错了,第一个myid中的数字为1,第二个myid中的数字为2,第三个myid中的数字还是写的2,最后导致第三个服务器的zookeeper老是报错,排查了一会!

    3. 查看防火墙是否关闭

     # systemctl stop firewalld.service
     # systemctl disable firewalld.service
    
    展开全文
  • 转自:点击打开链接1、Zookeeper的角色 » 领导者(leader),负责进行投票的发起和决议,更新系统状态 » 学习者(learner),包括跟随者(follower)和观察者(observer),follower用于接受客户端请求并想...
  • zookeeper是一个高性能、开源的分布式应用协调服务,它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务,比如实现同步(分布式锁)、配置管理、集群管理。它被设计为易于编程,使用文件系统目录树作为...
  • 原创ZooKeeper入门实战教程(一)-介绍与核心概念

    万次阅读 多人点赞 2018-10-14 07:59:27
    本原创入门教程,涵盖ZooKeeper核心内容,通过实例和大量图表,结合实战,帮助学习者理解和运用,任何问题欢迎留言。 目录: zookeeper介绍与核心概念 安装和使用 ZooKeeper分布式锁实现 ZooKeeper框架Curator...
  • ZooKeeper是什么

    万次阅读 多人点赞 2018-07-13 13:28:55
    ZooKeeper是什么 ZooKeeper由雅虎研究院开发,是Google Chubby的开源实现,后来托管到Apache,于2010年11月正式成为Apache的顶级项目。 ZooKeeper是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供...
  • Zookeeper概述

    千次阅读 2019-01-21 17:10:43
    什么是Zookeeper zookeeper,英/'zuːkiːpə/,动物园管理员,将分布式系统比作动物园,那么Zookeeper就是用来管理分布式应用的。 其官方定义为(本人根据官网内容翻译如下): 是一个开源的分布式应用的服务,...
  • Zookeeper用作注册中心的原理

    万次阅读 2019-05-25 19:29:08
    RPC框架中有3个重要的角色: ...简单来讲,zookeeper可以充当一个服务注册表(Service Registry),让多个服务提供者形成一个集群,让服务消费者通过服务注册表获取具体的服务访问地址(IP+端口)去访...
  • ZooKeeper

    千次阅读 2019-05-09 21:04:31
    1. ZooKeeper 开源的分布式的协调服务,是Google的Chubby一个开源的实现,它是一个为分布式应用提供一致性服务的软件 2. ZooKeeper提供的功能 配置维护 域名服务 分布式锁 组服务 3. ZooKeeper的特点 简单 ...
  • ZooKeeper面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 18:08:59
    ZooKeeper 是什么?2. ZooKeeper 提供了什么?3. Zookeeper 文件系统4. Zookeeper 怎么保证主从节点的状态同步?5. 四种类型的数据节点 Znode6. Zookeeper Watcher 机制 -- 数据变更通知7. 客户端注册 Watcher 实现...
  • CentOS下搭建Zookeeper集群

    万次阅读 多人点赞 2018-08-13 21:02:51
    Zookeeper简介 ZooKeeper是一个开源的分布式应用协调服务,用于在分布式应用各个节点之间进行协调,并通过稳健的同步技术维护共享数据。 这里提到了一个新名词:“分布式应用”,让我们先来简单地快速了解一下什么...
  • zookeeper运维

    万次阅读 2014-02-09 15:06:37
    尽管zookeeper在编程上有很多的阱陷,API也非常的难用,但zookeeper服务本身可以说是很牢靠的了,所以在网上貌似关于运维的文章比较少。 但省心并不代表不会出麻烦,下面总结下zookeeper运维相关的东东。 重要的...
  • ZooKeeper

    万次阅读 2020-06-05 15:11:21
    ZooKeeper的概述,单体安装以及分布式安装、客户端操作命令以及Java客户端操作
  • zookeeper 大量连接断开重连原因排查

    万次阅读 多人点赞 2014-11-24 19:56:41
    最后发现线上的zookeeper的日志zookeeper.out 文件居然有6G,后来设置下日志为滚动输出,参考: http://blog.csdn.net/hengyunabc/article/details/19006911 但是改了之后,发现一天的日志量就是100多M,滚动日志...
  • docker启动zookeeper服务器

    万次阅读 2020-05-06 15:17:27
    docker_hub上搜索zookeeper 我选择了第一个,也就是官方的镜像 网易云镜像地址,找一个合适的zookeeper镜像下载下来,并且参考下面的启动zookeeper的命令启动容器 下载镜像 docker pull zookeeper 启动容器 ...
  • Zookeeper原理架构

    万次阅读 多人点赞 2016-04-22 11:59:44
    本文纯属个人笔记,通俗易懂,转载请附上原文链接!部分资料摘自网络,如有雷同,纯属巧合!Zookeeper到底是什么!?学一个东西,不搞明白他是什么东西,哪...在Zookeeper的官网上有这么一句话:ZooKeeper is a central
  • Dubbo与注册中心Zookeeper的交互过程

    万次阅读 多人点赞 2018-06-09 19:15:13
    Zookeeper作为注册中心在Dubbo框架中的作用过程。

空空如也

1 2 3 4 5 ... 20
收藏数 269,215
精华内容 107,686
关键字:

zookeeper