Zookeeper服务框架之介绍篇(一)
一、介绍
Zookeeper是一种分布式服务框架,是apache hadoop的子项目,完全开源存在,它的诞生主要用来处理分布式环境中数据管理问题,比如:分布式应用程序配置、集群管理、状态同步服务及命名服务等。其最新的版本下载可以从地址:http://hadoop.apache.org/zookeeper/ 中获取,并以java项目为例进行分析和使用Zookeeper。Zookeeper 作为 Hadoop 项目中的一个子项目,是 Hadoop 集群管理的一个必不可少的模块,它主要用来控制集群中的数据,如它管理 Hadoop 集群中的 NameNode,还有 Hbase 中 Master Election、Server 之间状态同步等。
本文介绍的 Zookeeper 的基本知识,以及介绍了几个典型的应用场景。这些都是 Zookeeper 的基本功能,最重要的是 Zoopkeeper 提供了一套很好的分布式集群管理的机制,就是它这种基于层次型的目录树的数据结构,并对树中的节点进行有效管理,从而可以设计出多种多样的分布式的数据管理模型,Zookeeper 的配置文件在 conf 目录下,这个目录下有 zoo_sample.cfg 和 log4j.properties,你需要做的就是将 zoo_sample.cfg 改名为 zoo.cfg,因为 Zookeeper 在启动时会找这个文件作为默认配置文件。下面详细介绍一下,这个配置文件中各个配置项的意义。
二、关于配置文件
1. 通用配置
tickTime=2000
这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间zookeeper服务就会发送一个心跳。
dataDir=D:/devtools/zookeeper-3.2.2/build
顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
clientPort=2181
这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
当这些配置项配置好后,你现在就可以启动 Zookeeper 了,启动后要检查 Zookeeper 是否已经在服务,可以通过 netstat – ano 命令查看是否有你配置的 clientPort 端口号在监听服务。
2. 集群模式
Zookeeper 不仅可以单机提供服务,同时也支持多机组成集群来提供服务。实际上 Zookeeper 还支持另外一种伪集群的方式,也就是可以在一台物理机上运行多个 Zookeeper 实例,下面将介绍集群模式的安装和配置。
Zookeeper 的集群模式的安装和配置也不是很复杂,所要做的就是增加几个配置项。集群模式除了上面的三个配置项还要增加下面几个配置项:
initLimit=5
这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 5个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
syncLimit=2
这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒
server.1=192.168.211.1:2888:3888
server.2=192.168.211.2:2888:3888
server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面就有一个数据就是 A 的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个 server。
三、zookeeper数据结构
Zookeeper 会维护一个具有层次关系的数据结构,它非常类似于一个标准的文件系统,Zookeeper本身提供和维护了一个有层次关系的数据结构,类似标准的文件系统,不同的是Zookeeper文件系统的每个节点znode,都可以存储数据,而znode目前有四种类型:临时节点、临时顺序编号节点、持久化节点及持久化顺序编号节点,那么接下来结合网络上的数据结构图说明:如图所示:

1. 特点说明:
A、每个znode节点,都可以拥有子节点,并且都可以存储数据(除了临时节点EPHEMERAL),注意 EPHEMERAL 类型的目录节点不能有子节点目录;
B、每个znode节点,都被它所在的路径唯一标注,比如:NameService下的Server1,被唯一的标识为:/NameService/Server1;
C、每个znode节点,都有版本的,也就是该节点的路径下,存放多份版本的数据;
D、每个znode节点,都可以自动编号,比如:已经存在App1节点,那么再创建App1节点时,会自动创建App2节点;
E、每个znode临时节点,当客户端与服务端断开链接后,znode也自动被删除;
F、每个znode节点都可以被监控,包含该节点存放的数据及其子目录结构或数据被修改时,会立即通知发起该设置的客户端;
G、客户端与服务端的链接为长链接,彼此间采用心跳方式保持通信,这个链接状态为session状态,所以如果某个znode节点为临时节点,那么这个session就不起作用了;
2. 如何使用
Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理,后面将会详细介绍 Zookeeper 能够解决的一些典型问题,这里先介绍一下,Zookeeper 的操作接口和简单使用示例。
3. 常用接口列表
客户端要连接 Zookeeper 服务器可以通过创建 org.apache.zookeeper. ZooKeeper 的一个实例对象,然后调用这个类提供的接口来和服务器交互。前面说了 ZooKeeper 主要是用来维护和监控一个目录节点树中存储的数据的状态,所有我们能够操作 ZooKeeper 的也和操作目录节点树大体一样,如创建一个目录节点,给某个目录节点设置数据,获取某个目录节点的所有子目录节点,给某个目录节点设置权限和监控这个目录节点的状态变化。
四、zookeeper工作特点

