Zookeeper入门实战(1)-概念、安装及命令行
Zookeeper是一个为分布式应用提供一致性协调服务的中间件,主要用来解决分布式应用中经常遇到的一些一致性问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。本文主要包括Zookeeper简介、安装、命令行操作等;文中所使用到的软件版本:Java 1.8.0_191、Zookeeper 3.6.0、Centos 7.6。
1、简介
1.1、设计目标
ZooKeeper is simple.
ZooKeeper is replicated.
ZooKeeper is ordered.
ZooKeeper is fast.
ZooKeeper是简单、可复制、有序、快速的。
1.2、数据模型和层次命名空间
ZooKeeper提供的命名空间与标准文件系统的命名空间非常类似。命名空间由一系列路径组成,用/分隔。ZooKeeper命名空间中的每个节点使用一个具体路径来标识。ZooKeeper的层次命名空间结构如下:
1.3、节点
与标准文件系统不同的是,ZooKeeper命名空间的每个节点可以保存数据,就像一个文件系统中的文件,它既是文件也是目录。ZooKeeper用来存储状态信息、配置、位置信息等,因此存储在每个节点上的数据通常很小,在字节到千字节范围内。有四种类型的节点:
临时节点(EPHEMERAL):会话结束该节点自动被删除,临时节点不能拥有子节点
临时顺序节点(EPHEMERAL_SEQUENTIAL):具有临时节点特征,但是它会在节点名称后面增加一个序列号,分布式锁中会用到该类型节点
持久节点(PERSISTENT):创建后永久存在,可以自动删除;也可以设置一个存活时间,当指定存活时间过去以后,如果相应的节点没有得到更新且没有直接的,就会被自动删除
持久顺序节点(PERSISTENT_SEQUENTIAL):具有持久节点特征,但是它会在节点名称后面增加一个序列号
注:顺序节点中序列号对于此节点的父节点是唯一的,它是一个10位的数字,如果这个序列号大于2^32-1就会溢出。
1.4、更新和监视
客户端可以监视一个节点,当该节点发生变化时会,客户端会收到该节点变化的通知;一个监视器只会触发一次,触发后会删除该监视器。如果客户端和其中一个ZooKeeper服务器之间的连接中断,则客户端将收到一个本地通知。
1.5、状态信息
zxid:zookeeper每次状态改变都收到一个zxid(ZooKeeper Transaction Id),zxid是全局有序的,每次更新都会产生一个新的,且后面的大于前面的。
版本:每次节点改变都会使该节点的版本号增加,有三中版本号:dataversion(数据版本号)、cversion(子节点版本号)、aclversion(节点所拥有的ACL版本号)
通过stat [-w] path可以查看节点的具体状态信息:
cZxid 创建节点时的事务ID
ctime 创建节点时的时间
mZxid 最后修改节点的事务ID
mtime 最后修改节点的时间
pZxid 该节点的子节点最后一次修改的事务ID,添加子节点或删除子节点就会影响子节点列表,但是修改子节点的数据内容则不影响该ID
cversion 子节点版本号,子节点每次修改版本号加1
dataversion 数据版本号,数据每次修改该版本号加1
aclversion 权限版本号,权限每次修改该版本号加1
ephemeralOwner 节点的会话id,只有临时节点有,持久节点值为0
dataLength 节点的数据长度
numChildren 节点的子节点数量
1.6、特性
ZooKeeper的目标是作为构建其他复杂服务的基石,因此它提供了一系列的特性:
一致性:数据一致性, 数据按照顺序分批入库
原子性:事务要么成功要么失败
单一视图:客户端连接集群中的任意zk节点, 数据都是一致的
可靠性:每次对zk的操作状态都会保存在服务端
实时性::客户端可以读取到zk服务端的最新数据
2、zoo.cfg 常用参数说明
参数 | 说明 | |
clientPort | zookeeper 端口 | |
dataDir | zookeeper 存放快照文件的目录 | |
dataLogDir | zookeeper 存放事务日志文件的目录,默认与 dataDir 一致。这允许使用专用的日志设备,有助于避免日志和快照之间的竞争。 | |
tickTime | 单个 tick 的长度,即 zooKeeper 使用的基本时间单位,以毫秒为单位。它用于调节心跳和超时。例如,最小会话超时将为两个 ticks。 | |
initLimit | 允许 followers 连接和同步到 leader 的时间量,以 ticks 为单位。如果 ZooKeeper 管理的数据量较大,根据需要增加此值。 | |
syncLimit | 允许 followers 与 ZooKeeper 同步的时间量,以 ticks 为单位。如果 followers 落后于 leader 太多,它们将被丢弃。 | |
globalOutstandingLimit | 客户端提交请求速度可能超过 Zookeeper 的处理速度,特别是如果有大量客户端的话。为了防止 ZooKeeper 因排队请求而耗尽内存,ZooKeeper 将限制客户端,以确保系统中的未完成请求不超过 globalOutstandingLimit。默认限制为 1,000。 | |
snapCount | ZooKeeper 使用快照和事务日志(类似于预写日志)记录其事务。在可以进行快照(以及事务日志滚动)之前,事务日志中记录的事务数量由snapCount 决定。为了防止集群中的所有机器同时进行快照,每个ZooKeeper 服务器在[snapCount/2+1, snapCount]范围内随机值生成一个数,当事务数量达到该值时进行快照。默认的 snapCount 值为 100,000。 | |
maxClientCnxns | 单客户端(根据 IP 地址识别)最大并发连接数。默认为 60。 | |
electionAlg | 设置选举算法。1:非身份验证的基于 UDP 的快速选举;2:经身份验证的基于 UDP 的快速选举;3:基于 TCP 的快速选举。默认值为 3。 | |
leaderServes | 领导者是否接受客户端连接。领导者负责协调更新操作。为了在轻微牺牲读取吞吐量的情况下提高更新吞吐量,可以将领导者配置为不接受客户端连接,而专注于协调工作。默认值是 yes,意味着领导者将接受客户端连接。 | |
skipACL | 是否跳过 ACL 检查。跳过 ACL 检查会提高吞吐量,但会向所有人开放对数据的完全访问权限。 | |
autopurge.snapRetainCount | New in 3.4.0。启用自动清理功能后,保留最近的快照以及相应事务日志的数量,删除其余的快照和事务日志。默认值为 3,最小值也是 3。 | |
autopurge.purgeInterval | New in 3.4.0。执行清理任务的时间间隔,单位为小时。将其设置为正整数以启用自动清理功能。默认值为 0,表示禁用自动清理功能。 | |
server.id | 配置 zookeeper 集群的机器列表,其中 id 为 zookeeper 实例 id,与 ${dataDir}/myid 文件中的值对应。第一个端口用于指定 Leader 和 Follewer 通信及数据同步所使用的端口,第二个端口用于Leader 选举过程中的投票通信。 | |
standaloneEnabled | New in 3.5.0。当设置为 false 时,单个服务器可以在复制模式下启动,单个参与者可以在观察者的陪同下运行,并且集群可以重新配置为一个节点,也可以从一个节点配置为多个节点。默认值为 true,以保持向后兼容性。 | |
reconfigEnabled | 是否启用动态重配置功能,默认值为 false。如果设置了该参数,则该参数的值应该在整个集群中的每个服务器上保持一致。 | |
dynamicConfigFile | 设置动态配置文件。 | |
AdminServer configuration | ||
admin.enableServer | New in 3.5.0。是否启用 AdminServer,默认为 true | |
admin.serverPort | New in 3.5.0。设置 AdminServer 的端口,默认 8080 | |
Metrics Providers | New in 3.6.0。默认情况下,ZooKeeper 通过 AdminServer 提供度量信息;从3.6.0开始,可以配置不同的度量提供者,将度量信息导出到其他系统。从3.6.0 开始,ZooKeeper 捆绑了与 Prometheus 的集成。 | |
metricsProvider.className | Prometheus 度量提供者类名,org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider。 | |
metricsProvider.httpPort | Prometheus 度量提供者端口,默认为 7000;Prometheus 的端点通常是 http://hostname:httPort/metrics | |
metricsProvider.exportJvmInfo | 是否输出 JVM 的信息,默认为 true。 |
3、安装
3.1、单机版安装
3.1.1、下载并解压Zookeeper
下载地址:http://zookeeper.apache.org/releases.html
解压:tar zxvf zookeeper-3.6.0.tar.gz
3.1.2、修改配置文件
zoo.cfg默认不存在,可以从zoo_sample.cfg conf拷贝一份:
cd /home/hadoop/app/apache-zookeeper-3.6.0-bin/conf
cp zoo_sample.cfg zoo.cfg
配置文件zoo.cfg中的内容可以使用文件中的默认值,也可以根据实际需要修改配置项:
dataDir=/home/hadoop/app/apache-zookeeper-3.6.0-bin/data
3.1.3、启动停止
cd /home/hadoop/app/apache-zookeeper-3.6.0-bin/bin
zkServer.sh start #启动
zkServer.sh stop #停止
3.1.4、查看日志
cd /home/hadoop/app/apache-zookeeper-3.6.0-bin/bin tail -f zookeeper.out
3.2、集群安装
假设在172.17.139.160、172.17.139.161、172.17.139.162三台机器上安装。
3.2.1、下载并解压Zookeeper(每台机器)
下载地址:http://zookeeper.apache.org/releases.html
解压:tar zxvf zookeeper-3.6.0.tar.gz
3.2.2、修改zoo.cfg配置文件(每台机器)
zoo.cfg默认不存在,可以从zoo_sample.cfg conf拷贝一份:
cd /home/hadoop/app/apache-zookeeper-3.6.0-bin/conf
cp zoo_sample.cfg zoo.cfg
zoo.cfg中集群与单机的配置不同的地方是server.id参数,其他根据实际需要修改配置项:
dataDir=/home/hadoop/app/apache-zookeeper-3.6.0-bin/data server.1=172.17.139.160:2555:3555 server.2=172.17.139.161:2555:3555 server.3=172.17.139.162:2555:3555
3.2.3、创建myid文件(每台机器)
在dataDir(/home/hadoop/app/apache-zookeeper-3.6.0-bin/data)目录下创建myid文件,文件内容为该zookeeeper在集群中的id,对应上面zoo.cfg中server.后的数字。
172.17.139.160:/home/hadoop/app/apache-zookeeper-3.6.0-bin/data/myid 文件内容:
1
172.17.139.161:/home/hadoop/app/apache-zookeeper-3.6.0-bin/data/myid 文件内容:
2
172.17.139.162:/home/hadoop/app/apache-zookeeper-3.6.0-bin/data/myid 文件内容:
3
3.2.4、启动停止(每台机器)
cd /home/hadoop/app/apache-zookeeper-3.6.0-bin/bin
zkServer.sh start #启动
zkServer.sh stop #停止
3.2.5、查看集群状态
./zkServer.sh status
4、命令行
bin/zkCli.sh可以启动一个客户端连接到Zookeeper:
bin/zkCli.sh [-server host:port]
不加server参数,默认连接到本地2181端口;启动后可以输入help/h查看使用方法:
[zk: localhost:2181(CONNECTED) 4] help ZooKeeper -server host:port cmd args addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE addauth scheme auth close config [-c] [-w] [-s] connect host:port create [-s] [-e] [-c] [-t ttl] path [data] [acl] delete [-v version] path deleteall path [-b batch size] delquota [-n|-b] path get [-s] [-w] path getAcl [-s] path getAllChildrenNumber path getEphemerals path history listquota path ls [-s] [-w] [-R] path printwatches on|off quit reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*] redo cmdno removewatches path [-c|-d|-a] [-l] set [-s] [-v version] path data setAcl [-s] [-v version] [-R] path acl setquota -n|-b val path stat [-w] path sync path version Command not found: Command not found help [zk: localhost:2181(CONNECTED) 5]
4.1、列出子节点
ls [-s] [-w] [-R] path
-s:显示节点状态信息
-w:监听该节点
-R:递归查看所有子节点
如:ls /
4.2、创建节点
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
-s:顺序节点
-e:临时节点
-t:设置存活时间(针对持久节点,单位秒);需要开启,默认是关闭的,参见第6小节:TTL(Time To Life)
acl:权限控制
如:create /test test
4.3、查看节点
get [-s] [-w] path
-s:显示状态
-w:监听该节点
如:get /test
4.4、设置节点
set [-s] [-v version] path data
-s:返回状态信息
-v:设置版本信息
如:set /test testaa
4.4、查看节点状态
stat [-w] path
-w:监视该节点
如:stat /test
4.5、删除节点
delete [-v version] path
-v:指定版本信息
如:delete /test
4.6、设置权限
setAcl [-s] [-v version] [-R] path acl
-s:返回状态信息
-v:指定版本信息
-R:递归设置权限
4.7、查看权限
getAcl [-s] path
-s:返回状态信息
5、权限控制ACL(Access Control List)
ZooKeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限,子节点不会继承父节点的权限;ACL由三个字段组成:schema:id:permission。
5.1、schema(权限模式)
world 只有一个id,anyone,代表所有人
auth 使用已添加认证的用户认证
digest 使用“用户名:密码”方式认证
ip 使用IP地址认证
x509 使用客户端X500 Principal认证
5.2、id(授权对象)
权限赋予的用户或者一个实体
word对应的id只有一个:anyone
digest自定义id,通常为“usernmae:BASE64(SHA-1(username:password))”
ip对应的id为一个ip或ip段,如10.49.196.10、10.49.196.0、24
5.3、permission(权限)
CREATE(c) 可以创建子节点
READ(r) 可以读取节点数据及显示子节点列表
WRITE(w) 可以设置节点数据
DELETE(d) 可以删除子节点(仅下一级节点)
ADMIN(a) 可以设置节点权限
5.4、例子
5.4.1、word例子
setAcl /acltest world:anyone:cdrwa
创建节点时如果没有设置权限,这是默认的权限。
5.4.2、auth例子
addauth digest jack:123456 #先添加认证用户 setAcl /acltest auth:jack:cdrwa
再开一个终端需先添加认证用户(addauth digest jack:123456)才能访问/actltest
5.4.3、digest例子
echo -n jack:123456 | openssl dgst -binary -sha1 | openssl base64#得到密文tgi9UCnyPo5FJjVylKr05nAlWeg= setAcl /acltest digest:jack:tgi9UCnyPo5FJjVylKr05nAlWeg=:cdrwa
添加认证用户(addauth digest jack:123456)后才能访问/actltest。
5.4.4、ip例子
setAcl /acltest ip:10.49.196.10:cdrwa
10.49.196.10的机器才能访问/actltest。
6、TTL(Time To Life)
在zookeeper中,当创建一个PERSISTENT或者PERSISTENT_SEQUENTIAL节点的时候,可以有选择的给这个节点设置一个存活时间(TTL);当指定存活时间过去以后,如果该节点没有得到更新且没有直接的,就会被自动删除。
默认该特性是关闭的,如果需要设置java系统属性:zookeeper.extendedTypesEnabled;由于TTL节点是在3.5.3版本增加的,3.5.4/3.6.0版本并不支持,所以在3.5.4/3.6.0等其他版本还需设置另外一个java系统属性:Dzookeeper.emulate353TTLNodes。可以修改zkServer.sh脚本,增加:
-Dzookeeper.extendedTypesEnabled=true -Dzookeeper.emulate353TTLNodes=true
在zkServer.sh脚本里查找到start关键字,在如下图所示的地方增加上面的代码,如何重启Zookeeper即可。
7、AdminServer
AdminServer 提供了简单的 Zookeeper 状态信息查询功能,每个命令返回一个 json 字符串,AdminServer 默认 URL 为 http://ip:8080/commands。