一、ZooKeeper 基本概念

1、ZooKeeper 是什么?

Zookeeper官网地址: http://zookeeper.apache.org/

Zookeeper官网文档地址:http://zookeeper.apache.org/doc/trunk/index.html

ZooKeeper 是Hadoop下的一个子项目,它是一个针对大型分布式系统的可靠协调系统;它提供的功能包括:配置维护、名字服务、分布式同步、组服务等; 它的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

Zookeeper一个最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心,服务生产者将自己提供的服务注册到Zookeeper中心,服务的消费者在进行服务调用的时候先到Zookeeper中查找服务,获取到服务生产者的详细信息之后,再去调用服务生产者的内容与数据,简单示例图如下:

2、ZooKeeper设计目标:

ZooKeeper允许分布式进程通过共享的层次结构命名空间进行相互协调,这与标准文件系统类似。 名称空间由ZooKeeper中的数据寄存器组成 - 称为znode,这些类似于文件和目录。 与为存储设计的典型文件系统不同,ZooKeeper数据保存在内存中,这意味着ZooKeeper可以实现高吞吐量和低延迟。

Zookeeper层次结构命名空间示意图如下:

通过这种树图结构的数据模型,很容易的查找到具体的某一个服务。

3、ZooKeeper主要特点:

1)、最终一致性:为客户端展示同一视图,这是 ZooKeeper 最重要的性能。

2)、可靠性:如果消息被一台服务器接受,那么它将被所有的服务器接受。

3)、实时性:ZooKeeper 不能保证两个客户端同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。

4)、等待无关(wait-free):慢的或者失效的 client 不干预快速的client的请求。

5)、原子性:更新只能成功或者失败,没有中间其它状态。

6)、顺序性:对于所有Server,同一消息发布顺序一致。

二、ZooKeeper 基本原理

1、ZooKeeper 系统架构

首先看一下 ZooKeeper 的架构图。

ZooKeeper 的架构图中我们需要了解和掌握的主要有:

(1)ZooKeeper分为服务器端(Server) 和客户端(Client),客户端可以连接到整个 ZooKeeper服务的任意服务器上(除非 leaderServes 参数被显式设置, leader 不允许接受客户端连接)。

(2)客户端使用并维护一个 TCP 连接,通过这个连接发送请求、接受响应、获取观察的事件以及发送心跳。如果这个 TCP 连接中断,客户端将自动尝试连接到另外的 ZooKeeper服务器。客户端第一次连接到 ZooKeeper服务时,接受这个连接的 ZooKeeper服务器会为这个客户端建立一个会话。当这个客户端连接到另外的服务器时,这个会话会被新的服务器重新建立。

(3)上图中每一个Server代表一个安装Zookeeper服务的机器,即是整个提供Zookeeper服务的集群(或者是由伪集群组成);

(4)组成ZooKeeper服务的服务器必须彼此了解。 它们维护一个内存中的状态图像,以及持久存储中的事务日志和快照, 只要大多数服务器可用,ZooKeeper服务就可用;

(5)ZooKeeper 启动时,将从实例中选举一个 leader,Leader 负责处理数据更新等操作,一个更新操作成功的标志是当且仅当大多数Server在内存中成功修改数据。每个Server 在内存中存储了一份数据。

(6)Zookeeper是可以集群复制的,集群间通过Zab协议(Zookeeper Atomic Broadcast)来保持数据的一致性;

(7)Zab协议包含两个阶段:leader election阶段和Atomic Brodcast阶段。

  • a) 集群中将选举出一个leader,其他的机器则称为follower,所有的写操作都被传送给leader,并通过brodcast将所有的更新告诉给follower。

  • b) 当leader崩溃或者leader失去大多数的follower时,需要重新选举出一个新的leader,让所有的服务器都恢复到一个正确的状态。

  • c) 当leader被选举出来,且大多数服务器完成了 和leader的状态同步后,leadder election 的过程就结束了,就将会进入到Atomic brodcast的过程。

  • d) Atomic Brodcast同步leader和follower之间的信息,保证leader和follower具有形同的系统状态。

2、Zookeeper 角色

启动 Zookeeper 服务器集群环境后,多个 Zookeeper 服务器在工作前会选举出一个 Leader。选举出 leader 前,所有 server 不区分角色,都需要平等参与投票( obServer 除外,不参与投票);

