1.ZooKeeper安装和启动

1.下载解压ZooKeeper
ZooKeeper官方地址:http://zookeeper.apache.org/ 下载当前稳定版本:zookeeper-3.4.6.tar.gz 解压如下:
  1. [lizhiwei@localhost ZooKeeper]$ tar -zxvf zookeeper-3.4.6
  2. ......
  3. [lizhiwei@localhost ZooKeeper]$ ll
  4. total 17292
  5. drwxr-xr-x. 10 lizhiwei lizhiwei 4096 Feb 20 2014 zookeeper-3.4.6
  6. -rwxrwxr-x. 1 lizhiwei lizhiwei 17699306 Sep 13 23:25 zookeeper-3.4.6.tar.gz
  7. [lizhiwei@localhost ZooKeeper]$ cd zookeeper-3.4.6
  8. [lizhiwei@localhost zookeeper-3.4.6]$ ll
  9. total 1552
  10. drwxr-xr-x. 2 lizhiwei lizhiwei 4096 Oct 19 00:56 bin
  11. -rw-rw-r--. 1 lizhiwei lizhiwei 82446 Feb 20 2014 build.xml
  12. -rw-rw-r--. 1 lizhiwei lizhiwei 80776 Feb 20 2014 CHANGES.txt
  13. drwxr-xr-x. 2 lizhiwei lizhiwei 4096 Oct 19 00:52 conf
  14. drwxr-xr-x. 10 lizhiwei lizhiwei 4096 Feb 20 2014 contrib
  15. drwxr-xr-x. 2 lizhiwei lizhiwei 4096 Feb 20 2014 dist-maven
  16. drwxr-xr-x. 6 lizhiwei lizhiwei 4096 Feb 20 2014 docs
  17. -rw-rw-r--. 1 lizhiwei lizhiwei 1953 Feb 20 2014 ivysettings.xml
  18. -rw-rw-r--. 1 lizhiwei lizhiwei 3375 Feb 20 2014 ivy.xml
  19. drwxr-xr-x. 4 lizhiwei lizhiwei 4096 Feb 20 2014 lib
  20. -rw-rw-r--. 1 lizhiwei lizhiwei 11358 Feb 20 2014 LICENSE.txt
  21. -rw-rw-r--. 1 lizhiwei lizhiwei 170 Feb 20 2014 NOTICE.txt
  22. -rw-rw-r--. 1 lizhiwei lizhiwei 1770 Feb 20 2014 README_packaging.txt
  23. -rw-rw-r--. 1 lizhiwei lizhiwei 1585 Feb 20 2014 README.txt
  24. drwxr-xr-x. 5 lizhiwei lizhiwei 4096 Feb 20 2014 recipes
  25. drwxr-xr-x. 8 lizhiwei lizhiwei 4096 Feb 20 2014 src
  26. -rw-rw-r--. 1 lizhiwei lizhiwei 1340305 Feb 20 2014 zookeeper-3.4.6.jar
  27. -rw-rw-r--. 1 lizhiwei lizhiwei 836 Feb 20 2014 zookeeper-3.4.6.jar.asc
  28. -rw-rw-r--. 1 lizhiwei lizhiwei 33 Feb 20 2014 zookeeper-3.4.6.jar.md5
  29. -rw-rw-r--. 1 lizhiwei lizhiwei 41 Feb 20 2014 zookeeper-3.4.6.jar.sha12
2. ZooKeeper配置说明
进入conf目录配置ZooKeeper启动,在你执行启动脚本之前,还有几个基本的配置项需要配置一下,Zookeeper 的配置文件在 conf 目录下,这个目录下有 zoo_sample.cfg 和 log4j.properties,你需要做的就是将 zoo_sample.cfg 改名为 zoo.cfg,因为 Zookeeper在启动时会找这个文件作为默认配置文件。
  1. [lizhiwei@localhost zookeeper-3.4.6]$ cd conf/
  2. [lizhiwei@localhost conf]$ ll
  3. total 16
  4. -rw-rw-r--. 1 lizhiwei lizhiwei 535 Feb 20 2014 configuration.xsl
  5. -rw-rw-r--. 1 lizhiwei lizhiwei 2161 Feb 20 2014 log4j.properties
  6. -rw-rw-r--. 1 lizhiwei lizhiwei 922 Oct 19 00:52 zoo.cfg
  7. -rw-rw-r--. 1 lizhiwei lizhiwei 922 Feb 20 2014 zoo_sample.cfg
