Zookeeper集群搭建
一、Zookeeper原理与脚本启动

1、zkServer命令
./zkServer.sh start
./zkServer.sh status
检查是否启动zk:jps 查看是否有QorumPeerMain

2、zkCli.sh命令
help:查看所有命令
create /itcast 8000$
get /itcast
set /itcast xxx
ls /

3、zoo.cfg配置文件详解
tickTime=2000 //每个tickTime 时间 leader和follower之间发送一个心跳
dataDir=D:/devtools/zookeeper-3.2.2/build //存放数据目录
clientPort=2181 //应用客户端连接zk端口请求
initLimit=5 //leader接受新的follower初始化连接最大忍受的心跳个数, 例如5*2s=10s
syncLimit=2 //leader 与 follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒
server.1=192.168.211.1:2888:3888 //2888端口:服务器与集群中的Leader 服务器交换信息的端口
server.2=192.168.211.2:2888:3888 //3888端口:万一集群中的Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
二、集群配置
1添加一个zoo.cfg配置文件
$ZOOKEEPER/conf
mv zoo_sample.cfg zoo.cfg
2修改配置文件(zoo.cfg)
dataDir=/itcast/zookeeper-3.4.5/data
server.1=192.168.186.128:2888:3888
server.2=192.168.186.129:2888:3888
server.3=192.168.186.130:2888:3888
3在(dataDir=/itcast/zookeeper-3.4.5/data)创建一个myid文件,里面内容是server.N中的N(server.2里面内容为2)
echo "1" > myid 指定对应上述server的id号
4将配置好的zk拷贝到其他节点
scp -r /itcast/zookeeper-3.4.5/ root@192.168.186.129:/itcast/
scp -r /itcast/zookeeper-3.4.5/ root@192.168.186.130:/itcast/
5注意:在其他节点上一定要修改myid的内容
在itcast06应该讲myid的内容改为6 (echo "2" > myid)
在itcast07应该讲myid的内容改为7 (echo "3" > myid)
a、演示三台机器,1台机器启动后zk的状态,2台启动后的状态,3台启动的状态
1台启动,需等待其他2台

2台启动


超过半数即可
b、演示leader机器宕机,其余follow节点自动选举成为leader节点,leader节点重启后,自动变成follow节点

注意:如果不起来,先启用./zkCli.sh,再使用./zkServer.sh status
实验演示:当修改follower节点,数据也会自动同步
三、Znode数据结构介绍

1. 唯一标识:每个子目录项如NameService 都被称作为 znode,这个 znode 是被它所在的路径唯一标识,如 Server1 这个 znode 的标识为 /NameService/Server1
2. 支持子节点:znode 可以有子节点目录,并且每个 znode 可以存储数据,注意 EPHEMERAL 类型的目录节点不能有子节点目录
3. znode 具有版本号:每个 znode 中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据
4. znode 支持临时节点特性:一旦创建这个 znode 的客户端与服务器失去联系,这个 znode 也将自动删除,Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个连接状态称为 session,如果 znode 是临时节点,这个 session 失效,znode 也就删除了
5. znode 的目录名自动递增编号:如 App1 已经存在,再创建的话,将会自动命名为 App2
6. znode 可被监控:包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是 Zookeeper 的核心特性,Zookeeper 的很多功能都是基于这个特性实现的。
四、Zookper集群管理应用

/GoupMembers:EPHEMERAL临时节点
/client1: EPHEMERAL_SEQUENTIA节点
/client2: EPHEMERAL_SEQUENTIA节点
1、所有client,监听getChildren(String path, boolean watch)
这里监听 /GroupMembers目录,当任一客户端挂了后,这个目录节点也自动删除,其他server都知道某台sever挂了。
2、ZK如何实现Leader选举的
给每台Server编号,我们可以选择当前是最小编号的Server为Master,假如这个最小编号的Server死去,由于是EPHEMERAL节点,死去的Server对应的节点也被删除,所以当前的节点列表中又出现一个最小编号的节点,我们就选择这个节点为当前Master。这样就实现了动态选择Master,避免了传统意义上单Master容易出现单点故障的问题
五、Zookeeper分布式锁应用
共享锁在同一个进程中很容易实现,但是在跨进程或者在不同 Server 之间就不好实现了。Zookeeper 却很容易实现这个功能,实现方式也是需要获得锁的 Server 创建一个 EPHEMERAL_SEQUENTIAL 目录节点,然后调用 getChildren方法获取当前的目录节点列表中最小的目录节点是不是就是自己创建的目录节点,如果正是自己创建的,那么它就获得了这个锁,如果不是那么它就调用 exists(String path, boolean watch) 方法并监控 Zookeeper 上目录节点列表的变化,一直到自己创建的节点是列表中最小编号的目录节点,从而获得锁,释放锁很简单,只要删除前面它自己所创建的目录节点就行了。



【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix