初识ZooKeeper

318 阅读2分钟

这是我参与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"

二、基本概念

  1. 层级命名空间znode:stat {version、acl、timestamp、length(<1MB)} —— 总体来说是一种 DataTree 结构。
  2. 节点类型:持久节点/临时节点。
  3. 顺序节点/非顺序节点:锁定和同步。
  4. Session 会话:心跳机制,维持与客户端连接。
  5. Watches 监视:使客户端收到ZooKeeper的更改通知;客户端读取ZooKeeper上的配置。
  6. 组件列表:
  7. 底层复制数据库:维持每个znode的数据库一致。
  8. 集群角色——Leader:负责处理写入请求。
  9. 集群角色——Follower:接受并转发写入请求。
  10. 请求处理器(Learder):管理来自follower的写入请求。
  11. Zab协议:ZooKeeper原子广播协议。
  12. 通知机制:订阅(Watch)。
  13. 会话状态:连接中、已连接、重连接中、已重连接、已关闭。
  14. 分布式锁/分布式事务:2PC;3PC(增加超时机制,如果长时间没有收到协调者的响应,默认会commit提交事务/准备阶段会abort;另一方面,协调者如果收不到响应,就会abort)

三、实战应用

1. Start/Stop

~/zookeeper/zkServer.sh start/restart/stop

2. Command

  1. conf: 输出相关服务配置的详细信息。
  2. cons:列出所有连接到服务器的客户端的完全的连接 /会话的详细信息。包括“接受 / 发送”的包数量、会话 id 、操作延迟、最后的操作执行等等信息。
  3. dump:列出未经处理的会话和临时节点。
  4. envi:输出关于服务环境的详细信息(区别于 conf命令)。
  5. reqs:列出未经处理的请求
  6. ruok:测试服务是否处于正确状态。如果确实如此,那么服务返回“imok ”,否则不做任何相应。
  7. stat:输出关于性能和连接的客户端的列表。
  8. wchs:列出服务器 watch的详细信息。
  9. wchc:通过 session列出服务器 watch的详细信息,它的输出是一个与watch相关的会话的列表。
  10. wchp:通过路径列出服务器 watch的详细信息。它输出一个与 session相关的路径。
  11. 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

四、特性功能

  1. 提供读写数据服务;
  2. 提供数据监听服务;
  3. 高可用集群部署:一半以上存活,至少3个节点组建集群;
  4. 保证顺序一致性:zxid;
  5. 支持原子/事务操作;
  6. 单一系统映像:集群中各节点数据一致;
  7. 目录/节点权限控制 ACL:CREATE / READ / WRITE / DELETE / ADMIN(授权);

五、角色划分

  1. Leader 负责创建事务,写操作有关的;
  2. Follower 负责读操作有关的、转发写请求。Leader 挂掉时可通过选主晋升。
  3. Listener 仅负责读操作有关的、转发写请求。不参与选主。

六、选主同步机制

  1. Leader 接收 Proposal,发送给所有 Follower 进行 “确认”
  2. 过半 Follower 回复 “确认” 后,再次发送 Commit 给全部 Follower 要求将此 Proposal 进行提交。