Zookeeper 3.6.1 详尽用法指南

日期 作者 版本 备注
2020-06-12 丁斌 v1.0

Zookeeper,简称zk, 作为解决分布式一致性问题的成熟开源技术栈已经被广泛使用。本文用简短精炼的篇幅迅速论述一下zookeeper集群的安装部署和使用方法。

注意:

安装zookeeper之前需要在每台机器上安装好jdk,建议安装至少jdk1.8及以上版本。本文安装的是jdk1.8。本文使用的zookeeper版本是当前最新的zookeeper 3.6.1版本。相关程序安装包和开源java工程源代码链接是: zookeeper3.6.1package.rar 提取码: fmw2
其中zookeeper JAVA API用法demo源码在esproj.zip文件中java工程的zk目录下。如下2图所示:
image.png
image.png

1. Zookeeper技术简介

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

ZooKeeper包含一个简单的原语集,提供Java和C的接口。

ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,其中分布锁和队列有Java和C两个版本,选举只有Java版本。

  • 原理

ZooKeeper是以Fast Paxos算法为基础的,Paxos 算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fast Paxos作了一些优化,通过选举产生一个leader (领导者),只有leader才能提交proposer,具体算法可见Fast Paxos。因此,要想弄懂ZooKeeper首先得对Fast Paxos有所了解。

ZooKeeper的基本运转流程:

1、选举Leader。
2、同步数据。
3、选举Leader过程中算法有很多,但要达到的选举标准是一致的。
4、Leader要具有最高的执行ID,类似root权限。
5、集群中大多数的机器得到响应并follow选出的Leader。
  • 特点

在Zookeeper中,znode是一个跟Unix文件系统路径相似的节点,可以往这个节点存储或获取数据。如果在创建znode时Flag设置为EPHEMERAL,那么当创建这个znode的节点和Zookeeper失去连接后,这个znode将不再存在在Zookeeper里,Zookeeper使用Watcher察觉事件信息。当客户端接收到事件信息,比如连接超时、节点数据改变、子节点改变,可以调用相应的行为来处理数据。Zookeeper的Wiki页面展示了如何使用Zookeeper来处理事件通知,队列,优先队列,锁,共享锁,可撤销的共享锁,两阶段提交。

那么Zookeeper能做什么事情呢,简单的例子:假设我们有20个搜索引擎的服务器(每个负责总索引中的一部分的搜索任务)和一个总服务器(负责向这20个搜索引擎的服务器发出搜索请求并合并结果集),一个备用的总服务器(负责当总服务器宕机时替换总服务器),一个web的cgi(向总服务器发出搜索请求)。搜索引擎的服务器中的15个服务器提供搜索服务,5个服务器正在生成索引。这20个搜索引擎的服务器经常要让正在提供搜索服务的服务器停止提供服务开始生成索引,或生成索引的服务器已经把索引生成完成可以提供搜索服务了。使用Zookeeper可以保证总服务器自动感知有多少提供搜索引擎的服务器并向这些服务器发出搜索请求,当总服务器宕机时自动启用备用的总服务器。

2. Zookeeper集群快速搭建

从zookeeper官网https://zookeeper.apache.org/releases.html 下载当前最新版本的zookeeper3.6.1。
image.png

分布式zookeeper(简称zk)集群至少要求运行在3台或以上服务器上。本文讲述是基于安装在3台vmware虚拟机上,各虚拟机机器结点如下表:
image.png
本节使用的所有vmware虚拟机配置均为CPU:8核,内存6G,硬盘足够。

根据我们一贯部署分布式服务的做法:
1) 先创建zk用户和zk组;

groupadd zk
vim /etc/group 会发现最后一行有zk用户组

adduser -g zk zk
创建zk用户,同时加入zk用户组,自动创建zk的homedir为/home/zk
vim /etc/passwd 可以看到最后一行是zk用户。

passwd zk
为zk用户新设立密码

将zk用户加入sudo权限
注意:本步骤非必须,可选。
chmod +w /etc/sudoers
vim /etc/sudoers
添加如下行:

image.png

然后再chmod -w /etc/sudoers

2) 创建zk服务的basedir:/opt/zk

chown -R zk:zk /opt/zk

3) 在/opt/zk下分别创建app data logs temp分别作为zk的app/data/logs/temp 目录。
image.png

4) 配置zk

