二、Zookeeper部署运行
2.1 伪集群安装
伪集群模式适合在开发和测试的环境下使用。
下载Zookeeper,并上传到Linux
注意:需要配置JDK环境支持。
解压zookeeper
tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz -C /usr/local #修改名称 mv apache-zookeeper-3.7.0-bin zookeeper
修改配置文件
进入zookeeper的安装目录的conf目录
cd conf #修改样式文件名称 mv zoo_sample.cfg zoo.cfg
修改zoo.cfg,配置zookeeper数据存放位置和日志存放位置。
创建数据持久化目录
mkdir /usr/local/zookeeper/zkdata mkdir /usr/local/zookeeper/zklogs
启动zookeeper服务
[root@localhost zookeeper]# ./bin/zkServer.sh start
查看Zookeeper运行状态
[root@localhost zookeeper]# ./bin/zkServer.sh status
关闭zookeeper
[root@localhost bin]# ./zkServer.sh stop
2.2集群安装
1.环境准备
注意在集群部署之前先删除zkdata和zklogs目录下的文件,这两个目录下的文件是在伪集群搭建的时候产生的。
服务器(纯净) 192.168.66.100
服务器(zk-1) 192.168.66.101
服务器(zk-2) 192.168.66.102
2.将纯净中的jdk传到zk-1和zk-2中
# 将纯净虚拟机的jdk传递到zk-1虚拟机,文件的位置和纯净的相同 scp -r jdk1.8/ 192.168.66.101:$PWD
3.分别为zk-1和zk-2两台虚拟机配置JDK环境。
#进入配置文件 vim /etc/profile #在配置文件添加如下配置 export JAVA_HOME=/usr/local/jdk1.8 export PATH=$PATH:$JAVA_HOME/bin #使配置文件生效 source /etc/profile #查看jdk是否配置成功 Java -version
4.修改纯净虚拟机的zookeeper的配置文件zoo.cfg
#进入配置文件 vim zoo.cfg #在配置文件中添加如下配置 dataDir=/usr/local/zookeeper/zkdata dataLogDir=/usr/local/zookeeper/zklogs clientPort=2181 server.1=192.168.66.100:2888:3888 server.2=192.168.66.101:2888:3888 server.3=192.168.66.102:2888:3888
5.将纯净中的zookeeper分发到zk-1和zk-2两台虚拟机。
scp -r zookeeper/ 192.168.66.101:$PWD scp -r zookeeper/ 192.168.66.102:$PWD
6.为三个虚拟机中的zookeeper分别设置ID
#在纯净虚拟机中的zookeeper下的zkdata目录下使用: echo 1 > myid #在zk-1虚拟机中的zookeeper下的zkdata目录下使用: echo 2 > myid #在zk-2虚拟机中的zookeeper下的zkdata目录下使用: echo 3 > myid
7.开启三个虚拟机的zookeeper服务
#先将三个虚拟机的防火墙关了 service firewalld stop #开启zookeeper服务(因为没有配置环境变量,因此在开启服务的时候要在bin下开启) [root@localhost bin]# ./zkServer.sh start #查看服务状态 [root@localhost bin]# ./zkServer.sh status
注意:
启动后,用jps应该能看到一个进程:QuorumPeerMain。光有进程不代表zk已经正常服务,需要用命令检查状态:bin/zkServer.sh status 能看到角色模式:为leader或follower,即正常了。
2.3 服务管理
脚本 | 说明 |
zkCleanup | 清理Zookeeper历史数据,包括事务日志文件和快照数据文件 |
zkCli | Zookeeper的简易客户端 |
zkEnv | 设置Zookeeper的环境变量 |
zkServer | Zookeeper服务器的启动、停止和重启脚本 |
配置环境变量(三台虚拟机都需要配置)
#打开配置文件 vim /etc/profile #在配置文件中添加如下配置 export ZOOKEEPER_HOME=/usr/local/zookeeper export PATH=$PATH:$ZOOKEEPER_HOME/bin #配置生效 source /etc/profile
这样在任何一个文件下使用zkServer.sh start 都能启动zookeeper服务。
创建一键启动/一键停止脚本
如果集群中存在很多的zookeeper服务的话,一个个开启或者是关闭的话无疑是非常麻烦的事情,因此我们可以使用一个脚本来管理全部的服务的开启和关闭。
#在zookeeper的bin下创建可执行文件 vim zkStart-all.sh #为文件添加权限 chmod +x zkStart-all.sh
#在配置文件添加如下配置 if [ $# -ne 1 ];then echo "无效参数,用法为: $1 {start|stop|restart|status}" exit fi #遍历所有节点 for host in 192.168.66.101 192.168.66.102 192.168.66.103 do echo "========== $host 正在 $1 ========= " #发送命令给目标机器 ssh $host "source /etc/profile; /usr/local/zookeeper/bin/zkServer.sh $1" done
#启动脚本 ./zkStart-all.sh start #查看集群中各个虚拟机的状态 ./zkStart-all.sh status #关闭全部zookeeper服务 ./zkStart-all.sh stop
三、Zookeeper系统模型
3.1 数据模型
在Zookeeper中,可以说 Zookeeper中的所有存储的数据是由znode组成的,节点也称为 znode,并以 key/value 形式存储数据。
树
介绍:
整体结构类似于 linux 文件系统的模式以树形结构存储。其中根路径以 / 开头。
保存数据
注意:
以 key/value 形式存储数据。key就是znode的节点路径,比如 /java , /server。value就是spring和192.168.66.100
3.2 节点类型及特性
ZooKeeper 节点是有生命周期的,这取决于节点的类型。节点类型可以分为持久节点、临时节点,以及时序节点,具体在节点创建过程中,一般是组合使用,可以生成以下 4 种节点类型:
持久节点
持久节点是zookeeper中最常见的一种节点类型。所谓持久节点,是指改数据节点被创建后,就会一直存在与zookeeper服务器上,直到有删除操作来主动清除这个节点。
/java spring
/zk zk-1
持久顺序节点
这类节点的基本特性和上面的节点类型是一致的。额外的特性是,在ZK中,每个父节点会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。
临时节点
- 从名称上可以看出该节点的一个最重要的特性就是临时性。
- 所谓临时性是指,如果将节点创建为临时节点,那么该节点数据不会一直存储在 ZooKeeper 服务器上。
区别:
和持久节点不同的是,临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。注意,这里提到的是会话失效,而非连接断开。另外,在临时节点下面不能创建子节点。
临时顺序节点
临时顺序节点的基本特性和临时节点是一致的,同样是在临时节点的基础上,添加了顺序的特性。
3.3 客户端命令行
#开启zookeeper集群 zkStart-all.sh start #进入纯净虚拟机的zookeeper文件系统 zkCli.sh #在根路径下创建持久节点java,节点存放的数据是spring [zk: localhost:2181(CONNECTED) 0] create /java spring #查看根目录下有哪些节点 [zk: localhost:2181(CONNECTED) 1] ls / [java, zookeeper] #获取Java节点的值 [zk: localhost:2181(CONNECTED) 2] get /java spring #修改Java节点的值为springmvc [zk: localhost:2181(CONNECTED) 3] set /java springmvc #删除Java节点 [zk: localhost:2181(CONNECTED) 5] delete /java
创建临时节点:create -e /java spring
创建持久型顺序节点:create -s /java spring
3.4 节点信息
节点的状态结构
每个节点都有属于自己的状态信息,这就很像每个人的身份信息一样。
#查看Java节点的信息 [zk: localhost:2181(CONNECTED) 8] stat /java cZxid = 0x500000005 ctime = Wed Jun 28 01:58:53 CST 2023 mZxid = 0x500000005 mtime = Wed Jun 28 01:58:53 CST 2023 pZxid = 0x500000005 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 6 numChildren = 0