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。

posted @ 2020-03-27 09:57  且行且码  阅读(949)  评论(0编辑  收藏  举报