选主过程完成后,存在以下几种角色:

思考:

1、为什么需要server?

①ZooKeeper 需保证高可用和强一致性;

②为了支持更多的客户端,需要增加更多的Server;

③Follower增多会导致投票阶段延迟增大,影响性能。 123123

2、在Zookeeper 中ObServer 起到什么作用?

①ObServer 不参与投票过程,只同步 leader的状态 ;

②Observers 接受客户端的连接,并将写请求转发给 leader节点 ;

③加入更多ObServer 节点,提高伸缩性,同时还不影响吞吐率。123123

3、为什么在Zookeeper中Server 数目一般为奇数?

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

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

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

既然3个或者4个Server,同样最多允许1个Server挂掉,那么它们的可靠性是一样的,所以选择奇数个ZooKeeper Server即可,这里选择3个Server。

3、ZooKeeper 写数据流程

ZooKeeper 写数据的流程图如下所示。

ZooKeeper 的写数据流程主要分为以下几步:

  • a)、比如 Client 向 ZooKeeper 的 Server1 上写数据,发送一个写请求。

  • b)、如果Server1不是Leader,那么Server1 会把接受到的请求进一步转发给Leader,因为每个ZooKeeper的Server里面有一个是Leader。这个Leader 会将写请求广播给各个Server,比如Server1和Server2, 各个Server写成功后就会通知Leader。

  • c)、当Leader收到大多数 Server 数据写成功了,那么就说明数据写成功了。如果这里三个节点的话,只要有两个节点数据写成功了,那么就认为数据写成功了。写成功之后,Leader会告诉Server1数据写成功了。

  • d)、Server1会进一步通知 Client 数据写成功了,这时就认为整个写操作成功。

4、ZooKeeper 组件

ZooKeeper组件显示了ZooKeeper服务的高级组件。 除了请求处理器,组成ZooKeeper服务的每个服务器复制其自己的每个组件的副本。

Replicated Database是包含整个数据树的内存数据库。 更新操作会记录到磁盘里以进行可恢复性,并且写操作将在放到内存数据库之前序列化到磁盘。

每个ZooKeeper服务器服务客户端。 客户端连接到一个服务器以提交irequest。 读取请求从每个服务器数据库的本地副本服务。 更改服务状态(写入请求)的请求由协议进行处理。

作为协议协议的一部分,来自客户端的所有写请求被转发到单个服务器,称为leader。 其余的ZooKeeper服务器(称为followers)从领导者接收消息提议并同意消息传递。 消息层负责在失败时替换领导者,并与leader同步followers。

三、ZooKeeper 应用场景总结

1、统一命名服务

统一命名服务的命名结构图如下所示:

1、在分布式环境下,经常需要对应用/服务进行统一命名,便于识别不同服务。

a)类似于域名与ip之间对应关系,ip不容易记住,而域名容易记住。

b)通过名称来获取资源或服务的地址,提供者等信息。

2、按照层次结构组织服务/应用名称。

a)可将服务名称以及地址信息写到ZooKeeper上,客户端通过ZooKeeper获取可用服务列表类。

2、配置管理

配置管理结构图如下所示:

1、分布式环境下,配置文件管理和同步是一个常见问题。

a)一个集群中,所有节点的配置信息是一致的,比如 Hadoop 集群。

b)对配置文件修改后,希望能够快速同步到各个节点上。

2、配置管理可交由ZooKeeper实现。

a)可将配置信息写入ZooKeeper上的一个Znode。

b)各个节点监听这个Znode。

c)一旦Znode中的数据被修改,ZooKeeper将通知各个节点。

3、集群管理

集群管理结构图如下所示:

1、分布式环境中,实时掌握每个节点的状态是必要的。

a)可根据节点实时状态做出一些调整。

2、可交由ZooKeeper实现。

a)可将节点信息写入ZooKeeper上的一个Znode。

b)监听这个Znode可获取它的实时状态变化。

3、典型应用

a)Hbase中Master状态监控与选举。

4、分布式通知与协调

1、分布式环境中,经常存在一个服务需要知道它所管理的子服务的状态。

a)NameNode需知道各个Datanode的状态。

