ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。
ZooKeeper 的架构通过冗余服务实现高可用性。
Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。
一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布 / 订阅、负载均衡、命名服务、分布式协调 / 通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
谁适合阅读本教程?
本教程是为专业的程序开发
Linux 安装
zookeeper 下载地址为: https://zookeeper.apache.org/releases.html。
选择一稳定版本,本教程使用的 release 版本为 3.7.1,下载并安装。点击看到如下界面:
选择下载地址,也可以点击此处下载Zookeeper3.7.1
注意 请将下载后的文件 重名名为:apache-zookeeper-3.7.1-bin.tar.gz
将apache-zookeeper-3.7.1-bin.tar.gz放在/opt/software/ 路径下
Zookeeper 下载安装
本章节将示范三台 zookeeper 服务端集群搭建步骤。
所需准备工作,创建三台虚拟机环境并安装好 java 开发工具包 JDK,可以使用 VM 或者 vagrant+virtualbox 搭建 centos/ubuntu 环境,本案例基于宿主机 windows10 系统同时使用 vagrant+virtualbox 搭建的 centos7 环境,如果直接使用云服务器或者物理机同理。
步骤一
准备三台 zookeeper 环境和并按照上一教程下载 zookeeper 压缩包,三台集群 centos 环境如下:
机器一:192.168.3.33
机器二:1
本教程使用的 IDE 为 IntelliJ IDEA,创建一个 maven 工程,命名为 zookeeper-demo,并且引入如下依赖,可以自行在 maven 中央仓库选择合适的版本,介绍原生 API 和 Curator 两种方式。
IntelliJ IDEA 相关介绍:
Intellij IDEA 使用教程
Maven IntelliJ
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <versi
一、zookeeper 客户端简介
ZooKeeper 提供了一个非常简单的命令行客户端 zkCli,它在 ZooKeeper 安装目录的 bin 目录下。输入./zkCli.sh 命令默认连接本地 127.0.0.1:2181 节点,如果我们需要连接远程节点可以使用./zkCli.sh -server ip:2181 方式进行连接。连接过程中会输出一大堆信息。当连接成功后,将进入 ZooKeeper 的交互式模式。博文实验环境:
操作系统:centos7.6
zookeeper 版本:3.6.3
二、zookeeper 常用命令示例
0、连接 zookeeper
客户端与服务端之间的连接是基于 TCP 长连接,client 端连接 server 端默认的 2181 端口,也就是 session 会话。
从第一次连接建立开始,客户端开始会话的生命周期,客户端向服务端的 ping 包请求,每个会话都可以设置一个超时时间。
Session 的创建
sessionID: 会话 ID,用来唯一标识一个会话,每次客户端创建会话的时候,zookeeper 都会为其分配一个全局唯一的 sessionID。zookeeper 创建 sessionID 类 SessionTrackerImpl 中的源码。
Timeout:会话超时时间。客户端在
数据模型
在 zookeeper 中,可以说 zookeeper 中的所有存储的数据是由 znode 组成的,节点也称为 znode,并以 key/value 形式存储数据。
整体结构类似于 linux 文件系统的模式以树形结构存储。其中根路径以 / 开头。
进入 zookeeper 安装的 bin 目录,通过 sh zkCli.sh 打开命令行终端,执行 "ls /" 命令显示:
[zk: localhost:2181(CONNECTED) 0] ls /[nbu, zookeeper][zk: localhost:2181(CONNECTED) 1] ls /zook
四字命令安装
zookeeper 支持某些特定的四字命令与其交互,用户获取 zookeeper 服务的当前状态及相关信息,用户在客户端可以通过 telenet 或者 nc(netcat) 向 zookeeper 提交相应的命令。
安装 nc 命令:
$ yum install nc # centos或$ sudo apt install netcat # ubuntu
若无法,找到conf文件夹下的zoo.cfg,在文件最后添加4lw.commands.whitelist=*,保存退出,所有命令都可以使用了。
四字命令格
zookeeper 的 ACL(Access Control List,访问控制表)权限在生产环境是特别重要的,所以本章节特别介绍一下。
ACL 权限可以针对节点设置相关读写等权限,保障数据安全性。
permissions 可以指定不同的权限范围及角色。
ACL 命令行
getAcl 命令:获取某个节点的 acl 权限信息。
setAcl 命令:设置某个节点的 acl 权限信息。
addauth 命令:输入认证授权信息,注册时输入明文密码,加密形式保存。
ACL 构成
zookeeper 的 acl 通过 [scheme:id:permissions] 来
zookeeper 的 watcher 机制,可以分为四个过程:
客户端注册 watcher。
服务端处理 watcher。
服务端触发 watcher 事件。
客户端回调 watcher。
其中客户端注册 watcher 有三种方式,调用客户端 API 可以分别通过 getData、exists、getChildren 实现,利用前面章节创建的 maven 工程,新建 WatcherDemo 类,以 exists 方法举例说明其原理。
实例
public class WatcherDemo implements Watcher { static ZooK