操作系统:center os 7
软件:jdk8、zookeepe-3.5.5
jdk安装、关闭防火墙:https://blog.csdn.net/DavidSoCool/article/details/93491850
zookeeper下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.5.5/
设置虚拟机静态ip:https://blog.csdn.net/DavidSoCool/article/details/93616279
准备开始部署
# 进入到安装目录
cd /usr/local
#上传压缩包
rz
#然后选中下载的压缩包
#解压
tar zxvf apache-zookeeper-3.5.5-bin.tar.gz
查看
开始配置集群服务
#进入配置文件夹目录
cd apache-zookeeper-3.5.5-bin/conf/
#复制一份自带的配置文件,改名为zoo.cfg,启动默认使用这个配置文件
cp zoo_sample.cfg zoo.cfg
查看
#编辑文件zoo.cfg
vi zoo.cfg
红框中都是新增或修改的地方,需要在dataDir所指向的位置修改为加压的zookeeper路径,在创建一个data文件夹,若不创建就以zookeeper文件夹为data;还有DataLogDir所指向的地方创建一个logs文件夹,这个文件夹不创建也可以,启动后会自动创建;
其中server.1、2、3所指的是集群所在的服务器地址,包括本机有3台,server. 后面的数字标识只要不重复就行,所对应的数字要在data中创建一个名叫myid的文件把数字写到里面(dataDir不创建的在zookeeper问价夹下创建myid文件)。本机的ip是192.168.50.132 所对应的是server.1,所以myid中需要输入1;
ip后面的2888是zk同步数据的端口号,3888是选举出leader的通信端口号,
在dataDir所指向的位置创建一个 myid的文件
#进入文件夹
cd /usr/local/apache-zookeeper-3.5.5-bin/
#创建data文件夹和logs文件夹
mkdir data
mkdir logs
查看
启动后进入logs可以查看日志输出和报错信息,命令如下
#查看日志
tail -f zookeeper-root-server-localhost.localdomain.out
#进入data文件夹创建myid文件,并编辑内容
cd data
vi myid
#在文件中输入1然后保存退出
查看myid内容
.pid 文件是启动后生成的
配置环境变量,否则无法直接用 zkServer.sh start 启动服务:
vi /etc/profile
#加入java和zookeeper的
# java
export JAVA_HOME=/usr/lib/jvm/java
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar
export PATH=$PATH:$JAVA_HOME/bin
# zookeeper
export ZOOKEEPER_HOME=/usr/local/apache-zookeeper-3.5.5-bin
export PATH=$PATH:$ZOOKEEPER_HOME/bin
第一台zk服务就配置好了,其他2台同理;
第二台机器就把myid改为2,机器端口就对应server.2=当前机器ip:2888:3888
第三台机器就把myid改为3,机器端口就对应server.3=当前机器ip:2888:3888
进入bin目录,分别启动三台机器
#启动命令
zkServer.sh start
进入logs目录,查看日志输出
第一个红框中的myid=1就是我们配的第一台机器data文件夹中的myid文件对应内容;
第二个红框是报错信息,原因是防火墙没有关闭,关闭防火墙:https://blog.csdn.net/DavidSoCool/article/details/93491850
官网参考文档:http://zookeeper.apache.org/doc/r3.5.5/
当第二台机器启动后就会开始leader选举,集群服务会通过socket进行通信,服务之间会把自己的epoch、zxid、myid发送到其他服务,当其他服务收到票据后会进行对比,根据定好的规则选举出leader;leader选举出来机器会负责事务操作(比如create,set,delete)和非事务操作(get),非leader机器负责非事务操作(get),如果非leader机器收到了事务操作就会转发给leader,比如第一台机器当选了leader,就会负责增删改事务操作,还有查非事务操作,非leader负责查非事务操作,同时leader还会把事务操作的数据同步到非leader,比如现在有3台机器,leader收到事务操作后会把数据在本机器上执行,然后在发送到其他2台非leader机器,只有过半的机器把数据保存同步成功就算这个事务操作成功了,过半的机器是包含leader机器的,也就是leader保存成功后在发送到第二胎机器,第二胎机器也保存成功就算这个事务操作执行成功了,3台机器有2台就算成功。
选举获胜的条件为:
1、先去比较epoch
2、比较zxid,zxid大的为leader
3、比较myid,最大的为leader
不管选举是否成功,epoch会更新自增,每一轮选举都会改变。
启动客户端
# 进入bin目录,连接客户端 后面是目标ip地址
zkCli.sh -server 127.0.0.1:2181
打开参考文档的快速入门,开始创建节点,提示需要以右斜杠开头
查看目录,zookeeper是默认存在的
如果想在register下面创建一个叫note的节点,路径比需是完整的,例如:/register/note
在创建register提示已存在,同一个路径下的节点名字不能重复
创建一个节点note2,后面加个 -e 就是临时节点,当创建这个临时节点的服务断开时,临时节点就会被删除。
设置/register/note节点值为666666
重新设置值为123456
*************** get 监听节点 *************
先在2号机上监听/register/note节点 get 加-w是监听节点,监听的节点有修改、删除都会触发回调通知,不过回调只会触发一次,若想继续获取需要再次设置监听。
然后在1号机上修改节点的值为888
2号机输出,节点改变
2号机重新监听note,1号机执行删除note
2号机输出,提示节点删除
重新创建note节点,2号机继续设置监听,然后1号机在该节点下创建一个noteCli、修改、删除
2号机无输出,说明get监听不能监听该节点的子节点变化
*************** ls 监听节点 ***************
这次在2号机的/register下创建一个note2,并用ls命令监听,同样回调只会触发一次,若想继续获取需要再次设置监听
在1号机上set /register/note2 值为333
查看2号机无输出
在1号机上delete/register/note2
查看2号机输出节点删除
再次创建note2并监听,然后去1号机在note2节点下新增一个noteCli
2号机输出监听节点的子节点发生改变
重新设置监听note2,并尝试set /register/note2/noteCli 值为123
查看2号机无输出
尝试delete /register/note2/noteCli 节点
查看2号机输出监听节点的子节点发生改变,
***************** 现在总结一下get和ls监听的不同 ********************
首先要确定的:监听的节点必须存在
get -w:监听当前节点的set和delete,对子节点变化无法触发回调通知
ls -w:监听当前节点的delete,对子节点的create、delete变化有回调通知
用ls -s查看2个节点的详细信息
临时节点与非临时节点的区别在于多了一个ephemeraOwner连接会话信息,当创建这个临时节点的服务断开时,临时节点就会被删除。利用这个特性我们可以用来做分布式服务管理,当多个服务启动并同时连接到zk服务,以服务的ip端口为节点名创建临时节点,若是服务挂了节点就会自动删除,我们再监听当前节点的变化,通过回调事件去动态的获取服务列表。
***************** 设置zookeeper开机启动 *****************
#进入目录
cd /etc/rc.d/init.d
#创建zookeeper文件
touch zookeeper
#文件授权
chmod +x zookeeper
#编辑文件
vim zookeeper
#粘贴下面代码到文件中,注意!!粘贴进去的内容是否完整!!本人粘贴了几次开头都是有缺失!!
#!/bin/bash
#chkconfig:2345 20 90
#description:zookeeper
#processname:zookeeper
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64
case $1 in
start) su root /usr/local/apache-zookeeper-3.5.5-bin/bin/zkServer.sh start;;
stop) su root /usr/local/apache-zookeeper-3.5.5-bin/bin/zkServer.sh stop;;
status) su root /usr/local/apache-zookeeper-3.5.5-bin/bin/zkServer.sh status;;
restart) su /usr/local/apache-zookeeper-3.5.5-bin/bin/zkServer.sh restart;;
*) echo "require start|stop|status|restart";;
esac
#保存退出后把文件加入到启动列表
chkconfig --add zookeeper
#查看启动列表
chkconfig --list
配置完后可以重启虚拟机,然后输入命令查看zookeeper是否成功启动
ps -ef|grep zookeeper