一、基本概念
1.1 集群⻆⾊
Zookeeper集群中的所有机器通过Leader选举来选定⼀台被称为Leader的机器, Leader服务器为客户端提供读和写服务,除Leader外,其他机器包括Follower和Observer。Follower和Observer都能提供读服务,唯⼀的区别在于Observer不参与Leader选举过程,不参与写操作的过半写成功策略,因此Observer可以在不影响写性能的情况下提升集群的性能。
1.2 会话(session)
Session指客户端会话, ⼀个客户端连接是指客户端和服务端之间的⼀个TCP⻓连接, Zookeeper对外的服务端⼝默认为2181,客户端启动的时候,⾸先会与服务器建⽴⼀个TCP连接,从第⼀次连接建⽴开始,客户端会话的⽣命周期也开始了,通过这个连接,客户端能够⼼跳检测与服务器保持有效的会话,也能够向Zookeeper服务器发送请求并接受响应,同时还能够通过该连接接受来⾃服务器的Watch事件通知。
1.3 数据节点(Znode)
在ZooKeeper中, “节点”分为两类,第⼀类同样是指构成集群的机器,我们称之为机器节点;第⼆类则是指数据模型中的数据单元,我们称之为数据节点——ZNode。 ZooKeeper将所有数据存储在内存中,数据模型是⼀棵树(ZNode Tree),由斜杠(/)进⾏分割的路径,就是⼀个Znode,例如/app/path1。每个ZNode上都会保存⾃⼰的数据内容,同时还会保存⼀系列属性信息。
1.4 版本
Zookeeper的每个Znode上都会存储数据,对于每个ZNode, Zookeeper都会为其维护⼀个叫作Stat的数据结构, Stat记录了这个ZNode的三个数据版本,分别是version(当前ZNode的版本)、 cversion(当前ZNode⼦节点的版本)、 aversion(当前ZNode的ACL版本)。
1.5 Watcher(事件监听器)
Zookeeper允许⽤户在指定节点上注册⼀些Watcher,并且在⼀些特定事件触发的时候, Zookeeper服务端会将事件通知到感兴趣的客户端,该机制是Zookeeper实现分布式协调服务的重要特性。
1.6 ACL
Zookeeper采⽤ACL(Access Control Lists)策略来进⾏权限控制,其定义了如下五种权限:
●CREATE:创建⼦节点的权限。
●READ:获取节点数据和⼦节点列表的权限。
●WRITE:更新节点数据的权限。
●DELETE:删除⼦节点的权限。
●ADMIN:设置节点ACL的权限。
其中, CREATE和DELETE这两种权限都是针对⼦节点的权限控制。
二、Zookeeper环境搭建
2.1 Zookeeper的搭建⽅式
Zookeeper安装⽅式有三种,单机模式和集群模式以及伪集群模式。
●单机模式: Zookeeper只运⾏在⼀台服务器上,适合测试环境;
●集群模式: Zookeeper运⾏于⼀个集群上,适合⽣产环境,这个计算机集群被称为⼀个“集合体”;
●伪集群模式:就是在⼀台服务器上运⾏多个Zookeeper。
2.2 单机搭建
- 下载
下载稳定版本的zookeeper http://zookeeper.apache.org/releases.html - 上传
下载完成后,将zookeeper压缩包上传到linux系统 - 解压缩压缩包
#解压到当前目录下
tar -zxvf zookeeper-3.4.14.tar.gz
#解压到目标目录下
tar -zxvf zookeeper-3.4.14.tar.gz -C 目标目录
- 进⼊ zookeeper-3.4.14 ⽬录,创建 data ⽂件夹
cd zookeeper-3.4.14
mkdir data
- 修改配置⽂件名称
cd conf
mv zoo_sample.cfg zoo.cfg
- 修改zoo.cfg中的data属性
dataDir=/root/zookeeper-3.4.14/data
- zookeeper服务启动
进⼊bin⽬录,启动服务输⼊命令
./zkServer.sh start
输出以下内容表示启动成功

关闭服务输⼊命令
./zkServer.sh stop
输出以下提示信息

查看状态
./zkServer.sh status
如果启动状态,提示:

如果未启动状态,提示:

2.3 伪集群模式
单台机器上运⾏多个Zookeeper实例,这种情况下,必须保证每个配置⽂档的各个端⼝号不能冲突,除clientPort不同之外, dataDir也不同。另外,还要在dataDir所对应的⽬录中创建myid⽂件来指定对应的Zookeeper服务器实例。
●clientPort端⼝:
如果在1台机器上部署多个server,那么每台机器都要不同的 clientPort,⽐如 server1是2181,server2是2182, server3是2183;
●dataDir和dataLogDir:
dataDir和dataLogDir也需要区分下,将数据⽂件和⽇志⽂件分开存放,同时每个server的这两变量所对应的路径都是不同的;
●server.X和myid:
server.X 这个数字就是对应, data/myid中的数字。在3个server的myid⽂件中分别写⼊了1, 2, 3,那么每个server中的zoo.cfg都配 server.1 server.2,server.3就⾏了。因为在同⼀台机器上,后⾯连着的2个端⼝, 3个server都不要⼀样,否则端⼝冲突。
- 下载
下载稳定版本的zookeeper http://zookeeper.apache.org/releases.html - 上传
下载完成后,将zookeeper压缩包上传到linux系统 - 解压压缩包
mkdir zkcluster
tar -zxvf zookeeper-3.4.14.tar.gz -C /zkcluster
- 改名并复制
mv zookeeper-3.4.14 zookeeper01
cp -r zookeeper01/ zookeeper02
cp -r zookeeper01/ zookeeper03
- 分别在zookeeper01、 zookeeper02、 zookeeper03⽬录下创建data及logs⽬录
mkdir data
cd data
mkdir logs
- 修改配置⽂件名称
cd conf
mv zoo_sample.cfg zoo.cfg
- 配置每⼀个Zookeeper 的dataDir(zoo.cfg) clientPort 分别为2181 2182 2183
clientPort=2181
dataDir=/zkcluster/zookeeper01/data
dataLogDir=/zkcluster/zookeeper01/data/logs
- 配置集群
(1)在每个zookeeper的 data ⽬录下创建⼀个 myid ⽂件,内容分别是1、 2、 3 。这个⽂件就是记录每个服务器的ID
touch myid
(2)在每⼀个zookeeper 的 zoo.cfg配置客户端访问端⼝(clientPort)和集群服务器IP列表。
server.1=10.211.55.4:2881:3881
server.2=10.211.55.4:2882:3882
server.3=10.211.55.4:2883:3883
#server.服务器ID=服务器IP地址:服务器之间通信端⼝:服务器之间投票选举端⼝
- 启动集群
依次启动三个zk实例