b)JobTracker需知道各个TaskTracker的状态。

2、心跳检测机制可通过ZooKeeper来实现。

3、信息推送可由ZooKeeper来实现,ZooKeeper相当于一个发布/订阅系统。

5、分布式锁

处于不同节点上不同的服务,它们可能需要顺序的访问一些资源,这里需要一把分布式的锁。

分布式锁具有以下特性:

1、ZooKeeper是强一致的。比如各个节点上运行一个ZooKeeper客户端,它们同时创建相同的Znode,但是只有一个客户端创建成功。

2、实现锁的独占性。创建Znode成功的那个客户端才能得到锁,其它客户端只能等待。当前客户端用完这个锁后,会删除这个Znode,其它客户端再尝试创建Znode,获取分布式锁。

3、控制锁的时序。各个客户端在某个Znode下创建临时Znode,这个类型必须为CreateMode.EPHEMERAL_SEQUENTIAL,这样该Znode可掌握全局访问时序。

6、分布式队列

分布式队列分为两种:

1、当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达,这种是同步队列。

a)一个job由多个task组成,只有所有任务完成后,job才运行完成。

b)可为job创建一个/job目录,然后在该目录下,为每个完成的task创建一个临时的Znode,一旦临时节点数目达到task总数,则表明job运行完成。

2、队列按照FIFO方式进行入队和出队操作,例如实现生产者和消费者模型。

三、ZooKeeper 安装部署

zookeeper 的安装模式有三种:

  • 单机模式( stand-alone):单机单 server;

  • 集群模式:多机多 server,形成集群;

  • 伪集群模式:单机多个 server,形成伪集群;

环境:Cent OS 7.0

1、单机模式

(1)根据需要创建目录,例如我的目录是:/home/xuliugen/Desktop/zookeeper-install

(2)进入目录,使用wget下载zookeeper,

下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz

其他版本下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/

完成如下:

(3)使用: tar -xvf zookeeper-3.4.6.tar.gz 解压缩该文件;

(4)创建Zookeeper配置文件:

在Zookeeper的安装目录下的conf文件下,默认为:

使用:cp zoo_sample.cfg zoo.cfg 命令,复制一份为zoo.cfg文件,这是因为Zookeeper再启动的时候默认使用的是zoo.cfg这个配置文件。

(5)根据需求修改配置文件内容:

一般默认的配置文件就可以演示启动,配置文件如下:

小提示:

在Zookeeper官方文档中给了一个关于性能优化的小经验,就是有几个其他配置参数可以大大提高性能:

为了获得更新时的低延迟,重要的是有一个专用的事务日志目录。 默认情况下,事务日志与数据快照和myid文件放在同一目录中。 dataLogDir参数指示用于事务日志的不同目录。

意思就是说,最好将属具目录和日志目录分离开来,从而提高数据的读取更新效率。

(6)启动Zookeeper

在Zookeeper安装目录的bin目录下:

使用命令:./zkServer.sh start 即可开启服务:

使用: ./zkCli.sh 命令可以进入到命令行管理界面:

到此单机模式就安装结束了!

2、集群模式 3、伪集群模式

关于集群模式 和伪集群模式的配置,网上已经有很多内容,这里不再演示,请移步查看:

http://www.open-open.com/lib/view/open1454043410245.html

附录:

zoo.cfg配置参数解释:


参考文章:

1、《大型分布式网站架构-设计与实践 陈康贤-著》

2、《Zookeeper-3.3.5源码分析 刘少伟》

3、http://m.blog.csdn.net/article/details?id=51209939

4、http://mt.sohu.com/20160527/n451709612.shtml

5、http://www.open-open.com/lib/view/open1454043410245.html

