Zookeeper是一个为分布式应用提供一致性协调服务的中间件,主要用来解决分布式应用中经常遇到的一些一致性问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。本文主要包括Zookeeper简介、安装、命令行操作r等;文中所使用到的软件版本:Java 1.8.0_191、Zookeeper 3.6.0、Centos 7.6。 1、简介1.1、设计目标ZooKeeper is simple. ZooKeeper是简单、可复制、有序、快速的。 1.2、数据模型和层次命名空间ZooKeeper提供的命名空间与标准文件系统的命名空间非常类似。命名空间由一系列路径组成,用/分隔。ZooKeeper命名空间中的每个节点使用一个具体路径来标识。ZooKeeper的层次命名空间结构如下: 1.3、节点与标准文件系统不同的是,ZooKeeper命名空间的每个节点可以保存数据,就像一个文件系统中的文件,它既是文件也是目录。ZooKeeper用来存储状态信息、配置、位置信息等,因此存储在每个节点上的数据通常很小,在字节到千字节范围内。有四种类型的节点: 临时节点(EPHEMERAL):会话结束该节点自动被删除,临时节点不能拥有子节点 注:顺序节点中序列号对于此节点的父节点是唯一的,它是一个10位的数字,如果这个序列号大于2^32-1就会溢出。 1.4、更新和监视客户端可以监视一个节点,当该节点发生变化时会,客户端会收到该节点变化的通知;一个监视器只会触发一次,触发后会删除该监视器。如果客户端和其中一个ZooKeeper服务器之间的连接中断,则客户端将收到一个本地通知。 1.5、状态信息zxid:zookeeper每次状态改变都收到一个zxid(ZooKeeper Transaction Id),zxid是全局有序的,每次更新都会产生一个新的,且后面的大于前面的。 通过stat [-w] path可以查看节点的具体状态信息: cZxid 创建节点时的事务ID 1.6、特性ZooKeeper的目标是作为构建其他复杂服务的基石,因此它提供了一系列的特性: 一致性:数据一致性, 数据按照顺序分批入库 2、zoo.cfg参数说明clientPort zookeeper服务器对客户端暴露的端口 3、安装3.1、单机版安装3.1.1、下载并解压Zookeeper下载地址:http://zookeeper./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.2、集群安装假设在172.17.139.160、172.17.139.161、172.17.139.162三台机器上安装。 3.2.1、下载并解压Zookeeper(每台机器)下载地址:http://zookeeper./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 #停止
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:显示节点状态信息 如:ls / 4.2、创建节点create [-s] [-e] [-c] [-t ttl] path [data] [acl] -s:顺序节点 如:create /test test 4.3、查看节点get [-s] [-w] path -s:显示状态 如:get /test 4.4、设置节点set [-s] [-v version] path data -s:返回状态信息 如: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:返回状态信息 4.7、查看权限getAcl [-s] path -s:返回状态信息 5、权限控制ACL(Access Control List)ZooKeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限,子节点不会继承父节点的权限;ACL由三个字段组成:schema:id:permission。 5.1、schema(权限模式)world 只有一个id,anyone,代表所有人 5.2、id(授权对象)权限赋予的用户或者一个实体 word对应的id只有一个:anyone 5.3、permission(权限)CREATE(c) 可以创建子节点 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即可。 |
|