配置文件部分解释如下:
  1. #这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
  2. tickTime=2000
  3. #顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
  4. dataDir=/tmp/zookeeper
  5. #这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
  6. clientPort=2181
  7. #这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,
  8. #而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。
  9. #当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,
  10. #那么表明这个客户端连接失败。总的时间长度就是 10*2000=20 秒
  11. initLimit=10
  12. #这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 5*2000=10 秒
  13. syncLimit=5
  14. #这个操作将限制连接到 ZooKeeper 的客户端的数量,限制并发连接的数量,它通过 IP 来区分不同的客户端。此配置选项可以用来阻止某些类别的 Dos 攻击。将它设置为 0 或者忽略而不进行设置将会取消对并发连接的限制。
  15. maxClientCnxns=60
  16. #这个参数指定了需要保留事务日志和快照文件的数目。默认是保留3个。
  17. autopurge.snapRetainCount=3
  18. #ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时,
  19. #需要配置一个1或更大的整数,默认是0,表示不开启自动清理功能,但可以运行bin/zkCleanup.sh来手动清理zk日志
  20. autopurge.purgeInterval=1
3.启动Zookeeper服务并连接
由于Zookeeper支持集群,所以配置可分为如下
  1. #单机配置:
  2. tickTime=2000
  3. dataDir=D:/devtools/zookeeper-3.2.2/build
  4. clientPort=2181
  5. #集群配置:
  6. initLimit=5
  7. syncLimit=2
  8. server.1=192.168.211.1:2888:3888
  9. server.2=192.168.211.2:2888:3888
Zookeeper启动脚本在目录下,如下:
  1. [lizhiwei@localhost zookeeper-3.4.6]$ cd bin/
  2. [lizhiwei@localhost bin]$ ll
  3. total 44
  4. -rwxr-xr-x. 1 lizhiwei lizhiwei 238 Feb 20 2014 README.txt
  5. -rwxr-xr-x. 1 lizhiwei lizhiwei 1937 Feb 20 2014 zkCleanup.sh
  6. -rwxr-xr-x. 1 lizhiwei lizhiwei 1049 Feb 20 2014 zkCli.cmd
  7. -rwxr-xr-x. 1 lizhiwei lizhiwei 1534 Feb 20 2014 zkCli.sh
  8. -rwxr-xr-x. 1 lizhiwei lizhiwei 1333 Feb 20 2014 zkEnv.cmd
  9. -rwxr-xr-x. 1 lizhiwei lizhiwei 2696 Feb 20 2014 zkEnv.sh
  10. -rwxr-xr-x. 1 lizhiwei lizhiwei 1084 Feb 20 2014 zkServer.cmd
  11. -rwxr-xr-x. 1 lizhiwei lizhiwei 5742 Feb 20 2014 zkServer.sh
单机启动Zookeeper如下(zkServer.sh start):
  1. [lizhiwei@localhost bin]$ ./zkServer.sh
  2. JMX enabled by default
  3. Using config: /home/lizhiwei/SoftWare/ZooKeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg
  4. Usage: ./zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
  5. [lizhiwei@localhost bin]$ ./zkServer.sh start
  6. JMX enabled by default
  7. Using config: /home/lizhiwei/SoftWare/ZooKeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg
  8. Starting zookeeper ... STARTED
