zookeeper是什么可以做什么?
1、什么是zookeeper
简单来说,ZooKeeper 是一个开源的、高性能的分布式应用协调服务。它就像是为分布式系统提供的一个“基础设施服务”,专门用来解决分布式应用中常见的协调和管理问题。
您可以把它想象成分布式系统的 “管理员” 或 “总控中心”。

2、 核心类比:动物园管理员
它的名字本身就源自一个生动的比喻:一个大型分布式系统就像一座动物园,里面有很多动物(服务/节点),需要一个管理员来协调、管理和维护秩序,确保动物们不会互相冲突,并能协同工作。
3、ZooKeeper 主要解决了什么问题?
在分布式系统中,多个节点(服务器)需要协同工作,会面临很多复杂的问题:
1、**配置管理:**所有节点需要统一的配置信息,手动修改每台机器容易出错。
2、**服务发现与命名:**服务A如何知道服务B在哪台机器上?新服务上线或者下线时如何通知其他服务?
3、分布式锁:多个节点同时操作一个共享资源时(如修改同一个文件),需要一种机制来保证同一时间只有一个节点能执行。
4、**集群管理:**监控节点的存活状态,进行领导选举(比如确定哪个节点是主节点)
Zookeeper提供了一个简单、可靠、高性能的解决方案来处理这些问题。
4、核心工作原理与特性
Zookeeper本身也是一个分布式集群(通常由奇数个节点组成,如3、5、7台),以保证高可用性。他对外提供了一个类似文件系统目录树的数据模型。
4.1数据模型(ZNode):
1、数据存储在称为ZNode的节点上,他们组织成一个层次化的树状结构,类似于文件系统的目录和文件。
2、你可以对ZNode进行读写操作,但其设计初衷是存储协调数据(如状态、配置、位置信息)而不是海量的应用数据。
3、ZNode有多种类型,例如临时节点(创建它的客户端会话结束时,节点会自动删除),这非常适合于做服务注册和存活监控。
监听机制(watch):
1、这是Zookeeper最强大的特征之一。客户端可以在一个ZNode上设置一个监听。
2、当这个Znode的数据发生变化(修改、删除)或其子节点列表发生变化时,Zookeeper会主动通知注册了监听的客户端。这使得客户端能及时感知到变化,实现动态配置更新和服务发现。
一致性保证
Zookeeper遵循ZAB协议,为所有客户端提供顺序一致性的保证。他确保所有更新操作都是按照全局顺序执行,而且集群中大多数节点写入成功后,更新才会被确认。这保证了数据可靠性。
5、主要应用场景
1、**配置中心:**将系统的通用配置(如数据库地址、开关参数)存储在Zookeeper的一个ZNode中,所有应用服务监听这个节点,配置一变,所有的服务实时生效。
2、服务注册与发现(如Dubbo早期版本)
**服务注册:**服务启动时,在Zookeeper的指定目录下创建一个临时ZNode,写入自己的地址信息。
服务发现:调用者监听该目录,当有新的服务上线(新增子节点)或下线(会话结束,临时节点删除)时,Zookeeper会通知调用者,使其能及时获取最新的可用服务列表。
3、分布式锁:
多个客户端尝试在同一个路径下创建同一个临时的ZNode,由于Zookeeper保证节点路径唯一,最终只有一个客户端能创建成功。创建成功的客户端就获得了锁,其他客户端监听这个节点,当锁释放时,再重新竞争。
4、集群选主:
在Master-Slave架构中,所有Slave尝试创建同一个临时ZNode,创建成功的成为Master。其他Slave监听这个节点。如果Master宕机,所有Slave会收到通知,并重新发起选举,产生新的Master(主节点)。
6、单节点使用二进制部署Zookeeper
6.1环境准备
系统要求
1、Linux/Unix系统(CentOS/Ubuntu等)
2、Java 8或更高版本
3、下载Zookeeper二进制包
手动下载安装 Oracle JDK 11
# 1. 下载JDK 11(请从官网获取最新链接)
wget https://download.oracle.com/java/11/latest/jdk-11_linux-x64_bin.tar.gz
# 2. 创建安装目录
sudo mkdir -p /usr/lib/jvm
# 3. 解压到目录
sudo tar -xzf jdk-11_linux-x64_bin.tar.gz -C /usr/lib/jvm
# 4. 配置环境变量
echo 'export JAVA_HOME=/usr/lib/jvm/jdk-11' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
# 5. 使配置生效
source ~/.bashrc
# 6. 验证安装
java -version
我这采用的是在线安装jdk
# 安装JDK 11
sudo yum install java-11-openjdk-devel # CentOS 7/RHEL 7
# 或者
sudo dnf install java-11-openjdk-devel # CentOS 8+/Fedora
# 验证安装
java -version


下载Zookeeper
# 选择版本,这里以3.7.1为例
wget https://downloads.apache.org/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz
# 解压
tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz
cd apache-zookeeper-3.7.1-bin
配置Zookeeper
创建数据和日志目录
# 创建数据目录
mkdir -p /data/zookeeper/data
mkdir -p /data/zookeeper/logs
# 创建myid文件(单机模式也需要)
echo 1 > /data/zookeeper/data/myid
复制配置文件
# 复制示例配置文件
cp conf/zoo_sample.cfg conf/zoo.cfg
编辑配置文件 conf/zoo.cfg
# 基本配置
#心跳时间
tickTime=2000
initLimit=10
syncLimit=5
# 数据目录
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/logs
# 客户端端口
clientPort=2181
# 单机模式配置
server.1=localhost:2888:3888
# 其他可选配置
# admin.serverPort=8080 # 管理界面端口
# autopurge.snapRetainCount=3 # 保留快照数量
# autopurge.purgeInterval=1 # 清理间隔(小时)
3. 启动和验证
启动Zookeeper
# 方式1:前台启动(测试用)
./bin/zkServer.sh start-foreground
# 方式2:后台启动
./bin/zkServer.sh start
# 查看状态
./bin/zkServer.sh status
# 停止服务
./bin/zkServer.sh stop

客户端连接测试
# 连接Zookeeper
./bin/zkCli.sh -server 127.0.0.1:2181
# 在zkCli中执行测试命令
ls /
create /test "hello"
get /test
delete /test
quit

系统服务配置(可选)
创建systemd服务文件 /etc/systemd/system/zookeeper.service
[Unit]
Description=Apache Zookeeper
After=network.target
[Service]
Type=forking
User=zookeeper
Group=zookeeper
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk"
ExecStart=/opt/zookeeper/bin/zkServer.sh start
ExecStop=/opt/zookeeper/bin/zkServer.sh stop
ExecReload=/opt/zookeeper/bin/zkServer.sh restart
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
使用systemd管理
# 重新加载systemd
systemctl daemon-reload
# 启动服务
systemctl start zookeeper
# 设置开机自启
systemctl enable zookeeper
# 查看状态
systemctl status zookeeper