一、简介
ZooKeeper主要的使用场景就是分布式协同服务,保证分布式信息的一致性。
1. 基本概念
Zookeeper是一个典型的分布式数据一致性解决方案,分布式应用可以基于它实现数据订阅/发布、负载均衡、命名服务、集群服务、分布式锁和分布式队列等功能。
- 集群角色:在zk中,没有沿用Master/Slave(主备)概念,而是引入了Leader、Follwer、Observer三种角色。通过Leader选举来选定一台Leader机器,Leader机器为客户端提供读写服务,其他角色提供读服务,唯一区别就是Observer不参与Leader选举过程、写操作过半成功策略,因此Oberver可以在不影响写性能情况下提高集群性能。
- 会话(session):指一个客户端连接,代表客户端和服务器一个TCP长连接。通过连接,客户端通过心跳检测与服务器保持有效的会话,还能够接受服务器Watch事件。
- 数据节点(Znode):机器节点,每个Znode保存自己的数据内容、属性信息。
- 版本:每个ZNode 都会维护一个Stat数据结构,Stat记录三个数据版本,分别是version(当前版本)、cversion(子节点版本)、aversion(ACL版本)。
- Watch(事件监听):节点注册Watch,会收到服务器事件通知,是Zookeeper重要特性。
- ACL:权限控制策略,有5种:create(创建子节点权限)、read(获取节点数据和子节点权限)、write(更新节点数据权限)、delete(删除子节点权限)、admin(设置ACL权限),⚠️create、delete 都是针对子节点
二、 环境搭建
三种搭建方式:
- 单机:适合测试
- 集群:适合生产
- 伪集群:一台服务器运行多个zk,适合生产前测试
1. 单机部署
1、 下载地址:zookeeper.apache.org/releases.ht…
2、 解压
tar -zxvf zookeeper-3.4.14.tar.gz
1、 创建data文件夹
cd zookeeper-3.4.14
mkdir data
1、 修改配置
cd conf
mv zoo_sample.cfg zoo.cfg
1、 修改zoo.cfg 中data属性
dataDir=/root/zookeeper-3.4.14/data
1、 服务启动、看状态、停止
./zkServer.sh start
./zkServer.sh status
./zkServer.sh stop
2. 伪集群部署
保证端口号不冲突、dataDir也不同、在dataDir所在目录创建myid文件指定对应ZK实例
- clientPort:不同实例配置不同端口
- dataDir、dataLogDir:将数据文件和日志文凯存放
- server.X、myid 两个相互对应 1,2,3
前几步与单机一样,主要是复制多个zk和配置变动:
- server 1:
clientPort=2181
dataDir=/zkcluster/zookeeper01/data
dataLogDir=/zkcluster/zookeeper01/data/logs
- server 2:
clientPort=21812
dataDir=/zkcluster/zookeeper02/data
dataLogDir=/zkcluster/zookeeper02/data/logs
- 更多服务配置…
- 配置集群:在每个zk的data下创建myid,分别是1,2,3,记录服务ID
touch myid
- 在每个zk的zoo.cfg 配置端口访问和集群服务IP列表
server.1=10.211.55.4:2881:3881
server.2=10.211.55.4:2882:3882
server.3=10.211.55.4:2883:3883
#server.服务器ID=服务器IP地址:服务器之间通信端口:服务器之间投票选举端口
- 启动实例,完成集群
三、基本使用
1. 系统模型
根据斜杠分割表示路径。
1.1 ZNode节点可分为三大类:
- 持久性节点:一直存在,直到删除主动清除
- 持久顺序性节点:+ 顺序
- 临时性节点:生命周期和客户端会话绑定一起,会话结束便删除
- 顺序性节点:+ 顺序
不同类型有不同类型的生命周期
1.2 事务ID
用ZXID表示,通常是一个64位数字,每一次ZXID对应一次新操作,间接直到zk处理更新操作的全局顺序
1.3 ZNode 状态信息
cZxid 就是 Create ZXID,表示节点被创建时的事务ID。
ctime 就是 Create Time,表示节点创建时间。
mZxid 就是 Modified ZXID,表示节点最后一次被修改时的事务ID。
mtime 就是 Modified Time,表示节点最后一次被修改的时间。
pZxid 表示该节点的子节点列表最后一次被修改时的事务 ID。只有子节点列表变更才会更新 pZxid,
子节点内容变更不会更新。
cversion 表示子节点的版本号。
dataVersion 表示内容版本号。
aclVersion 标识acl版本
ephemeralOwner 表示创建该临时节点时的会话 sessionID,如果是持久性节点那么值为 0 dataLength 表示数据⻓度。
numChildren 表示直系子节点数。
1.4 Watcher-> 数据变更通知
zk使用Watcher实现发布/订阅,流程如下:
1.5 ACL ->保证数据安全
从三方面理解ACL机制,权限模式 Scheme 、授权对象ID、权限Permission,通常使用scheme: id : permission 标识有效的ACL信息 :
- 权限模式 Scheme
- IP:通过IP地址粒度进行权限控制
- Digest:最常用的,username:password 进行控制
- World:对所有用户开放,world: anyone
- Super:特殊的Digest,对任何节点操作
- 授权对象:ID …
2. 命令行操作
- 进入客户端:
./zkCli.sh 连接本地的zookeeper服务器
./zkCli.sh -server ip:port 连接指定的服务器
- 创建节点:
create [-s][-e] path data acl
//其中,-s或-e分别指定节点特性,顺序或临时节点,若不指定,则创建持久节点;acl用来进行权限控制。
- 创建永久节点
create /zk-permanent 123
- 读取节点
path表示的是指定数据节点的节点路径,例:get /zk-permanent
ls path // ls 列出所有子节点、只能查看下一级子节点
get path // 可获取指定节点数据内容和属性信息
ls/ // 获取根节点所有子节点
- 更新节点/删除节点 例:set /zk-test0000000000 4567 ,返回更新后信息,其中dataVersion 自增
set path data [version]
delete path [version]
3. api 使用
引入
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
</dependency>
剩下的crud,直接交给搜索引擎…
4. zk 开源客户端
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.2</version>
</dependency>
api使用更加方便简洁,剩下的,直接交给搜索引擎…
5. Curator 客户端
提供了Fluent 编程风格支持,封装zk底层的细节开发工作,包括重连、反复注册Watcher。
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
剩下的,直接交给搜索引擎…