连接并简单操作Zookeeper如下(zkCli.sh -server 127.0.0.1:2181):
  1. [lizhiwei@localhost bin]$ ./zkCli.sh -server 127.0.0.1:2181
  2. Connecting to 127.0.0.1:2181 ......
  3. [zk: 127.0.0.1:2181(CONNECTED) 0] help
  4. ZooKeeper -server host:port cmd args
  5. connect host:port
  6. get path [watch]
  7. ls path [watch]
  8. set path data [version]
  9. rmr path
  10. delquota [-n|-b] path
  11. quit
  12. printwatches on|off
  13. create [-s] [-e] path data acl
  14. stat path [watch]
  15. close
  16. ls2 path [watch]
  17. history
  18. listquota path
  19. setAcl path acl
  20. getAcl path
  21. sync path
  22. redo cmdno
  23. addauth scheme auth
  24. delete path [version]
  25. setquota -n|-b val path
  26. [zk: 127.0.0.1:2181(CONNECTED) 1] ls /
  27. [testRootPath, zookeeper]
  28. [zk: 127.0.0.1:2181(CONNECTED) 2] get /zookeeper
  29. cZxid = 0x0
  30. ctime = Wed Dec 31 16:00:00 PST 1969
  31. mZxid = 0x0
  32. mtime = Wed Dec 31 16:00:00 PST 1969
  33. pZxid = 0x0
  34. cversion = -1
  35. dataVersion = 0
  36. aclVersion = 0
  37. ephemeralOwner = 0x0
  38. dataLength = 0
  39. numChildren = 1
  40. [zk: 127.0.0.1:2181(CONNECTED) 3]
操作说明:
(1)create:创建路径结点。
(2)ls:查看路径下的所有结点。
(3)get:获得结点上的值。
(4)set:修改结点上的值。
(5)delete:删除结点。

2.ZooKeeper数据模型

1.ZooKeeper数据模型图
Zookeeper 会维护一个具有层次关系的数据结构,它非常类似于一个标准的文件系统,如下图

2.ZooKeeper数据模型特点
Zookeeper 这种数据结构有如下这些特点:
  1. 每个子目录项如 NameService 都被称作为 znode,这个 znode 是被它所在的路径唯一标识,如 Server1 这个 znode 的标识为 /NameService/Server1
  2. znode 可以有子节点目录,并且每个 znode 可以存储数据,注意 EPHEMERAL 类型的目录节点不能有子节点目录
  3. znode 是有版本的,每个 znode 中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据
  4. znode 可以是临时节点,一旦创建这个 znode 的客户端与服务器失去联系,这个 znode 也将自动删除,Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个连接状态称为 session,如果 znode 是临时节点,这个 session 失效,znode 也就删除了
  5. znode 的目录名可以自动编号,如 App1 已经存在,再创建的话,将会自动命名为 App2
  6. znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是 Zookeeper 的核心特性,Zookeeper 的很多功能都是基于这个特性实现的,后面在典型的应用场景中会有实例介绍

3.ZooKeeper的应用场景

1.Zookeeper总体结构
Zookeeper服务自身组成一个集群(2n+1个服务允许n个失效)。Zookeeper服务有两个角色,一个是leader,负责写服务和数据同步,剩下的是follower,提供读服务,leader失效后会在follower中重新选举新的leader。Zookeeper逻辑图如下,


集群特性:
  • 客户端可以连接到每个server,每个server的数据完全相同。
  • 每个follower都和leader有连接,接受leader的数据更新操作。
  • Server记录事务日志和快照到持久存储。
  • 大多数server可用,整体服务就可用。
Zookeeper特点
  1. 顺序一致性:按照客户端发送请求的顺序更新数据。
  2. 原子性:更新要么成功,要么失败,不会出现部分更新。
  3. 单一性 :无论客户端连接哪个server,都会看到同一个视图。
  4. 可靠性:一旦数据更新成功,将一直保持,直到新的更新。
  5. 及时性:客户端会在一个确定的时间内得到最新的数据。
Zookeeper运用场景
  1. 统一命名服务
  2. 配置管理
  3. 集群管理
  4. 共享锁
  5. 队列管理
下面分别介绍这些应用场景。
2.统一命名服务
    分布式应用中,通常需要有一套完整的命名规则,既能够产生唯一的名称又便于人识别和记住,通常情况下用树形的名称结构是一个理想的选择,树形的名称结构是一个有层次的目录结构,既对人友好又不会重复。说到这里你可能想到了 JNDI,没错 Zookeeper 的 Name Service 与 JNDI 能够完成的功能是差不多的,它们都是将有层次的目录结构关联到一定资源上,但是 Zookeeper 的 Name Service 更加是广泛意义上的关联,也许你并不需要将名称关联到特定资源上,你可能只需要一个不会重复名称,就像数据库中产生一个唯一的数字主键一样。
    Name Service 已经是 Zookeeper 内置的功能,你只要调用 Zookeeper 的 API 就能实现。如调用 create 接口就可以很容易创建一个目录节点。
