乐趣区

关于zookeeper:Zookeeper-361-详尽用法指南

日期 作者 版本 备注
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 图所示:

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。

分布式 zookeeper(简称 zk)集群至多要求运行在 3 台或以上服务器上。本文讲述是基于装置在 3 台 vmware 虚拟机上,各虚拟机机器结点如下表:

本节应用的所有 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
增加如下行:

而后再 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 目录。

4)配置 zk

解压 zk 压缩包文件:apache-zookeeper-3.6.1-bin.tar.gz 到 /opt/zk/app 目录下:

在 cent7a 机器上执行:

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



其中 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:

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

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

至此,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


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

  • 服务端命令

在所有机器上执行:
/opt/zk/app/apache-zookeeper-3.6.1-bin/bin/zkServer.sh start/stop/status/restart ## 启动 / 进行 / 查问状态 / 重启 zk 服务

可见 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


此时进入 zookeeper 零碎的交互模式。
此时键入 h 或 help 命令, 能够看到交互模式下反对的命令选项,如下图:

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

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 即可关上图形界面如下:

键入下面搭建好的 zookeeper 集群 192.168.0.112:2181 即可进入可视化界面:

退出移动版