目录
ZooKeeper概念
ZooKeeper是开放代码的分布式协调服务框架,是一个为分布式应用提供一致性服务的组件。ZooKeeper允许开发人员专注于核心应用程序逻辑,而不必担心应用程序的分布式特性。
ZooKeeper集群安装
假设ZooKeeper集群中共有5个ZooKeeper Server节点,其中一个Server节点充当ZooKeeper集群的Leader,其他两个Server节点充当ZooKeeper集群的Follower,剩下的两个Server节点充当Zookeeper集群的Observer。
1、上传Zookeeper安装包到linux服务器,解压
2、创建配置文件进入ZooKeeper解压目录,进入ZooKeeper目录下的conf目录,创建zoo1.cfg~zoo5.cfg 5个配置文件。创建zoo1.cfg配置文件,文件中保存以下内容:
复制4份zoo1.cfg文件,分别命名为zoo2.cfg、zoo3.cfg、zoo4.cfg和zoo5.cfg,一次修改每个配置文件。
zoo4.cfg和zoo5.cfg中配置的peerType表示此ZooKeeper节点以Observer的模式加入集群中。
4. 创建myid文件在每个配置文件中都有一个dataDir配置项,这个配置项是用来配置数据文件的目录。在data目录下分别创建目录zk1、zk2、zk3、zk4和zk5,再在每个目录下创建一个myid文件。
5、创建启动脚本进入Zookeeper解压目录下的bin目录,创建start-all.sh脚本用于启动5个ZooKeeper进程。创建stop-all.sh脚本用于停止5个ZooKeeper进程。
创建status-all.sh脚本用于检查当前集群的状态:
为start-all.sh、stop-all.sh和status-all.sh添加执行权限:
进入当前目录: chmod +x *
6、启动ZooKeeper集群。sh start-all.sh
7、 查询集群状态执行以下命令查看ZooKeeper集群状态:sh status-all.sh
ZooKeeper总体架构
Zookeeper集群中的角色:
- 领导者(Leader):领导者负责投票的发起和决议,更新系统状态。
- 跟随者(Follower):接受客户端请求并返回结果,在选举阶段参与投票。
- 观察者(Observer):接受客户端连接,并将请求转发给Leader,不参与选举阶段投票。
- 客户端(Client):请求的发起方。
ZooKeeper数据模型
ZooKeeper拥有一个层次的命名空间。ZooKeeper中的每个节点被称为Znode,每个节点可以拥有子节点。ZooKeeper命名空间中的Znode兼具文件和目录两种特点。既可以像文件一样维护数据、元信息、ACL、时间戳等数据结构,又可以像目录一样作为路径标识的一部分。每个Znode由3部分组成:
stat:存储状态信息,用于描述该Znode的版本、权限等信息。
data:存储与该Znode关联的数据。
children:存储该Znode下的子节点。
ZooKeeper虽然可以关联一些数据,但并没有被设计为常规的关系型数据库或者大数据存储,相反的是,Znode用来管理调度数据,比如分布式应用中的配置文件信息、状态信息、汇集位置等。ZooKeeper规定节点的数据大小不能超过1MB,但在实际使用中Znode的数据量应该尽可能小,因为数据过大会导致ZooKeeper性能明显下降。
使用ZooKeeper自带的客户端连接到ZooKeeper集群,查看当前集群中节点状态:
sh zkCli.sh -server ip:端口
执行以下命令查询当前根节点下的Znode节点:
ls
可以发现当前节点ZooKeeper集群当前只有“/zookeeper”一个Znode节点。通过以下命令查询当前节点的状态:
stat /zookeeper
得到如下信息:
Spring集成ZooKeeper
要想在Spring中使用ZooKeeper进行开发,需要使用ZooKeeper客户端连接到ZooKeeper集群中。ZooKeeper的常用客户端分别是ApacheCurator客户端和开源zkclient客户端。Apache Curator是Apache的开源项目,封装了ZooKeeper自带的客户端,使用相对简便,易于使用。zkclient是另一个开源的ZooKeeper客户端,其地址为https://github.com/adyliu/zkclient,生产环境不推荐使用。
1. 添加Curator相关的依赖。在pom.xml中添加以下依赖关系:
2、创建自定义客户端。创建自定义ZooKeeper客户端,封装Curator中的ZooKeeper客户端,并提供一些对ZooKeeper的操作。
3. 在Spring中集成Curator。创建配置文件spring-zookeeper.xml,集成Curator:
4. 单元测试创建单元测试,在ZooKeeper服务器端创建“/spring5/test”节点:
得到如下所示的输出结果:data = Spring 5 Zookeeper Test
登录ZooKeeper客户端查看“/spring5/test”节点信息:
应用场景:
1、Curator可以监听变动的节点路径、节点值等。
2、使用ZooKeeper分布式锁可以有效控制并发操作共享资源的问题。
在单个JVM进程内,可以通过Java提供的Lock实现在多线程场景下对共享资源的加锁,以确保线程安全。但是到了分布式场景下,部署多个JVM进程(Java应用)时,Java提供的Lock将无法实现分布式场景下的共享资源的线程安全。使用ZooKeeper可以实现分布式锁。
------------------------------------------------------------------------------------------------------------------------------
以上内容整理自:《Spring 5 企业级开发实战》
-------------------------------------------------------------------------------------------------------------------------------
疑问?
Spring集成zookeeper是为了在java中监听zookeeper服务的节点信息吗,有什么意义呢
分布式加锁控制并发共享资源,应用的地方也不多吧,想不到哪里需要在java中这么控制分布式资源?