这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战
一、安装部署
1. 下载
# 官方
wget https://downloads.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
# 国内
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
2. 解压
tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz
ln -s ~/zookeeper/ ./apache-zookeeper-3.6.0-bin/
3. 关键配置
# 复制模版生成正式配置
cp ~/zookeeper/conf/zoo_sample.cfg ~/zookeeper/conf/zoo.cfg
vim ~/zookeeper/conf/zoo.cfg
# 主要配置:数据目录,接受客户端请求/连接开启的端口
dataDir=/tmp/zookeeper
clientPort=2181
# 按需可以添加 JVM 启动参数
vim ~/zookeeper/conf/java.env
# 举例: 调整使用堆内存为 32GB
#!/bin/sh
export JVMFLAGS="-Xmx32768m -Xms32768m"
二、基本概念
- 层级命名空间znode:stat {version、acl、timestamp、length(<1MB)} —— 总体来说是一种 DataTree 结构。
- 节点类型:持久节点/临时节点。
- 顺序节点/非顺序节点:锁定和同步。
- Session 会话:心跳机制,维持与客户端连接。
- Watches 监视:使客户端收到ZooKeeper的更改通知;客户端读取ZooKeeper上的配置。
- 组件列表:
- 底层复制数据库:维持每个znode的数据库一致。
- 集群角色——Leader:负责处理写入请求。
- 集群角色——Follower:接受并转发写入请求。
- 请求处理器(Learder):管理来自follower的写入请求。
- Zab协议:ZooKeeper原子广播协议。
- 通知机制:订阅(Watch)。
- 会话状态:连接中、已连接、重连接中、已重连接、已关闭。
- 分布式锁/分布式事务:2PC;3PC(增加超时机制,如果长时间没有收到协调者的响应,默认会commit提交事务/准备阶段会abort;另一方面,协调者如果收不到响应,就会abort)
三、实战应用
1. Start/Stop
~/zookeeper/zkServer.sh start/restart/stop
2. Command
- conf: 输出相关服务配置的详细信息。
- cons:列出所有连接到服务器的客户端的完全的连接 /会话的详细信息。包括“接受 / 发送”的包数量、会话 id 、操作延迟、最后的操作执行等等信息。
- dump:列出未经处理的会话和临时节点。
- envi:输出关于服务环境的详细信息(区别于 conf命令)。
- reqs:列出未经处理的请求
- ruok:测试服务是否处于正确状态。如果确实如此,那么服务返回“imok ”,否则不做任何相应。
- stat:输出关于性能和连接的客户端的列表。
- wchs:列出服务器 watch的详细信息。
- wchc:通过 session列出服务器 watch的详细信息,它的输出是一个与watch相关的会话的列表。
- wchp:通过路径列出服务器 watch的详细信息。它输出一个与 session相关的路径。
- mntr:用于监控zookeeper server 健康状态的各种指标
# 用法
echo mntr| nc 127.0.0.1 2181
3. CLI
# 登录 sh
~/zookeeper/zkCli.sh -server 127.0.0.1:2181
> config # 查看集群信息
> reconfig -add serverId=host:port1:port2;port3, # 动态扩容节点,3.5.5版本后支持
> reconfig -remove serverId, # 动态缩容节点
> history # 查看操作历史
> quit # 退出
# 其他命令与 path 增删改查有关,略
4. Snapshot
# 磁盘不足时,可以清理指定数量的快照
~/zookeeper/zkCleanup.sh dataLogDir [snapDir] -n count
四、特性功能
- 提供读写数据服务;
- 提供数据监听服务;
- 高可用集群部署:一半以上存活,至少3个节点组建集群;
- 保证顺序一致性:zxid;
- 支持原子/事务操作;
- 单一系统映像:集群中各节点数据一致;
- 目录/节点权限控制 ACL:CREATE / READ / WRITE / DELETE / ADMIN(授权);
五、角色划分
- Leader 负责创建事务,写操作有关的;
- Follower 负责读操作有关的、转发写请求。Leader 挂掉时可通过选主晋升。
- Listener 仅负责读操作有关的、转发写请求。不参与选主。
六、选主同步机制
- Leader 接收 Proposal,发送给所有 Follower 进行 “确认”
- 过半 Follower 回复 “确认” 后,再次发送 Commit 给全部 Follower 要求将此 Proposal 进行提交。