1. 原理说明:
A、Zookeeper服务核心是原子广播,它保证了各个参与的Server间同步,实现它协议为Zab协议,它分为恢复模式和广播模式。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和 leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。
B、Zookeeper服务持续监听所有注册的znode节点,一旦节点的结构、数据发生变化时,leader节点会监控到变化并更新系统状态值,所有follower和observer节点,会向leader节点的数据状态同步,这也是Zookeeper在分布式环境的核心作用;
C、所有的observer的znode节点,都可接收客户端的链接,也会从leader节点同步更新最新的数据版本,但其不参与leader的投票动作,会将客户端的写入数据请求转发给leader节点处理;
D、所有的follower的znode节点,都有资格参与leader的投票选择,也会自动从leader节点更新同步数据版本,也处理客户端的请求及返回结果;
2. 设计目的
A、原子性,各个znode节点数据只有更新成功或失败,没有中间状态;
B、可靠性,如果一条消息被一台服务器接收,那么其它各个服务器都会接收,保证了数据的一致性;
C、实时性,Zookeeper可保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到最新的数据,如果需要最新数据,应该在读取数据之前调用sync()接口,来手动获取最新的数据版本;
D、等待无关性,无效的或是阻塞的客户端链接,不影响其它任务客户端链接,各个链接客户端彼此独立链接;
E、一致性,客户端不论连接到哪个服务器上,展示给它都是同一个视图,这是Zookeeper最重要的性能。
五、zookeeper的集群安装
1. 下载地址:http://archive.apache.org/dist/zookeeper/ 我下载的是zookeeper-3.4.9.tar.gz版本。
2. 在/usr/local/ 创建文件夹zookeeper
mkdir zookeeper

3.上传文件到Linux上的/usr/local/source目录下

4. 解压tar.gz, 运行如下命令:
tar -zxvf zookeeper-3.4.9.tar.gz -C /usr/local/zookeeper

5. 修改配置文件
进入到cd /usr/local/zookeeper/zookeeper-3.4.9/conf/,重命名zoo_sample.cfg

修改zoo.cfg的配置文件如下:

在设置的dataDir中新建myid文件, 写入一个数字, 该数字表示这是第几号server. 该数字必须和zoo.cfg文件中的server.X中的X对应.

6. 将npfdev1机器上的zookeeper复制到npfdev2和npfdev3机器上。使用下面的命令:
scp -r /usr/local/zookeeper/zookeeper-3.4.9/ npfdev2:/usr/local/zookeeper/
scp -r /usr/local/zookeeper/zookeeper-3.4.9/ npfdev3:/usr/local/zookeeper/
7.更改npfdev2和npfdev3机器上的myid文件数字.
npfdev2的myid的数字:

npfdev3的myid的数字:

8. 启动zookeeper的服务
(1). 启动npfdev1上的zookeeper服务:

(2). 启动npfdev2上的zookeeper服务:

(3). 启动npfdev3上的zookeeper服务:

9. 查看zookeeper的状态
(1). 查看npfdev1上的zookeeper状态:

(2). 查看npfdev2上的zookeeper状态:

(3). 查看npfdev3上的zookeeper状态:

NOTE:
停止:zkServer.sh stop
重启:zkServer.sh restart
启动: zkServer.sh start
10. 将zookeeper的bin目录下加入到/etc/profile
这样做的好处:以后我们可以在任意目录下执行zookeeper的目录。
首先: vim /etc/profile
其次,在/etc/profile文件中加入:export PATH=$PATH:/usr/local/zookeeper/zookeeper-3.4.9/bin

检测是否可以启动:

参考文献:
1. http://www.voidcn.com/blog/u013400939/article/p-6209640.html
2. http://www.voidcn.com/blog/why_2012_gogo/article/p-6357189.html

浙公网安备 33010602011771号