日期 | 作者 | 版本 | 备注 |
---|---|---|---|
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 zkvim /etc/group 会发现最初一行有zk用户组adduser -g zk zk创立zk用户,同时退出zk用户组,主动创立zk的homedir为/home/zkvim /etc/passwd 能够看到最初一行是zk用户。passwd zk为zk用户新设立明码将zk用户退出sudo权限留神:本步骤非必须,可选。chmod +w /etc/sudoersvim /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/confmv zoo_sample.cfg zoo.cfgvim zoo.cfg 批改如下:
其中clientPort 2181是客户端连贯zk集群的端口,dataDir和dataLogDir别离是数据目录和日志目录。文件最初的3行是用于zk集群互联。
server.A = B:C:DA: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 firewalldfirewall-cmd --zone=public --add-port=2181/tcp --permanentfirewall-cmd --zone=public --add-port=2888/tcp --permanentfirewall-cmd --zone=public --add-port=3888/tcp --permanentfirewall-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) 退出客户端: quit8) 帮忙命令: 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 即可进入可视化界面: