一、单机版
我们这里都是在Linux系统中搭建环境
1.1、安装JDK
JDK安装请参考一文搞定Linux常见用法中第八部分
1.2、安装ZooKeeper
1、上传安装包
使用rz
命令,将从zk官网下载的压缩包上传至temp目录(这里使用的3.6版本)
[root@localhost temp]# rz
[root@localhost temp]# ll
-rw-r--r--. 1 root root 12392394 3月 31 06:49 apache-zookeeper-3.6.0-bin.tar.gz
2、解压
1)解压:使用命令tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz -C /usr/local/
,将zookeeper解压到/usr/local/
目录下
2)重命名:mv apache-zookeeper-3.6.0-bin/ zookeeper
3、配置文件处理
ZooKeeper 启动时默认的去 conf 目录下读取zoo.cfg
配置文件,但是这个文件其实不存在,只有一个zoo_sample.cfg参考文件,所以我们先要使用 cp zoo_sample.cfg zoo.cfg
复制一份实际配置
-rw-r--r--. 1 1000 mysql 535 2月 25 14:36 configuration.xsl
-rw-r--r--. 1 1000 mysql 3435 2月 25 14:36 log4j.properties
-rw-r--r--. 1 root root 1148 6月 7 02:19 zoo.cfg
-rw-r--r--. 1 1000 mysql 1148 2月 25 14:36 zoo_sample.cfg
4、创建数据缓存目录
为了方便缓存数据管理,我们在zookeeper目录下执行mkdir data
,创建data文件夹
并且将zoo.cfg
中缓存数据目录修改为dataDir=/usr/local/zookeeper/data
5、启动服务
进入到bin
目录下,执行./zkServer.sh start
命令
[root@localhost bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
使用./zkServer.sh status
可查看服务状态,默认端口为2181
,Mode:standalone
表示为单机模式
[root@localhost bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: standalone
停止服务使用./zkServer.sh stop
1.3、客户端连接ZooKeeper
在bin目录下,执行./zkCli.sh -server ip:port
命令,ip和port分布为需要连接的zk服务的地址和端口。如果只是连接本机zk,且使用的默认端口2181,则使用./zkCli.sh
即可。连接成功后会进入到客户端模式,Crtl + C
可退出
省略....
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: 192.168.xx.xxx:2181(CONNECTED) 0]
二、集群版
2.1、角色概念
ZooKeeper 集群中的角色主要有三类:领导者(Leaner)、跟随者(Follower)和观察者(ObServer),后两者也叫学习者(Learner)
角色类型 | 角色描述 |
---|---|
领导者(Leaner) | 领导者负责进行投票的发起和决议,更新系统状态 |
跟随者(Follower) | 跟随者负责接收客户端请求并返回结果,在选举过程中参与投票 |
观察者(ObServer) | 观察者负责接收客户端连接,并将写请求转发给领导者节点。它不参与投票,只同步领导者的状态。其作用是为扩展系统,提高读的速度 |
2.2、集群搭建
zk集群最小安装需要3个节点,我们这里搭建伪集群(伪集群简单理解就是在一个Linux环境中创建多个zk服务,实际生产环境中我们肯定使用真实集群)
1、新建目录
在/usr/local
目录下mkdir zookeepercluster
创建一个目录,方便管理3个zk服务
2、创建3个zk服务
按照之前单机版的安装方式,在zookeepercluster目录下分别创建zookeeper01、zookeeper02、zookeeper03
解压:tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz -C /usr/local/zookeepercluster/
重命名:mv apache-zookeeper-3.6.0-bin/ zookeeper01
复制:cp -r zookeeper01/ zookeeper02
、cp -r zookeeper01/ zookeeper03
[root@localhost zookeepercluster]# ll
drwxr-xr-x. 8 root root 157 6月 7 04:19 zookeeper01
drwxr-xr-x. 8 root root 157 6月 7 04:19 zookeeper02
drwxr-xr-x. 8 root root 157 6月 7 04:19 zookeeper03
然后再分别复制zoo.cfg
和创建data目录
3、dataDir配置修改
改为指定路径,如zookeeper01
dataDir=/usr/local/zookeepercluster/zookeeper01/data
4、提供应用唯一标识
在 zk 集群中需要为每个节点创建一个唯一标识(自然数),就是在我们之前创建的data/目录中创建一个myid 文件
,并写入一个1或2的自然数(只要数字不同就行),那我们在zookeepercluster目录下执行如下命令,分别为3个节点创建1、2、3三个唯一标识
[root@localhost zookeepercluster]# echo 1 >> zookeeper01/data/myid
[root@localhost zookeepercluster]# echo 2 >> zookeeper02/data/myid
[root@localhost zookeepercluster]# echo 3 >> zookeeper03/data/myid
5、增加集群配置
zk集群除了本身客户端监听端口外,还需要使用投票端口和选举端口,我们这里如下分配
客户端监听端口
分别为:2181、2182、2183
投票端口
分别为:2184、2185、2186
选举端口
分别为:2187、2188、2189
然后在每个zk的zoo.cfg中修改对应clientPort
,再加上如下配置即可(ip要改)
server.1=ip:2184:2187
server.2=ip:2185:2188
server.3=ip:2186:2189
server.
后面的数字指myid
2.3、服务启停
方式一:
每个节点执行./zkServer.sh start
即可
方式二:
创建startall.sh
和stopall.sh
启停脚本,内容分别如下
zookeeper01/bin/zkServer.sh start
zookeeper02/bin/zkServer.sh start
zookeeper03/bin/zkServer.sh start
zookeeper01/bin/zkServer.sh stop
zookeeper02/bin/zkServer.sh stop
zookeeper03/bin/zkServer.sh stop
对两个脚本授权:
chmod 777 st*
(777 表示文件可读可写可执行)
启动服务(记得先停掉之前单机版2181端口服务,避免端口冲突)
[root@localhost zookeepercluster]# ./startall.sh
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeepercluster/zookeeper01/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeepercluster/zookeeper02/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeepercluster/zookeeper03/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
2.4、客户端连接
在任意一个zk节点的bin目录下,执行./zkCli.sh -server ip:port
命令即可