3.配置管理
    配置的管理在分布式应用环境中很常见,例如同一个应用系统需要多台 PC Server 运行,但是它们运行的应用系统的某些配置项是相同的,如果要修改这些相同的配置项,那么就必须同时修改每台运行这个应用系统的 PC Server,这样非常麻烦而且容易出错。
    像这样的配置信息完全可以交给 Zookeeper 来管理,将配置信息保存在 Zookeeper 的某个目录节点中,然后将所有需要修改的应用机器监控配置信息的状态,一旦配置信息发生变化,每台应用机器就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中。

4.集群管理
    Zookeeper 能够很容易的实现集群管理的功能,如有多台 Server 组成一个服务集群,那么必须要一个“总管”知道当前集群中每台机器的服务状态,一旦有机器不能提供服务,集群中其它集群必须知道,从而做出调整重新分配服务策略。同样当增加集群的服务能力时,就会增加一台或多台 Server,同样也必须让“总管”知道。
    Zookeeper 不仅能够帮你维护当前的集群中机器的服务状态,而且能够帮你选出一个“总管”,让这个总管来管理集群,这就是 Zookeeper 的另一个功能 Leader Election。
    它们的实现方式都是在 Zookeeper 上创建一个 EPHEMERAL 类型的目录节点,然后每个 Server 在它们创建目录节点的父目录节点上调用 getChildren(String path, boolean watch) 方法并设置 watch 为 true,由于是 EPHEMERAL 目录节点,当创建它的 Server 死去,这个目录节点也随之被删除,所以 Children 将会变化,这时 getChildren上的 Watch 将会被调用,所以其它 Server 就知道已经有某台 Server 死去了。新增 Server 也是同样的原理。
    Zookeeper 如何实现 Leader Election,也就是选出一个 Master Server。和前面的一样每台 Server 创建一个 EPHEMERAL 目录节点,不同的是它还是一个 SEQUENTIAL 目录节点,所以它是个 EPHEMERAL_SEQUENTIAL 目录节点。之所以它是 EPHEMERAL_SEQUENTIAL 目录节点,是因为我们可以给每台 Server 编号,我们可以选择当前是最小编号的 Server 为 Master,假如这个最小编号的 Server 死去,由于是 EPHEMERAL 节点,死去的 Server 对应的节点也被删除,所以当前的节点列表中又出现一个最小编号的节点,我们就选择这个节点为当前 Master。这样就实现了动态选择 Master,避免了传统意义上单 Master 容易出现单点故障的问题。

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

6.队列管理
Zookeeper 可以处理两种类型的队列:
    1.当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达,这种是同步队列。
    2.队列按照 FIFO 方式进行入队和出队操作,例如实现生产者和消费者模型。
同步队列用 Zookeeper 实现的实现思路如下:
    创建一个父目录 /synchronizing,每个成员都监控标志(Set Watch)位目录 /synchronizing/start 是否存在,然后每个成员都加入这个队列,加入队列的方式就是创建 /synchronizing/member_i 的临时目录节点,然后每个成员获取 / synchronizing 目录的所有目录节点,也就是 member_i。判断 i 的值是否已经是成员的个数,如果小于成员个数等待 /synchronizing/start 的出现,如果已经相等就创建 /synchronizing/start。用下面的流程图更容易理解:

-------------------------------------------------------------------------------------------------------------------------------