161209、简要分析ZooKeeper基本原理及安装部署的更多相关文章

  1. (转)ZooKeeper 笔记(1) 安装部署及hello world

    ZooKeeper 笔记(1) 安装部署及hello world   先给一堆学习文档,方便以后查看 官网文档地址大全: OverView(概述) http://zookeeper.apache.or ...

  2. Zookeeper介绍及安装部署

    本节内容: Zookeeper介绍 Zookeeper特点 Zookeeper应用场景 用到了Zookeeper的一些系统 Zookeeper集群安装部署 一.Zookeeper介绍 是一个针对大型分 ...

  3. ZooKeeper 笔记(1) 安装部署及hello world

    先给一堆学习文档,方便以后查看 官网文档地址大全: OverView(概述) http://zookeeper.apache.org/doc/r3.4.6/zookeeperOver.html Get ...

  4. zookeeper与kafka安装部署及java环境搭建(发布订阅模式)

    1. ZooKeeper安装部署 本文在一台机器上模拟3个zk server的集群安装. 1.1. 创建目录.解压 cd /usr/ #创建项目目录 mkdir zookeeper cd zookee ...

  5. Kerberos基本原理、安装部署及用法

    1. 概述 Kerberos是一种认证机制. 目的是,通过密钥系统为客户端/服务器应用程序提供强大的认证系统:保护服务器防止错误的用户使用,同时保护它的用户使用正确的服务器,即支持双向验证:Kerbe ...

  6. centos7下zookeeper集群安装部署

    应用场景:ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件. 它是一个为分布式应用提供一致性服务的软 ...

  7. 日志分析工具--GoAccess的安装部署

    需求:及时得到线上用户访问日志分析统计结果,以便给开发.测试.运维.运营人员提供决策! 方案:GoAccess,图文并茂,而且速度快,每秒8W 的日志记录解析速度,websocket10秒刷新统计数据 ...

  8. Zookeeper——Docker下安装部署

    单节点安装 一. 环境说明 docker: 18.09.9-ce zookeeper: 3.5.6 二. 拉取 zookeeper 镜像 拉取镜像 docker pull zookeeper 默认是摘 ...

  9. 【Hadoop 分布式部署 九:分布式协作框架Zookeeper架构 分布式安装部署 】

    1.首先将运行在本地上的  zookeeper 给停止掉 2.到/opt/softwares 目录下  将  zookeeper解压到  /opt/app 目录下 命令:  tar -zxvf zoo ...

随机推荐

  1. 一个资深iOS开发者对于React Native的看法

    一个资深iOS开发者对于React Native的看法 当我第一次尝试ReactNative的时候,我觉得这只是网页开发者涉足原生移动应用领域的歪门邪道.   我认为一个js开发者可以使用javasc ...

  2. oracle 连接查询,和(+)符号的用法

    --连接查询 左链接.右链接,全链接 --内链接select e.account 用户名, e.empname 名称, c.comname 公司名称  from employee e inner jo ...

  3. ellipsis

    语法:  text-overflow : clip | ellipsis 参数:  clip : 不显示省略标记(...),而是简单的裁切(clip这个参数是不常用的!)      ellipsis ...

  4. H5学习小结——div+css创建电子商务静态网页

    使用Sublime Text软件编写电子商务类网站静态形式首页 经过差不多一星期的学习,基本掌握了div+css的用法之后,开始了实战练习.首先要做的就是要练习一下一般电子商务网页的编写,我做的是下图 ...

  5. JS简单的图片左右滚动

    <div id="scroll" style="overflow:hidden;width:757px;"> <table cellpaddi ...

  6. CommonUtils.java

    package com.vcredit.framework.utils; import java.lang.reflect.InvocationTargetException;import java. ...

  7. 一封给JVM懵懂者的情书【不看错过一生幸福】

    别说你懂我 你只是在意Java你把我留在家里身和心却始终在她那里难道我只是她的附属品?错,我是我,我是JVM,没有我就没有他! 如果你想懂我或者不管你是否懂我我都在这里等你---[深入JVM内核—原理 ...

  8. Android监听Home键

    监听广播  ACTION_CLOSE_SYSTEM_DIALOGS private void registerHomeReceiver(){ IntentFilter homeFilter = new ...

  9. C 到C++的升级

    C++所有的变量都可以在需要使用时再定义. C语言中的变量都必须在作用域开始的位置定义. register 关键字请求编译器将局部变量存储于寄存器中 在C语言无法获取register 变量的地址 在C ...

  10. C#常用命名空间

    MSDN上的C#.NET Framework类库文档目录树,本人觉得有点不得要领,于是参考搜到的结果简单整理如下: 一.基础命名空间 System 处理内建数据.数学计算.随机数的产生.环境变量.垃圾 ...