解压zk压缩包文件:apache-zookeeper-3.6.1-bin.tar.gz 到/opt/zk/app目录下:
image.png
在cent7a机器上执行:

cd /opt/zk/app/apache-zookeeper-3.6.1-bin/conf
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg 修改如下:

image.png
其中clientPort 2181是客户端连接zk集群的端口,dataDir和dataLogDir分别是数据目录和日志目录。文件最后的3行是用于zk集群互联。

server.A = B:C:D
A:zookeeper服务器的序号,即第几号服务器.
 注意这个序号要与zookeeper的myid保持一致
B:服务器的 IP 地址
C:服务器跟随者follower与集群中的 Leader 服务器交换信息的端口
D:如果集群中的 Leader 服务器宕机,需要一个端口通信重新进行选举,选出一个新的 Leader。这个端口就是用来做leader选举的端口
注意server.1/server.2/server.3 中的1/2/3是zk 结点的序号,不同结点必须不能相同。

直接将此zoo.cfg一行不用修改原样拷贝到cent7b和cent7c机器上相同目录下。
接下来在cent7a的datadir即:/opt/zk/data下新创建myid文件,并写入1:
image.png

同样地在cent7b的datadir即:/opt/zk/data下新创建myid文件,并写入2:
image.png

在cent7c的datadir即:/opt/zk/data下新创建myid文件,并写入3:
image.png

至此,zk集群配置结束。启动zk集群之前不要忘记开放3台机器上2181/2888/3888 三个端口:

systemctl start firewalld
firewall-cmd --zone=public --add-port=2181/tcp --permanent
firewall-cmd --zone=public --add-port=2888/tcp --permanent
firewall-cmd --zone=public --add-port=3888/tcp --permanent
firewall-cmd --reload

image.png

Zk集群主要操作命令如下:

  • 服务端命令

在所有机器上执行:
/opt/zk/app/apache-zookeeper-3.6.1-bin/bin/zkServer.sh start/stop/status/restart ##启动/停止/查询状态/重启 zk服务
image.png
可见zk集群成功,1个leader和2个follower。

  • 客户端命令

在所有机器上执行:
/opt/zk/app/apache-zookeeper-3.6.1-bin/bin/zkCli.sh ##连接本地服务器,默认是2181端口
/opt/zk/app/apache-zookeeper-3.6.1-bin/bin/zkCli.sh -server ip:port ##连接指定zk服务器和端口

3. 交互式命令行使用

ZooKeeper是通过客户端脚本来操作的。客户端脚本:zkCli.sh,存放在ZooKeeper的bin目录下。
默认连接本地的ZooKeeper服务器:#zkCli.sh
连接指定的ZooKeeper服务器:#zkCli.sh –server Server IP:port
在cent7a上运行:
/opt/zk/app/apache-zookeeper-3.6.1-bin/bin/zkCli.sh -server 192.168.0.112:2181 ,显示如下:
执行:/opt/zk/app/apache-zookeeper-3.6.1-bin/bin/zkCli.sh -server 192.168.0.112:2181
image.png

命令行工具的一些简单操作如下:

1) 显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容
2) 显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据
3) 创建文件,并设置初始内容: create /zk "test" 创建一个新的 znode节点“ zk ”以及与它关联的字符串
4) 获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串
5) 修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置
6) 删除文件: delete /zk 将刚才创建的 znode 删除
7) 退出客户端: quit
8) 帮助命令: help

4. Java API 使用

Zookeeper提供了丰富的java api 。后续可直接在附件的java工程中详见。这里重点需要提及的是:zookeeper的JAVA API接口强烈推荐使用它的高级封装接口CuratorFramework,而切不要使用它的原生接口,因为原生接口很原始,很多功能需要自己重新生效,很不好用。而高级封装接口CuratorFramework作了很多大量优秀的高级抽象封装,使用非常方便。

JAVA api demo源代码见附件esproj.zip文件中java工程zk目录。

5. Zookeeper可视化工具 ZooInspector使用

Zookeeper 有很多可视化工具,其中一个轻便易用的工具是ZooInspector. 程序包是:ZooInspector.zip (该文件附于项目交付清单中) 。解压后 直接在windows上双击 ZooInspector/build/ zookeeper-dev-ZooInspector.jar 即可打开图形界面如下:
image.png

你可能感兴趣的