zookeeper_zookeeper原理 - CSDN
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入门视频课程

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

    万次阅读 多人点赞 2018-09-11 22:53:18
    相信大家对 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之(一)ZooKeeper是什么

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


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

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

    展开全文
  • zookeeper

    万次阅读 2018-11-21 01:45:46
    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
    
    展开全文
  • 原创ZooKeeper入门实战教程(一)-介绍与核心概念

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

    本原创入门教程,涵盖ZooKeeper核心内容,通过实例和大量图表,结合实战,帮助学习者理解和运用,任何问题欢迎留言。

    目录:

    本章是后续学习的基石,只有充分理解了分布式系统的概念和面临的问题,以及ZooKeeper内部的概念,才能懂得ZooKeeper是如何对分布式系统进行协调,为后续学习打下坚实的基础。

     

    1、ZooKeeper介绍与核心概念

    1.1 简介

    ZooKeeper最为主要的使用场景,是作为分布式系统的分布式协同服务。在学习zookeeper之前,先要对分布式系统的概念有所了解,否则你将完全不知道zookeeper在分布式系统中起到了什么作用,解决了什么问题。

     

    1.2分布式系统面临的问题

    我们将分布式系统定义为:分布式系统是同时跨越多个物理主机,独立运行的多个软件所组成系统。类比一下,分布式系统就是一群人一起干活。人多力量大,每个服务器的算力是有限的,但是通过分布式系统,由n个服务器组成起来的集群,算力是可以无限扩张的。

    优点显而易见,人多干活快,并且互为备份。但是缺点也很明显。我们可以想象一下,以一个小研发团队开发软件为例,假设我们有一个5人的项目组,要开始一个系统的开发,项目组将面临如下问题:

    你一定在想,以上这些问题很简单啊,在我的日常工作中天天都在发生,并没感觉有什么复杂。是的,这是因为我们人类的大脑是个超级计算机,能够灵活应对这些问题,而且现实中信息的交换不依赖网络,不会因网络延迟或者中断,出现信息不对等。而且现实中对以上问题的处理其实并不严谨,从而也引发了很多问题。想一想,项目中是不是出现过沟通不畅造成任务分配有歧义?是否由于人员离职造成任务进行不下去,甚至要联系离职人员协助?是不是出现过任务分配不合理?类似这样的各种问题,肯定会发生于你的项目组中。在现实世界,我们可以人为去协调,即使出错了,人工去补错,加加班搞定就好。但在计算机的世界,这样做是行不通的,一切都要保证严谨,以上问题要做到尽可能不要发生。因此,分布式系统必须采用合理的方式解决掉以上的问题。

    实际上要想解决这些问题并没有那么复杂,我们仅需要做一件事就可以万事无忧---让信息在项目组成员中同步。如果能做到信息同步,那么每个人在干什么,大家都是清楚的,干到什么程度也是清晰的,无论谁离职也不会产生问题。分配的工作,能够及时清晰的同步给每个组员,确保每个组员收到的任务分配没有冲突。

    分布式系统的协调工作就是通过某种方式,让每个节点的信息能够同步和共享。这依赖于服务进程之间的通信。通信方式有两种:

    1、通过网络进行信息共享

    这就像现实世界,开发leader在会上把任务传达下去,组员通过听leader命令或者看leader的邮件知道自己要干什么。当任务分配有变化时,leader会单独告诉组员,或者再次召开会议。信息通过人与人之间的直接沟通,完成传递。

    2、通过共享存储

    这就好比开发leader按照约定的时间和路径,把任务分配表放到了svn上,组员每天去svn上拉取最新的任务分配表,然后干活。其中svn就是共享存储。更好一点的做法是,当svn文件版本更新时,触发邮件通知,每个组员再去拉取最新的任务分配表。这样做更好,因为每次更新,组员都能第一时间得到消息,从而让自己手中的任务分配表永远是最新的。此种方式依赖于中央存储。整个过程如下图所示:

     

    1.3 ZooKeeper如何解决分布式系统面临的问题

    ZooKeeper对分布式系统的协调,使用的是第二种方式,共享存储。其实共享存储,分布式应用也需要和存储进行网络通信。网络通信是分布式系统并发设计的基础。

    实际上,通过ZooKeeper实现分布式协同的原理,和项目组通过SVN同步工作任务的例子是一样的。ZooKeeper就像是svn,存储了任务的分配、完成情况等共享信息。每个分布式应用的节点就是组员,订阅这些共享信息。当主节点(组leader),对某个从节点的分工信息作出改变时,相关订阅的从节点得到zookeeper的通知,取得自己最新的任务分配。完成工作后,把完成情况存储到zookeeper。主节点订阅了该任务的完成情况信息,所以将得到zookeeper的完工的通知。参考下图,回味一下,是不是和前面项目组通过svn分配工作的例子一模一样?仅仅是把svn和邮件系统合二为一,以ZooKeeper代替。

    注:Slave节点要想获取ZooKeeper的更新通知,需事先在关心的数据节点上设置观察点。

    大多数分布式系统中出现的问题,都源于信息的共享出了问题。如果各个节点间信息不能及时共享和同步,那么就会在协作过程中产生各种问题。ZooKeeper解决协同问题的关键,在于保证分布式系统信息的一致性。

    通过以上章节的讲解,我们应该已经理解分布式系统以及其面临的问题。了解了ZooKeeper通过什么样的机制去解决这些问题。从宏观上对ZooKeeper已经有了认知,接下来我们先切入到zookeeper自身,讲解zookeeper的概念,这些概念很重要,所有zookeeper的应用都会围绕这些概念来实现。

     

    1.4、zookeeper概念介绍

    ZooKeeper并不直接暴露分布式服务所需要的原语及原语的调用方法。什么是原语?举个例子,比如说分布式锁机制是一个原语,它会暴露出创建、获取、释放三个调用方法。ZooKeeper以类似文件系统的方式存储数据,暴漏出调用这些数据的API。让应用通过ZooKeeper的机制和API,自己来实现分布式相关原语。

    我们若想让应用能够通过ZooKeeper实现分布式协同,那么第一件事就是了解ZooKeeper的特性及相关概念,另外熟悉它给我们提供了哪些API。

    1.4.1 znode

    第一章讲过Zookeeper会保存任务的分配、完成情况,等共享信息,那么ZooKeeper是如何保存的呢?在ZooKeeper中,这些信息被保存在一个个数据节点上,这些节点被称为znode。它采用了类似文件系统的层级树状结构进行管理。见下图示例:

    根节点/包含4个子节点,其中三个拥有下一级节点。有的叶子节点存储了信息。

    节点上没有存储数据,也有着重要的含义。比如在主从模式中,当/master节点没有数据时,代表分布式应用的主节点还没有选举出来。

    znode节点存储的数据为字节数组。存储数据的格式zookeeper不做限制,也不提供解析,需要应用自己实现。

    实际上图就是主从模式存储数据的示例,这里先简单讲解:

    • /master,存储了当前主节点的信息
    • /workers,下面的每个子znode代表一个从节点,子znode上存储的数据,如“foo.com:2181”,代表从节点的信息。
    • /tasks,下面的每个子znode代表一个任务,子znode上存储的信息如“run cmd”,代表该内务内容
    • /assign,下面每个子znode代表一个从节点的任务集合。如/assign/worker-1,代表worker-1这个从节点的任务集合。/assign/worker-1下的每个子znode代表分配给worker-1的一个任务。

    持久节点(persistent)和临时节点(ephemeral)

    持久节点只能通过delete删除。临时节点在创建该节点的客户端崩溃或关闭时,自动被删除。

    前面例子中的/master应该使用临时节点,这样当主节点失效或者退出时,该znode被删除,其他节点知道主节点崩溃了,开始进行选举的逻辑。另外/works/worker-1也应该是临时节点,在此从节点失效的时候,该临时节点自动删除。

    在目前的版本,由于临时znode会因为创建者会话过期被删除,所以不允许临时节点拥有子节点。

    有序节点

    znode可以被设置为有序(sequential)节点。有序znode节点被分配唯一一个单调递增的证书。如果创建了个一有序节点为/workers/worker-,zookeeper会自动分配一个序号1,追加在名字后面,znode名称为/workers/worker-1。通过这种方式,可以创建唯一名称znode,并且可以直观的看到创建的顺序。

    znode支持的操作及暴露的API:

    create /path data

        创建一个名为/path的znode,数据为data。

    delete /path

        删除名为/path的znode。

    exists /path

        检查是否存在名为/path的znode

    setData /path data

        设置名为/path的znode的数据为data

    getData /path

        返回名为/path的znode的数据

    getChildren /path

        返回所有/path节点的所有子节点列表

    1.4.2 观察与通知

    分布式应用需要及时知道zookeeper中znode的变化,从而了解到分布式应用整体的状况,如果采用轮询方式,代价太大,绝大多数查询都是无效的。因此,zookeeper采用了通知的机制。客户端向zookeeper请求,在特定的znode设置观察点(watch)。当该znode发生变化时,会触发zookeeper的通知,客户端收到通知后进行业务处理。观察点触发后立即失效。所以一旦观察点触发,需要再次设置新的观察点。

    我们使用Zookeeper不能期望能够监控到节点每次的变化。思考如下场景:

    1、客户端C1设置观察点在/tasks

    2、观察点触发,C1处理自己的逻辑

    3、C1设置新的观察点前,C2更新了/tasks

    4、C1处理完逻辑,再次设置了观察点。

    此时C1不会得到第三步的通知,因此错过了C2更新/tasks这次操作。要想不错过这次更新,C1需要在设置监视点前读取/tasks的数据,进行对比,发现更新。

    再如下面的场景:

    1、客户端C1设置观察点在/tasks

    2、/tasks上发生了连续两次更新

    3、C1在得到第一次更新的通知后就读取了/tasks的数据

    4、此时第二次更新也已经发生,C1用第一次的通知,读取到两次更新后的数据

    此时C1虽然错过了第二次通知,但是C1最终还是读取到了最新的数据。

    因此Zookeeper只能保证最终的一致性,而无法保证强一致性。

    zookeeper可以定义不同的观察类型。例如观察znode数据变化,观察znode子节点变化,观察znode创建或者删除。

    1.4.3 版本

    每个znode都有版本号,随着每次数据变化自增。setData和delete,以版本号作为参数,当传入的版本号和服务器上不一致时,调用失败。当多个zookeeper客户端同时对一个znode操作时,版本将会起到作用,假设c1,c2同时往一个znode写数据,c1先写完后版本从1升为2,但是c2写的时候携带版本号1,c2会写入失败。

    1.4.4 法定人数

    zookeeper服务器运行于两种模式:独立模式和仲裁模式(集群)。仲裁模式下,会复制所有服务器的数据树。但如果让客户端等待所有复制完成,延迟太高。这里引入法定人数概念,指为了使zookeeper集群正常工作,必须有效运行的服务器数量。同时也是服务器通知客户端保存成功前,必须保存数据的服务器最小数。例如我们有一个5台服务器的zookeeper集群,法定人数为3,只要任何3个服务器保存了数据,客户端就会收到确认。只要有3台服务器存活,整个zookeeper集群就是可用的。

    下图展示了客户端提交请求到收到回复的过程:

    法定人数需要大于服务器数量的一半。也称为多数原则。举个例子说明,假如集群有5台服务器,法定人数为2,那么有2台服务器参与复制即可,若这2台server刚刚复制完/z这个znode,就挂掉了。此时剩下了3台server,大于法定人数2,所以zookeeper认为集群正常,但这三台服务器是无法发现/z这个znode的。如果法定人数大于服务器数量一半,那么法定人数复制完成,就可以确保集群存活时,至少有一台服务器有最新的znode,否则集群认为自己已经崩溃。

    下面两个例子阐明了,为何要遵循多数原则。

    下图展示了5台server,法定人数为3,在确保zookeeper集群存活的前提下,最坏的情况挂了2台server(剩余及器数量3>=法定人数3),zookeeper是如何能确保数据完备,集群继续工作的。

    接下来两张图展示了5台server,未遵循多数原则,法定人数设为2。同样挂了两台server时,为什么zookeeper集群会出问题。

    首先,客户端发起请求,2个server复制数据后即返回客户端接收成功。

    就在此刻,很不幸,在继续同步更新给其他节点前,刚刚两个复制了数据的节点挂了。此时会怎样呢?如下图:

    可以看到创建/z的操作在zookeeper集群中丢失了。

    相信通过以上讲解,你已经能够理解为什么法定人数一定要多于一半服务器的数量。

    此外,我们要尽量选用奇数个服务器,这样集群能容忍崩溃服务器占比更大,性价比更高。例如4台服务器的集群,法定人数最少为3,那么只能允许1台服务器崩溃,也就是仅允许25%的机器崩溃。而5台服务器的集群,法定人数最少也是3,但是此时允许2台服务器崩溃。换句话讲,40%的机器崩溃后还能工作。

    仲裁模式下,负载均衡通过客户端随机选择连接串中的某个服务器来实现。

     

    1.4.5 会话

    客户端对zookeeper集群发送任何请求前,需要和zookeeper集群建立会话。客户端提交给zookeeper的所有操作均关联在一个会话上。当一个会话因某种原因终止时,会话期间创建的临时节点将会消失。而当当前服务器的问题,无法继续通信时,会话将被透明的转移到另外一台zookeeper集群的服务器上。

    会话提供了顺序保障。同一个会话中的请求以FIFO顺序执行。并发会话的FIFO顺序无法保证。

     

    1.4.6 会话状态和生命周期

    会话状态有:

    connecting、connected、closed、not_connected

    创建会话时,需要设置会话超时这个重要的参数。如果经过时间t后服务接受不到这个会话的任何消息,服务就会声明会话过期。客户端侧,t/3时间未收到任何消息,客户端向服务器发送心跳消息,2t/3时间后,客户端开始寻找其他服务器。此时他有t/3的时间去寻找,找不到的话,会话失效。

    重连服务器时,只有更新大于客户端的服务器才能被连接,以免连接到落后的服务器。zookeeper中通过更新建立的顺序,分配事务标识符。只有服务器的事物标识符大于客户端携带的标识符时,才可连接。

    回顾

    本章首先介绍了分布式系统及分布式系统面临的问题,随后介绍了zookeeper是以何机制来解决这些问题的。最后介绍了zookeeper中的重要概念,在开始后续学习前,一定要确保自己理解了这些重要的概念,本章知识是后面章节学习的重要基石。

    展开全文
  • 以下环境全部基于此系统: [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)   安装软件及对应版本 ...Zookeeper-3.4.5 apache-storm-1.0.6.tar.gz hba...
  • 搭建Zookeeper与Hbase过程及遇到的问题总结 http://my.oschina.net/hanzhankang/blog/129335  我的经验是最好放在hadoop一块,这样可以做个全盘拷贝与管理。比如之前安装的hadoop在/usr/hadoop目录下,...
  • zookeeper&hbase安装流程

    2017-02-17 10:47:01
    Zookeeper安装流程: 1. 下载并解压zookeeper 下载并解压zookeeper-3.4.6.tar.gz,命令如下 ]# tar –zxvf zookeeper-3.4.6.tar.gz ]# mv zookeeper-3.4.6/home/hadoop //将zookeeper放到hadoop目录下,方便管理 2....
  • 安装hbase前提是Hadoop集群和Zookeeper已经安装完毕,并能正确运行。 这里hadoop已安装完毕 介绍如何安装zookeeper 下载zookeeper:http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.5/ 下载二进制包:...
  • zookeeper安装步骤 注意:前置条件安装完Hadoop集群 安装Hadoop集群详细步骤 1.到官网中下载zookeeper稳定版本的安装包(建议3.4.6) 2.利用xshell中的xftp上传安装包到/opt目录下 3.解压 tar -zxvf zookeeper-...
  • Zookeeper入门看这篇就够了

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

    千次阅读 2019-01-21 17:43:35
    什么是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的特点 简单 ...
  • CentOS下搭建Zookeeper集群

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

    万次阅读 多人点赞 2020-05-06 14:11:50
    ZooKeeper 是什么?2. ZooKeeper 提供了什么?3. Zookeeper 文件系统4. Zookeeper 怎么保证主从节点的状态同步?5. 四种类型的数据节点 Znode6. Zookeeper Watcher 机制 -- 数据变更通知7. 客户端注册 Watcher 实现...
  • zookeeper运维

    万次阅读 2019-01-13 22:59:34
    尽管zookeeper在编程上有很多的阱陷,API也非常的难用,但zookeeper服务本身可以说是很牢靠的了,所以在网上貌似关于运维的文章比较少。 但省心并不代表不会出麻烦,下面总结下zookeeper运维相关的东东。 重要的...
  • 配置类,读取properties中的配置属性 import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.PropertySource;...
  • zookeeper 大量连接断开重连原因排查

    万次阅读 多人点赞 2019-01-13 22:59:01
    最后发现线上的zookeeper的日志zookeeper.out 文件居然有6G,后来设置下日志为滚动输出,参考: http://blog.csdn.net/hengyunabc/article/details/19006911 但是改了之后,发现一天的日志量就是100多M,滚动日志...
  • Zookeeper原理架构

    万次阅读 多人点赞 2019-11-22 16:25:47
    本文纯属个人笔记,通俗易懂,转载请附上原文链接!部分资料摘自网络,如有雷同,纯属巧合!Zookeeper到底是什么!?学一个东西,不搞明白他是什么东西,哪...在Zookeeper的官网上有这么一句话:ZooKeeper is a central
1 2 3 4 5 ... 20
收藏数 260,563
精华内容 104,225
关键字:

zookeeper