01.ZooKeeper安装和介绍的更多相关文章

  1. 01 Memcached 安装与介绍

      一:Memcached 介绍 ()官网网址:www.mamcached.org () 主要功能是:高性能,分布式的内存对象缓存系统. ()Nosql不仅仅是关系型数据库,显著特点key value ...

  2. maven(01)--安装及其介绍

    1:下载maven windows下载 2:将下载文件夹解压,然后放在一个安装目录(可任意选择),例如就放在D盘的根目录 然后在设置环境变量,新建一个环境变量,名称为M2_HOME,其设置值为mave ...

  3. Zookeeper系列一:Zookeeper介绍、Zookeeper安装配置、ZK Shell的使用

    https://www.cnblogs.com/leeSmall/p/9563547.html 一.Zookeeper介绍 1. 介绍Zookeeper之前先来介绍一下分布式 1.1 分布式主要是下面 ...

  4. 【ZooKeeper】ZooKeeper安装及简单操作

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

  5. zookeeper 安装的三种模式

    Zookeeper安装 zookeeper的安装分为三种模式:单机模式.集群模式和伪集群模式. 单机模式 首先,从Apache官网下载一个Zookeeper稳定版本,本次教程采用的是zookeeper ...

  6. Zookeeper安装以及配置说明(三)

    Zookeeper的安装和配置非常的简单,既可以配置成单机模式,也可以配置成集群模式.如下图所示: 下面将分别进行介绍: 单机模式 下载最新稳定版本zookeeper的安装包之后(看第一篇博文), 解 ...

  7. zookeeper安装与集群搭建

    此处以centos系统下zookeeper安装为例,详细步骤可参考官网文档:zookeeper教程 一.单节点部署 1.下载zookeeper wget http://mirrors.hust.edu ...

  8. Cloudera Manager (centos)安装详细介绍

    文章全部来自:Cloudera Manager (centos)安装详细介绍http://www.aboutyun.com/thread-9190-1-1.html(出处: about云开发) 这里已 ...

  9. Zookeeper安装和部署

    Zookeeper安装和部署:ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用 ...

随机推荐

  1. Graphics View框架

    Qt4.2开始引入了Graphics View框架用来取代Qt3中的Canvas模块,并在很多地方作了改进,Graphics View框架实现了模型-视图结构的图形管理,能对大量图元进行管理,支持碰撞 ...

  2. ubuntu apt-get方式安装与卸载

    在ubuntu终端中安装软件: 安装软件 apt-get install softname1 softname2 softname3……卸载软件 apt-get remove softname1 so ...

  3. <LeetCode OJ> 234. Palindrome Linked List

    Total Accepted: 40445 Total Submissions: 148124 Difficulty: Easy Given a singly linked list, determi ...

  4. Selenium - 设置元素等待

    一.sleep () 休眠方法   --time 固定等待 在开发自动化框架过程中,最忌讳使用Python自带模块的time的sleep方法进行等待,虽然可以自定义等待时间,但当网络条件良好时, 依旧 ...

  5. python模块之codecs: 自然语言编码转换

    python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理.    有一点需要清楚的是,当python要做编码转换的时候,会借助于内部 ...

  6. dp之多重背包hdu1059

    题意:价值为1,2,3,4,5,6. 分别有n[1],n[2],n[3],n[4],n[5],n[6]个.求能否找到满足价值刚好是所有的一半的方案. 思路:简单的多重背包,我建议多重背包都用二进制拆分 ...

  7. poj3693(后缀数组)

    http://poj.org/problem?id=3693 题意:给出一串字符,需要求这串字符中的最长重复子串,要是有多个,输出字典序最小的......... 我自己的一些想法:这个思路我一开始倒是 ...

  8. 悦铃文件必须是CCITT A_Law格式的,且没有被压缩

    最近在给公司弄来电彩铃,用的是电信的“悦铃”业务,办理过程不想多说了..给了我个网址和账号让我登录,登录界面惨不忍睹,感觉电信根本没有要宣传这项业务的意思,像是粗制滥造外包赶工做出来的.. 当然这不是 ...

  9. lua字符串对齐函数

    最近要用到字符串对齐,开始只是一部分字符串,就直接加空格了,后来发现有很多, 于是写了个字符串对齐的函数. --功能:分割字符串 --参数:带分割字符串,分隔符 --返回:字符串表 function ...

  10. JavaBeans 官方文档学习

    提示,重点:JavaBeans的Property和 Events:PropertyEditor极其注册和查找机制. 从目前来看,JavaBeans 更像是源自GUI的需求. 使用NetBeans新建一 ...