【JAVA开发】从0到1上手Java Zookeeper,看这篇就够了!
目录
一、Zookeeper 是什么
二、Zookeeper 的应用场景
(一)配置中心
(二)服务注册与发现
(三)分布式锁
三、安装 Zookeeper
(一)Linux 系统安装 Zookeeper
(二)Windows 系统安装 Zookeeper
(三)使用 Docker 安装 Zookeeper
四、Zookeeper 基础命令操作
(一)连接到 Zookeeper 服务器
(二)创建节点
(三)查看节点
(四)更新节点
(五)删除节点
五、Java 与 Zookeeper 交互
(一)引入依赖
(二)建立连接
(三)节点操作
(四)Watcher 机制
六、实战案例:分布式锁实现
(一)需求分析
(二)实现思路
(三)代码实现
七、总结与展望
一、Zookeeper 是什么
Zookeeper 是一个分布式的,开放源码的分布式应用程序协调服务,它是 Google 的 Chubby 的一个开源实现,也是 Hadoop 和 HBase 等分布式系统的重要组件 ,从设计模式角度来理解,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在 Zookeeper 上注册的那些观察者做出相应的反应。
Zookeeper 提供了一系列的功能,主要包括:
- 配置管理:在分布式系统中,经常需要管理一些配置信息,如数据库连接字符串、服务器地址等。Zookeeper 可以将这些配置信息存储在一个节点上,所有的应用程序都可以从这个节点获取配置信息。当配置信息发生变化时,Zookeeper 会通知所有的应用程序,应用程序可以重新获取最新的配置信息。例如,在一个微服务架构中,各个微服务可能需要共享一些公共的配置,如日志级别、缓存策略等,就可以通过 Zookeeper 来统一管理这些配置,当配置发生变化时,各个微服务能够及时感知并更新。
- 分布式锁:在分布式系统中,多个进程可能需要访问共享资源,为了避免数据不一致等问题,需要使用分布式锁来保证同一时间只有一个进程能够访问共享资源。Zookeeper 通过创建临时顺序节点和 Watcher 机制来实现分布式锁。例如,在电商系统的库存扣减场景中,多个订单可能同时尝试扣减库存,利用 Zookeeper 的分布式锁可以确保每次只有一个订单能够成功扣减库存,避免超卖现象。
- 集群管理:Zookeeper 可以用于管理集群中的节点,如节点的加入、离开、状态监控等。当一个节点加入集群时,它会在 Zookeeper 上创建一个临时节点,其他节点可以通过监听这个临时节点来得知有新节点加入。当一个节点离开集群时,它在 Zookeeper 上的临时节点会被删除,其他节点也会收到通知。以 Hadoop 集群为例,NameNode 的选举就可以借助 Zookeeper 来实现,确保集群中始终有一个活跃的 NameNode 来管理文件系统的元数据。
- 命名服务:类似于文件系统中的路径,Zookeeper 允许应用程序通过路径标识资源,为分布式环境中的各种资源提供了一种统一的命名方式,使得客户端可以方便地通过名称来查找和访问资源。例如,在一个分布式的服务注册与发现系统中,每个服务可以在 Zookeeper 上注册自己的地址和端口等信息,客户端通过服务名称在 Zookeeper 上查找对应的服务地址,从而实现服务的调用。
二、Zookeeper 的应用场景
在实际的分布式系统开发中,Zookeeper 有着非常广泛的应用场景,以下为你详细介绍:
(一)配置中心
在分布式系统中,不同的服务实例可能需要共享一些配置信息,如数据库连接信息、日志级别等。使用 Zookeeper 作为配置中心,可以将这些配置信息存储在 Zookeeper 的节点上。当配置发生变化时,Zookeeper 会通过 Watcher 机制通知所有监听该节点的服务实例,服务实例可以及时获取最新的配置信息,无需人工手动干预每个服务节点的配置文件。例如,在一个电商微服务架构中,各个微服务如商品服务、订单服务、用户服务等都需要连接数据库,数据库的地址、用户名和密码等配置信息就可以存储在 Zookeeper 上,当数据库迁移或者账号密码变更时,只需要在 Zookeeper 上修改配置,各个微服务就能自动感知并更新配置 ,保证系统的正常运行。
(二)服务注册与发现
在分布式系统中,服务实例的数量和状态可能会动态变化。Zookeeper 可以实现服务注册与发现功能,服务提供者在启动时,将自己的服务信息(如服务地址、端口号等)注册到 Zookeeper 的某个节点下,这些节点通常是临时节点,当服务提供者宕机或者正常关闭时,对应的临时节点会自动删除。服务消费者通过监听 Zookeeper 上的服务节点,就可以实时获取到可用的服务提供者列表,从而实现服务的调用。例如,在一个分布式的文件存储系统中,有多个文件存储节点作为服务提供者,文件访问服务作为服务消费者,文件存储节点启动时向 Zookeeper 注册自己,文件访问服务从 Zookeeper 获取可用的文件存储节点列表,当有新的文件存储节点加入或者已有节点故障时,文件访问服务能及时更新服务列表,保证文件的正常读写。
(三)分布式锁
在分布式环境下,多个进程可能需要访问共享资源,为了避免数据不一致等问题,需要使用分布式锁来保证同一时间只有一个进程能够访问共享资源。Zookeeper 实现分布式锁的原理是利用其临时顺序节点和 Watcher 机制。当一个客户端需要获取锁时,就在 Zookeeper 上创建一个临时顺序节点,然后获取所有该节点下的子节点并排序,如果自己创建的节点是序号最小的,就表示获取到了锁;否则,监听比自己序号小的前一个节点,当前一个节点被删除时(即前一个持有锁的客户端释放锁),会收到通知,此时再去竞争锁。例如,在一个分布式任务调度系统中,多个调度节点可能同时尝试调度同一个任务,利用 Zookeeper 的分布式锁可以保证同一时间只有一个调度节点能够调度该任务,避免任务被重复执行。
三、安装 Zookeeper
Zookeeper 的安装过程并不复杂,以下为你详细介绍在不同操作系统上的安装步骤:
(一)Linux 系统安装 Zookeeper
- 准备 Java 运行环境:Zookeeper 是基于 Java 开发的,所以需要先安装 Java 运行环境(JDK)。可以从 Oracle 官方网站下载适合你系统的 JDK 安装包,下载完成后,按照安装向导进行安装,并配置好JAVA_HOME、PATH和CLASSPATH环境变量 。例如,如果你下载的 JDK 安装在/usr/local/jdk1.8.0_361目录下,那么在/etc/profile文件中添加如下配置:
export JAVA_HOME=/usr/local/jdk1.8.0_361
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
保存文件后,执行source /etc/profile使配置生效,然后通过java -version命令检查 Java 是否安装成功。
2. 下载 Zookeeper 安装包:访问 Zookeeper 官方网站的下载页面,选择你需要的版本,如当前较新的稳定版本 3.8.4 。点击下载链接,将安装包下载到本地,例如/usr/local/src目录。
3. 解压安装包:使用以下命令解压下载的 Zookeeper 安装包,将其解压到/usr/local目录:
cd /usr/local/src
tar -zxvf apache-zookeeper-3.8.4-bin.tar.gz -C /usr/local
解压完成后,在/usr/local目录下会生成一个apache-zookeeper-3.8.4-bin文件夹,后续我们用$ZK_HOME来表示这个目录。
4. 配置 zoo.cfg 文件:进入$ZK_HOME/conf目录,复制zoo_sample.cfg文件并命名为zoo.cfg,这是 Zookeeper 的核心配置文件,内容如下:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=5
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=2
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/var/lib/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to \"0\" to disable auto purge feature
#autopurge.purgeInterval=1
各配置项说明如下:
- tickTime:Zookeeper 最小时间单元,单位毫秒 (ms),默认值为 2000,它用于控制心跳和超时,其他时间配置大多是 tickTime 的整数倍。
- initLimit:Leader 服务器等待 Follower 启动并完成数据同步的时间,默认值 5,表示 tickTime 的 5 倍,即 10 秒 。如果在这个时间内 Follower 没有完成同步,Leader 会认为 Follower 启动失败。
- syncLimit:Leader 服务器和 Follower 之间进行心跳检测的最大延时时间,默认值 2,表示 tickTime 的 2 倍,即 4 秒。如果超过这个时间 Follower 没有响应,Leader 会认为 Follower 宕机。
- dataDir:Zookeeper 服务器存储快照文件的目录,必须配置,建议不要使用/tmp目录,因为/tmp目录下的文件可能会被系统自动清理。
- clientPort:服务器对外服务端口,客户端通过这个端口连接 Zookeeper 服务器,一般设置为 2181。
- maxClientCnxns:限制单个客户端与 Zookeeper 服务器的最大连接数,默认值 60,设置为 0 表示不限制 。可以根据实际需求调整这个值,以防止单个客户端对服务器造成过大压力。
- autopurge.snapRetainCount:自动清理时保留的快照文件数量,默认值 3,表示只保留最近的 3 个快照文件。
- autopurge.purgeInterval:自动清理快照文件和事务日志的时间间隔,单位为小时,默认值 0 表示不开启自动清理功能 。如果设置为 1,则表示每小时自动清理一次。
你可以根据实际需求修改这些配置,例如修改dataDir为你希望存储数据的目录:
dataDir=/data/zookeeper
- 启动 Zookeeper:进入$ZK_HOME/bin目录,使用以下命令启动 Zookeeper 服务:
./zkServer.sh start
启动成功后,会输出类似如下信息:
ZooKeeper JMX enabled by default
Using config: /usr/local/apache-zookeeper-3.8.4-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
你可以使用./zkServer.sh status命令查看 Zookeeper 服务状态:
./zkServer.sh status
如果服务正常运行,会输出类似如下信息,显示当前节点是leader还是follower:
ZooKeeper JMX enabled by default
Using config: /usr/local/apache-zookeeper-3.8.4-bin/bin/../conf/zoo.cfg
Mode: follower
停止 Zookeeper 服务可以使用./zkServer.sh stop命令,重启服务使用./zkServer.sh restart命令。
(二)Windows 系统安装 Zookeeper
- 准备 Java 运行环境:和 Linux 系统一样,首先需要安装 Java 运行环境(JDK),从 Oracle 官方网站下载 Windows 版本的 JDK 安装包,运行安装程序,按照提示完成安装。安装完成后,配置JAVA_HOME、PATH和CLASSPATH环境变量。例如,JDK 安装在C:\\Program Files\\Java\\jdk1.8.0_361目录下,在系统环境变量中添加如下配置:
- 新建系统变量:变量名JAVA_HOME,变量值C:\\Program Files\\Java\\jdk1.8.0_361
- 编辑PATH变量:在PATH变量值中添加%JAVA_HOME%\\bin和%JAVA_HOME%\\jre\\bin
- 新建系统变量:变量名CLASSPATH,变量值.;%JAVA_HOME%\\lib;%JAVA_HOME%\\lib\\tools.jar
配置完成后,打开命令提示符,输入java -version检查 Java 是否安装成功。
- 下载 Zookeeper 安装包:在 Zookeeper 官方网站的下载页面下载 Windows 版本的 Zookeeper 安装包,下载完成后,将安装包解压到你希望安装的目录,例如C:\\zookeeper,后续我们用%ZK_HOME%来表示这个目录。
- 配置 zoo.cfg 文件:进入%ZK_HOME%\\conf目录,复制zoo_sample.cfg文件并命名为zoo.cfg。打开zoo.cfg文件,根据实际需求修改配置项,修改方法和 Linux 系统中的配置类似。例如,修改dataDir为C:\\zookeeper\\data:
dataDir=C:\\zookeeper\\data
- 启动 Zookeeper:进入%ZK_HOME%\\bin目录,双击zkServer.cmd文件启动 Zookeeper 服务。也可以在命令提示符中进入该目录,执行zkServer.cmd命令启动服务。启动成功后,命令提示符窗口会显示相关启动信息。
查看 Zookeeper 服务状态可以在命令提示符中执行zkServer.cmd status命令,停止服务执行zkServer.cmd stop命令,重启服务执行zkServer.cmd restart命令。
(三)使用 Docker 安装 Zookeeper
- 安装 Docker:如果你的系统还没有安装