Zookeeper 3.6.1 详尽用法指南

日期 做者 版本 备注
2020-04-15 dingbin v1.0

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

注意:java

安装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的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。node

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

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

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

  • 原理

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

ZooKeeper的基本运转流程:windows

一、选举Leader。
二、同步数据。
三、选举Leader过程当中算法有不少,但要达到的选举标准是一致的。
四、Leader要具备最高的执行ID,相似root权限。
五、集群中大多数的机器获得响应并follow选出的Leader。
  • 特色

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

那么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
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
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
image.png
此时进入zookeeper系统的交互模式。
此时键入h或help命令,能够看到交互模式下支持的命令选项,以下图:
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
键入上面搭建好的zookeeper集群192.168.0.112:2181 便可进入可视化界面:
image.png

相关文章
相关标签/搜索