Zookeeper高级教程 | 袁庭新老师带你快速搭建Zookeeper集群项目实战
Zookeeper是一个开源的分布式应用程序协调服务,它可以提供高可用性、可靠性和数据一致性。在分布式系统中,Zookeeper常被用作协调服务来管理集群节点之间的状态,配置信息,以及各种元数据信息。

为了搭建一个高可用的程序,我们需要对Zookeeper进行集群操作。这样当单个Zookeeper节点出现故障或宕机时,集群中的其他节点可以接替其职责并继续提供服务。这对于一些需要24/7不间断运行的服务非常重要,例如金融交易所、在线游戏等。下面就请大家跟着袁老师的节奏,来完成一个Zookeeper集群环境的搭建吧。
01 Zookeeper集群环境搭建
1.1 产品特点分布式安装部署
Zookeeper集群思路:先配置一台Zookeeper服务器,再克隆出两台,最终形成Zookeeper集群。分布式环境搭建之前,需要先安装Zookeeper。Zookeeper的安装请参考袁老师往期所发送的文章。
1.2 产品特点配置服务器编号
在/opt/zookeeper/zkData目录下新建myid文件。
在文件中添加与server对应的编号:1;其余两台服务器将来分别配置为2和3。
1.3 产品特点配置zoo.cfg文件
打开conf目录下的zoo.cfg文件,增加如下配置。
配置参数解读server.A=B:C:D。

1.4 产品特点配置其余两台服务器
在虚拟机数据目录vms下(vms存放虚拟机的目录),创建zk02文件夹。
进入zk02系统后,修改Linux中的IP的配置。使用root用户打开/etc/sysconfig/network-scripts/ifcfg-eno160文件(文件名不一定是这个),添加内容如下:
配置文件生效,使用命令使得配置文件生效:
修改zko2系统的/opt/zookeeper/zkData/myid中的数值为2。
第三台服务器zk03,重复上面的步骤。将zk03系统的IP设置为192.168.230.133,并修改myid文件中的数值为3。
1.5 产品特点集群操作
关闭每台Zookeeper服务器的防火墙。
关于防火墙的操作常见命令见下:
systemctl stop firewalld.service:停止firewall,只是临时关闭了防火墙,当重启操作系统后,防火墙服务还是会再次启动
systemctl disable firewalld:禁止firewall开机启动(禁用防火墙服务)。
查看防火墙状态。
启动第1台Zookeeper服务器。
查看Zookeeper状态。
注意:因为没有超过半数以上的服务器被启动,所以第一台服务器启动后查看服务状态,发现集群失败 (如果防火墙没有关闭,也会导致集群失败)。
使用同样的方式启动第2台和第3台Zookeeper服务器。
查看第1台的状态:Mode: follower
查看第2台的状态:Mode: leader
查看第3台的状态:Mode: follower
02 ZK客户端命令行操作
2.1 产品特点客户端命令
启动客户端。
显示所有操作命令。
查看当前ZNode中所包含的内容。
查看当前节点详细数据。
当前节点参数的介绍见下:

2.2 点节点操作
在根目录下,创建中国和美国两个节点。
在根目录下,创建俄罗斯节点,并保存“普京”数据到节点上。
获得节点的值。
多级创建节点。在日本节点下,创建东京节点并保存数据“热”。jp必须提前创建好,否则将报错“节点不存在”。
创建短暂节点。短暂节点创建成功后, 使用quit命令退出客户端,然后再重新连接到客户端,发现短暂节点自动消失。
创建带序号的节点。
在中国cn下,创建3个city顺序编号的节点。
如果原来没有序号节点,序号从0开始递增。
如果原节点下已有2个节点,则再排序时从2开始,以此类推。
修改节点数据值。
2.3 节点监听
监听节点的值变化或子节点变化(路径变化)。
1.在server3主机上注册监听/us节点的数据变化。
2.在Server1主机上修改/us的数据。
3.Server3会立刻响应。
4.如果在Server1的/us下面创建子节点NewYork。
5.Server3会立刻响应。
2.4 删除节点
1.删除节点。
2.递归删除节点(非空节点,节点下有子节点)。
说明:不仅删除/cn,而且/cn下的所有子节点也随之删除。
03 Zookeeper集群实战
3.1 项目环境搭建
1.使用IDEA创建一个项目名称为【test_zookeeper】的Maven工程。

2.在项目的pom.xml文件中添加依赖。
3.在resources下创建log4j.properties。
3.2 创建Zookeeper客户端
在项目的src/test/java目录下创建com.cy.test包,并在该包下创建ZooKeeperTests测试类。
3.3 创建节点
3.3.1 ACL对象介绍
一个ACL对象就是一个Id和permission对。
1.表示哪个/哪些范围的Id(Who)在通过了怎样的鉴权(How)之后,就允许进行那些操作(What)。即Who How What。
2.permission(What)就是一个int表示的位码,每一位代表一个对应操作的允许状态。
3.类似Linux的文件权限,不同的是共有5种操作:CREATE、READ、WRITE、DELETE、ADMIN(对应更改ACL的权限)。
对于ACL的参数详细介绍见下表:

3.3.2 创建节点实现
在ZooKeeperTests测试类中添加创建节点的createNode()方法。
运行createNode()方法将看到如下的日志输入。
3.3.3 Session超时异常
如果createNode()方法在运行的时候出现异常,抛出ClientCnxn$SessionTimeoutException类型错误。
针对Session超时异常问题,解决方案见下:
增加连接时间
检查集群IP是否编写正确
关闭防火墙:systemctl stop firewalld
3.4 查询节点的值
在ZooKeeperTests测试类中添加查询节点的值find()方法。
3.5 ZK节点增删改查操作
1.更新节点操作。在ZooKeeperTests测试类中添加更新节点的值update()方法。
2.删除节点。在ZooKeeperTests测试类中添加删除节点的delete()方法。
3.获取子节点。在ZooKeeperTests测试类中添加获取子节点的getChildNodes()方法。
4.监听子节点的变化。在ZooKeeperTests测试类中添加监听子节点变化的listenChildNodes()方法。
运行listenChildNodes()方法后,程序在运行的过程中,去zk01节点的Zookeeper的根目录下,创建"/yuanxin"子节点。
一旦监听到子节点的变化,在IDEA控制台将打印process()方法的内容。
5.判断Znode是否存在。在ZooKeeperTests测试类中添加判断子节点是否存在的exist()方法。
04 回顾总结
今天袁老师主要是带大家搭建了Zookeeper集群开发环境,以及集群环境下命令行的相关操作。然后我们又学习了Zookeeper的常用API,主要学习了通过API来创建节点、查询节点、修改节点、删除节点、获取子节点、监听子节点等相关的内容。
今天的内容就给大家介绍到这里了,现在你学会了吗?关注「袁庭新」,干货天天都不断!
