Zookeeper|部署与实战

Zookeeper重要概念&架构

ZooKeeper | Overview

ZooKeeper | Quick Start

数据模型和命名空间结构

ZK 的目录树结构有点类似文件系统,但是也有所区别

ZNode

ZK中称每一个注册到ZK的节点为 ZNode,每个 ZNode 之间通过/来进行分层,进行父子关系区分

每个 znode 包含了一个记录自身数据变化版本,访问权限控制,时间戳等的状态信息,用于缓存验证和一致性更新。每当 znode 的数据发生变化时,版本号会更新,因此任何一个客户端读取到 ZNode 的数据都包含了数据版本信息

ZNode 也有分很多类型,比较常用的是 Ephmeral 类型的节点,这种类型的节点会随着 服务节点和 ZK 连接会话的消亡而一起消亡,只要会话还保持心跳链接,这个 ZNode 就可以一致存在;如果会话结束,节点自动删除,节省资源

条件更新和 Watchers

ZK中的 Watch 类似事件驱动的消息

当 ZNode 发生变更时(通常就是断联),Watch 将会被触发和移除

当 Watch 触发时,客户端会受到 ZNode 发生变更的消息

3.6.0 以后支持客户端设置常驻Watcher,这种类型的Watcher在触发之后不会被删除,同时会触发关于某个 ZNode 和其所有子 ZNode 的消息

常见API

  • create 在ZK维护的路径树上新增 ZNode
  • delete
  • exists 判断某个指定位置是否存在指定 ZNode
  • get data 读取 ZNode 数据
  • set data 写数据
  • get childeren 获取某个 ZNode 下所有 ZNode
  • sync 同步数据传播(?)

Docker部署Zookeeper最佳实践

单点部署

1
docker run -d --name zk-standalone -p 2181:2181 -p 2888:2888 -p 3888:3888 -v G:/Docker Volumes/zk_standalone:/data -e ZOO_MY_ID=1 zookeeper:latest

CLI接口交互执行

1
docker exec -it zk-standalone bin/zkCli.sh -server localhost:2181

集群部署

TODO,目前暂时没有需求,一个 Docker-compose 即可在单机上拉集群,Kubernetes 应该可以部署多点集群

Spring Boot 整合 Curator

更多的时候还是通过项目的客户端接口来对 ZK 进行 ZNode 操作,项目使用的是 Curator

版本选择

Getting Started | Apache Curator

官方提供了预构建的 Curator Recipes 部署包

当然很多时候我们只是想要用 Curator 更方便的客户端包,只需要引用 Curator Framework 即可

获得连接

对于一个 ZK 的集群对象,只需要一个 CuratorFramework 实例

建议针对项目新增一个配置类,来映射配置文件的地址信息

在实例化客户端对象的时候需要的参数大致就是:

  • ZK的ip:port
  • 会话超时时间
  • 连接超时时间
  • 重试次数
1
2
CuratorFramework cf = CuratorFrameworkFactory.newClient(...);
cf.start();

客户端实例对象 CuratorFramework 必须在使用前 start 不需要时 close

之后就是一些增删改查的基础 API 了

Curator 提供的 API 基本都是流式接口的规范,也就是链式调用

1
cf.create().withMode(CreateMode.EPHEMERAL).forPath(path, bytes);

Zookeeper|部署与实战
http://example.com/2024/08/08/Zookeeper-部署与实战/
作者
Noctis64
发布于
2024年8月8日
许可协议