一、安装ZooKeeper
1.上传压缩包文件
进入到/opt目录点击左上角的upload上传文件,如下
2.解压缩到指定文件
将jdk解压到/usr/local目录下:tar -zxvf jdk-11.0.15.1_linux-x64_bin.tar.gz -C /usr/local/
将zookeeper也解压缩到/usr/local目录下: tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz -C /usr/local
3.配置JDK环境 vim /etc/profile
在最后插入:export JAVA_HOME=/usr/local/jdk
export PATH=$PATH:$JAVA_HOME/bin
生效该环境变量:source /etc/profile
由于JDK解压时自带版本号,我没去修改,导致JDK配置出问题;
然后我进入/usr/local/jdk11版本,改成jdk后配置完成;如图
二.搭建ZooKeeper伪集群
1.进入zookeeper安装目录的conf目录修改文件
先修改名字:mv zoo_sample.cfg zoo.cfg
再修改文件:vim zoo.cfg
改为:dataDir=/usr/local/zookeeper/zkdata
dataLogDir=/usr/local/zookeeper/zklogs
2.创建数据持久化目录
mkdir /usr/local/zookeeper/zkdata
mkdir /usr/local/zookeeper/zklogs
3.在zookeeper的bin目录下:
启动zookeeper服务: ./zkServer.sh start
查看Zookeeper运行状态:./zkServer.sh status
此时出现Mode: standalone,该模式就是伪集群模式
三.搭建zookeeper集群
配置虚拟机的jdk环境
先进入到/usr/local目录下:
将第一个虚拟机的jdk文件传送到192.168.126.5主机的对应目录下: scp -r jdk 192.168.126.5:$PWD
将第一个虚拟机的zookeeper文件传送到192.168.126.5主机的对应目录下: scp -r zookeeper 192.168.126.5:$PWD
第三个虚拟机同样需要传jdk跟zookeeper文件,同理。
传递完jdk后配置jdk,与虚拟机一的配置相同,此时三台虚拟机都有jdk环境。
配置虚拟机的zookeeper环境
首先,进入到zookeeper目录的conf目录下,修改配置文件:vim zoo.cfg
因为原先配置过zkdata和zklogs文件
只需直接在2181下面添加:
server.1=192.168.126.4:2888:3888
server.2=192.168.126.5:2888:3888
server.3=192.168.126.6:2888:3888
将zoo.cfg配置文件传给其他俩台机器,此时我的还没有将zookeeper传给第三台机器,只需要将zookeeper文件传送到第三台机器即可。
此时为虚拟机与虚拟机之间的文件传送。
2.在工作目录中生成myid文件(即在zkdata目录下):
第一台虚拟机:echo 1 > myid
第二台虚拟机:echo 2 > myid
第三台虚拟机:echo 3 > myid
查看myid: cat myid
3.先查看防火墙是否已经关闭:firewall-cmd --state
若未关闭:systemctl stop firewalld.service
4.开启zookeeper服务:
进入到zookeeper的bin目录下执行:./zkServer.sh start
三台都启动后,执行:./zkServer.sh status
出现如下图即可(一个leader,俩个follower):
此时,已经完成虚拟机集群的搭建。
四、集群的服务管理
1.集群的服务管理可以使用脚本设置一键启动/一键停止
在bin目录下执行:vim zkstart.sh
添加如下脚本代码:
#!/bin/bash
# $# 启动脚本的携带参数个数
# -ne 不等于
if [ $# -ne 1 ];then
echo "无效参数,用法为[start|stop|status|restart]"
exit
fi
for host in 192.168.126.4 192.168.126.5 192.168.126.6
do
echo"=========== $host 正在 $1 ========="
#发送命令到目录机器
ssh $host "source /etc/profile; /usr/local/zookeeper/bin/zkServer.sh $1"
done
即一条命令,执行所有的服务器;
在脚本中设置传入的参数,只有为一个,否则报错;遍历发送命令到指定机器 ($1为传入的参数)。
在bin目录下执行:./zkstart.sh start
2.需要修改配置文件/etc/profile:vim /etc/profile
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
生效配置:source /etc/profile
然后即可不需要使用./
五、ZooKeeper的系统模型
1.数据模型
Zookeeper中的所有存储的数据是由znode组成的,节点也称为znode,并以key/value形式存储数据。
以树形结构存储:其中根路径以 / 开头。
以key/value形式存储数据。key就是znode的节点路径,比如/java,/server。
2.节点特性
Zookeeper节点是有生命周期的;可以分为4种:
持久节点是Zookeeper中最常见的一种节点类型,所谓持久节点,是指该数据节点被创建后,
就会一直存在于zookeeper服务器上,直到有删除操作来主动清除这个节点。
持久顺序节点与持久节点的节点类型是一致的。额外的特性是,在Zookeeper中,
每个父节点会为他的第一子节点维护一份时序,会记录每个子节点创建的先后顺序。
临时节点,该结点一个最重要的特性就是临时性。临时性是指,如果将节点创建未临时节点,那么该节点数据不会一直存储在Zookeeper服务器上。
临时节点的生命周期与客户端会话绑定。当客户端会话失效,那么这个节点就会被自动清除掉。且在临时节点下面不能创建子节点。
临时顺序节点,跟临时节点的基本特性一致,额外添加了顺序的特性。
3.通过执行zkCli.sh
,启动简易客户端程序。
创建ZK节点create /节点名 value值;创建时加-s为顺序节点,加-e为临时节点;不加参数默认为持久节点。
读取节点,ls显示该结点下面是否存在子节点;get获取该节点的value值。
ls /节点名;get /节点名
更新节点,set /节点名 data,即可修改(节点名就是path路径)。
删除节点,delete /节点名
4.节点数据信息
每个znode节点在存储数据的同时,都会维护一个叫做Stat的数据结构,里面存储了关于该结点的全部状态信息。
每个节点都有属于自己的状态信息,类似于身份证。
czxid表示该数据节点被创建时的事务ID
mzxid表示该节点最后一次被更新时的事务ID
pzxid表示该节点的子节点列表最后一次被修改时的事务ID
ctime表示该节点的创建时间
mtime表示该节点最后一次被更新的时间
version表示数据节点的版本号
cversion表示子节点的版本号
aversion表示节点的ACL版本号
ephemeralOwner表示创建该临时节点的会话SessionID,如果该节点是持久节点,那么这个属性值是0
dataLength数据内容的长度
numChildren表示当前节点的子节点个数
查看节点数据信息:stat /节点名
5.Watcher监听机制
ZooKeeper允许客户端向服务器注册一个Watcher监听,当服务端一些指定事件触发了这个Watcher,那么就会向指定客户端发送一个事件通知来实现分布式的通知功能。
监听节点变化:ls -w path
即节点发生变化时,就会触发watcher监听
监听节点值的变化:get -w path
即节点的值发生变化时,才会触发watcher监听
watcher监听机制只能使用一次,再次使用需要重新监听。
6.权限控制ACL
权限模式(Schema):
world 表示只有一个用户:anyone,代表所有人(默认)
ip 表示使用ip地址认证
auth表示使用已添加认证的用户认证
digest表示使用"用户:密码"方式认证
授权对象(ID),指的是权限赋予的用户或者一个实体。
IP通常是一个IP地址或是IP段,例如“192.168.126.4”
Digest,表示自定义,通常是"username:BASE64(SHA-1(username:password))"
World,表示只有一个ID:“anyone”
Super,与Digest模式一样
权限permission:
CREATE,可以创建子节点
DELETE,可以删除子节点(仅下一级节点)
READ,可以读取节点数据及显示子节点列表
WRITE,可以设置节点数据
ADMIN,可以设置节点访问控制列表权限
权限相关命令:
getAcl,读取ACL权限
setAcl,设置ACL权限
addauth,添加认证用户
创建默认的节点,权限模式为world,授权对象为anyone,权限为cdrwa.
设置ip方案:setAcl ip::,例如, setAcl /node ip:192.168.126.4:cdrwa;
即设置node节点操作的ip为192.168.126.4,权限为所有。
设置Auth方案:
create /node3 3
addauth digest zzx:123456
setAcl /node3 auth:zzx:cdrwa
即在添加认证的虚拟机上可以操作node3节点
设置Digest方案:
create /node4 4
退到程序外输出这一段,计算一个密文:echo -n zzx:123456 | openssl dgst -binary -sha1 | openssl base64
L6CiRBgTY39U8palHzyETbazeaQ=
setAcl /node4 digest:zzx:L6CiRBgTY39U8L6CiRBgTY39U8palHzyETbazeaQ=:cdrwa
addauth digest zzx:123456
然后即可读取/node的数据
总结:
1.Mobax连接虚拟机后,需要上传linux版的jdk和zookeeper的文件;安装完后,修改配置文件/etc/profile;
2.一台虚拟机启动多个zookeeper服务,即伪集群;而多台虚拟机分别启动多个zookeeper服务,即模拟集群。
3.集群服务管理是通过一个脚本执行多个指令,例如启动多台虚拟机的zookeeper服务。集群内的文件传送,可以通过scp指令。
4.zookeeper节点znode通过key/value形式进行存储,是一个树形结构;Watcher监听机制,监听节点或节点的值;权限控制ACL,设置节点的权限,由3种权限模式,授权对象有4种,权限有5种。