一、ZK单机模式

安装与部署

安装java环境并验证

java -version

下载安装zk(镜像为阿里云镜像)

wget https://mirrors.aliyun.com/apache/zookeeper/zookeeper-3.5.10/apache-zookeeper-3.5.10-bin.tar.gz

mv ./apache-zookeeper-3.5.10-bin.tar.gz /usr/local/ && cd /usr/local tar -zxvf apache-zookeeper-3.5.10-bin.tar.gz cd apache-zookeeper-3.5.10-bin && ll

拷贝conf/zoo_sample.cfg配置文件重命名为zoo.cfg

cp conf/zoo_sample.cfg conf/zoo.cfg && ll conf

启动zk

bin/zkServer.sh start conf/zoo.cfg

检测是否启动成功,然后zkCli.sh连接服务端验证

ps -ef|grep zookeeper

bin/zkCli.sh -server 192.168.126.132:2181

zoo.cfg配置说明

配置属性描述tickTime用于配置Zookeeper中最小时间单位的长度,很多运行时的时间间隔都是使用tickTime的倍数来表示initLimit用于配置Leader服务器等待Follower启动,并完成数据同步的时间。Follower服务器再启动过程中,会与Leader建立连接并完成数据的同步,从而确定自己对外提供服务的起始状态。Leader服务器允许Follower再initLimit 时间内完成这个工作syncLimitLeader 与Follower心跳检测的最大延时时间dataDir表示Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里clientPort表示是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求server.A=B:C:D:E其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。如果需要通过添加不参与集群选举以及事务请求的过半机制的Observer节点,可以在E的位置,添加observer标识

基本操作命令

创建节点

create [‐s] [‐e] [‐c] [‐t ttl] path [data] [acl]

#创建持久节点(不加任何参数,默认创建持久节点) create /persistNodes #创建持久顺序节点 create -s /persistNodes/prefix- #创建临时节点(注意:临时节点不能创建子节点) create -e /tempNodes #创建临时顺序节点(注意:临时节点不能创建子节点) create -e -s /tempSeqNodes-

#创建子节点(注意:zk以节点组织数据,只有绝对路径,没有相对路径,所有节点必须以“/”开头) create /persistNodes/persistSubNode

#创建容器节点(容器节点在zk3.5.3版本新增,用来存放子节点,若没有子节点则跟持久节点一样,不过会在未来被zk默认60s检查一次的定义任务自动清除掉,若有子节点则容器节点生命周期跟其子节点一样,当其子节点被清空时则zk也会将其一并删除) create -c /containerNodes

#创建过期时间节点(TTL节点在被创建后过了TTL时间会被服务器删除,注意:TTL节点需要通过系统参数-Dzookeeper.extendedTypesEnabled=true启用过期节点支持,默认禁用,且不稳定) create -t 5000 /ttlNode

删除节点

delete /persistNodes/prefix-0000000000

修改节点数据

set /persistNodes/persistSubNode user:jeffrey

携带版本号修改节点数据(应用场景:分布式乐观锁) set -v 1 /persistNodes/persistSubNode user:qiutee

查看节点数据及节点状态信息

#查看节点数据 get /persistNodes/persistSubNode #查看节点状态信息 stat /persistNodes/persistSubNode

节点状态信息:

参数含义cZxid创建znode的事务IDctime创建znode的时间mZxid最后修改znode的事务IDmtime最近修改znode的时间pZxid最后添加或删除子节点的事务IDcversionznode子节点结果集版本(一个节点的增加或删除子节点都会影响这个版本)dataVersionznode当前数据版本aclVersionznode当前acl版本ephemeralOwnerznode为临时节点时表示znode所有者的sessionID,若为非临时节点则值为0x0dataLengthznode数据字段的长度numChildrenznode的子节点的数量

#查看节点数据的同时查看节点状态信息 get -s /persistNodes/persistSubNode

#查看子节点信息 ls /persistNodes #递归查看子节点列表 ls -R /persistNodes

事件监听机制

节点事件监听:节点修改或删除时对应客户端将被通知 一旦事件触发,对应的注册立刻被移除,事件监听是一次性的目录事件监听:目录有子节点被创建或被删除时客户端将被通知 目录变化触发事件,对应的监听被移除,后续对节点创建没有触发监听事件递归子目录事件监听:目录下任意子节点有被创建或被删除或者根节点有数据变化时客户端将被通知 递归子节点,监听的是所有子节点,所以每个子节点下面的事件同样只会被触发一次

事件监听类型

None:连接建立事件NodeCreated:节点创建事件NodeDeleted:节点删除事件NodeDataChanged:节点数据变化事件NodeChildrenChanged:子节点里列表变化事件DataWatchRemoved:节点监听移除事件ChildWatchRemoved:子节点监听移除事件

操作示例

对节点监听

#查看数据并对节点进行监听 get -w /persistNodes/persistSubNode

#获取节点状态信息并对节点进行监听 stat -w /persistNodes/persistSubNode

对目录监听

ls -w /

对递归子目录监听(注意:R要大写)

ls -R -w /

ACL权限控制

zk ACL可以控制节点的读写操作,保证数据安全。ACL权限设置分为三个部分:权限模式、授权对象、权限信息。 通过系统参数zookeeper.skipACL=yes进行配置,默认是no,可以配置为true, 则配置过的ACL将不再进行权限检测

权限模式

范围验证:针对某一个IP或某一段IP授予某种权限口令验证:类似用户名密码Digest认证方式,客户端发送类似"username:password"标识符,服务端对密码部分进行SHA-1和BASE64算法加密Super权限模式:一种特殊的Digest,可以对zk上任意数据节点进行任意操作

授权对象

即把权限赋予谁,范围验证模式可以是一个IP或一段IP,口令验证或Super模式可以是用户名,World模式中是授权系统所有的用户

权限信息

数据节点(c: create)创建权限,授予权限的对象可以在数据节点下创建子节点 数据节点(w: wirte)更新权限,授予权限的对象可以更新该数据节点; 数据节点(r: read)读取权限,授予权限的对象可以读取该节点的内容以及子节点的列表信息; 数据节点(d: delete)删除权限,授予权限的对象可以删除该数据节点的子节点; 数据节点(a: admin)管理者权限,授予权限的对象可以对该数据节点体进行 ACL 权限设置;

#xshell生成授权ID:echo ‐n : | openssl dgst ‐binary ‐sha1 | openssl base64 #代码生成授权ID:DigestAuthenticationProvider.generateDigest(“gj:test”);

#获取节点权限信息 getAcl /persistNodes #设置节点权限信息 setAcl /persistNodes digest:gj:X/NSthOB0fD/OT6iilJ55WJVado=:cdrwa #输入认证授权信息, 相当于注册用户信息,注册时输入明文密码,zk将以密文的形式存储 addauth digest gj:test

授权模式: auth明文授权 IP授权 Super超级管理员授权

二、ZK集群模式

安装与部署

本次示例为伪集群环境搭建,包含一个Leader、两个Follower和一个Observer节点;

基于上文zookeeper已下载安装的条件,下面介绍集群搭建步骤:

创建4个节点目录用于存放对应节点实例的配置文件分别为node1~node4,然后创建4个对应存放myid数据的目录分别为zkdata-1 ~ zkdata-4,目录中再创建各自实例标识ServerID的myid文件,myid文件中编辑并保存各自实例的ServerID分别为1, 2, 3, 4. 从zk安装目录(/usr/local/zookeeper-3.5.10)拷贝一份zoo_sample.cfg配置文件到集群目录下并重命名为zoo.cfg,修改zoo.cfg文件

cp /usr/local/zookeeper-3.5.10/conf/zoo_sample.cfg ./node1/2181/zoo.cfg vi node1/2181/zoo.cfg

#设置zk snapshot保存的目录 dataDir=/usr/local/zookeeper-cluster/zkdata-1 #设置zk实例对外客户端暴露的端口 clientPort=2181 #设置zk集群节点元数据信息,后面的participant可以不用写,zk实例默认为participant server.1=127.0.0.1:2001:3001:participant server.2=127.0.0.1:2002:3002:participant server.3=127.0.0.1:2003:3003:participant server.4=127.0.0.1:2004:3004:observer

:wq

其余三个节点实例配置同理,重复步骤2,只需修改对应dataDir和clientPort即可(也可选择拷贝node1/2181中的zoo.cfg配置)

cp node1/2181/zoo.cfg node2/2182/zoo.cfg cp node1/2181/zoo.cfg node3/2183/zoo.cfg cp node1/2181/zoo.cfg node4/2184/zoo.cfg

vi node2/2182/zoo.cfg dataDir=/usr/local/zookeeper-cluster/zkdata-2 clientPort=2182 :wq

vi node3/2183/zoo.cfg dataDir=/usr/local/zookeeper-cluster/zkdata-3 clientPort=2183 :wq

vi node4/2184/zoo.cfg dataDir=/usr/local/zookeeper-cluster/zkdata-4 clientPort=2184 :wq

启动zk集群

/usr/local/zookeeper-3.5.10/bin/zkServer.sh start ./node1/2181/zoo.cfg /usr/local/zookeeper-3.5.10/bin/zkServer.sh start ./node2/2182/zoo.cfg /usr/local/zookeeper-3.5.10/bin/zkServer.sh start ./node3/2183/zoo.cfg /usr/local/zookeeper-3.5.10/bin/zkServer.sh start ./node4/2184/zoo.cfg

5. 验证集群

zkServer.sh status zoo.cfg验证每个zk节点实例的状态

/usr/local/zookeeper-3.5.10/bin/zkServer.sh status ./node1/2181/zoo.cfg /usr/local/zookeeper-3.5.10/bin/zkServer.sh status ./node2/2182/zoo.cfg /usr/local/zookeeper-3.5.10/bin/zkServer.sh status ./node3/2183/zoo.cfg /usr/local/zookeeper-3.5.10/bin/zkServer.sh status ./node4/2184/zoo.cfg

zkCli.sh -server ip1:port1,ip2:port2,ip3:port3验证客户端连接集群

/usr/local/zookeeper-3.5.10/bin/zkCli.sh -server 192.168.126.132:2181,192.168.126.132:2182,192.168.126.132:2183,192.168.126.132:2184

任意连接集群某一节点实例,可通过zk节点/zookeeper/config查看集群元数据配置信息

/usr/local/zookeeper-3.5.10/bin/zkCli.sh -server 192.168.126.132:2181 get /zookeeper/config

集群动态配置

zk3.5.0之前的版本,zk集群角色要发生改变,只能通过停掉所有的zk服务,修改集群配置,重启服务来完成,这样集群服务将有一段不可用的状态; zk3.5.0提供了支持动态扩容与缩容的新特性,zk3.5.3版本要用动态配置需要超管身份验证ACL,若环境安全则可以使用系统参数 -Dzookeeper.skipACL=yes 来避免配置维护ACL权限配置

配置超管授权模式

将系统参数添加到zkServer.sh启动脚本中

#shell生成加密后的身份信息 echo -n jeffrey:666 | openssl dgst -binary -sha1 | openssl base64 加密后的身份信息: 7kncraoFvQC513B49+XN1E5/c3c= #java生成授权ID DigestAuthenticationProvider.generateDigest(“jeffrey:666”)

#zkServer.sh启动脚本中添加系统参数(添加位置同下) -Dzookeeper.DigestAuthenticationProvider.superDigest=jeffrey:7kncraoFvQC513B49+XN1E5/c3c=

为便于演示,本次示例采用通过系统参数方式跳过ACL权限配置,在zkServer.sh启动脚本中配置如下:

创建动态配置文件 为zk集群的每个节点实例配置动态文件zoo.dynamic.cfg,动态配置文件中加入集群信息: server.A=B.C.D.E;F A: 服务的唯一标识 B: 服务对应的IP地址, C: 集群通信端口 D: 集群选举端口 E: 角色, 默认是 participant,即参与过半机制的角色,选举,事务请求过半提交,还有一个是 observer, 观察者,不参与选举以及过半机制。 之后一定要是一个分号, F:服务IP:端口

touch node1/2181/zoo.dynamic.cfg vi node1/2181/zoo.dynamic.cfg

server.1=192.168.126.132:2001:3001:participant;192.168.126.132:2181 server.2=192.168.126.132:2002:3002:participant;192.168.126.132:2182 server.3=192.168.126.132:2003:3003:participant;192.168.126.132:2183 server.4=192.168.126.132:2004:3004:observer;192.168.126.132:2184

:wq

#拷贝zoo.dynamic.cfg动态配置文件到其他三个节点目录下 cp node1/2181/zoo.dynamic.cfg node2/2182/zoo.dynamic.cfg cp node1/2181/zoo.dynamic.cfg node3/2183/zoo.dynamic.cfg cp node1/2181/zoo.dynamic.cfg node4/2184/zoo.dynamic.cfg

分别修改各节点实例对应的zoo.cfg配置文件

vi node1/2181/zoo.cfg

#开启动态配置 reconfigEnabled=true #指定动态配置文件的位置 dynamicConfigFile=/usr/local/zookeeper-cluster/node1/2181/zoo.dynamic.cfg #注释掉对外客户端暴露的端口号clientPort #clientPort=2181 #注释掉之前配置的集群节点元数据信息 #server.1=127.0.0.1:2001:3001:participant #server.2=127.0.0.1:2002:3002:participant #server.3=127.0.0.1:2003:3003:participant #server.4=127.0.0.1:2004:3004:observer

:wq

其他三个节点实例同理,重复步骤四操作,修改对应动态配置文件位置即可

依次重启所有节点实例并查看集群状态

zkCli.sh连接任一节点实例验证集群

/usr/local/zookeeper-3.5.10/bin/zkCli.sh -server 192.168.126.132:2181

#查看集群配置信息 config #也可直接通过/zookeeper/config节点查看集群配置信息 get /zookeeper/config

修改集群状态信息

前提:已通过zkCli.sh客户端连接上(任一)集群节点实例

如果添加了ACL权限,则需要授权登录后才可以进行修改

addauth digest jeffrey:666

如果跳过了ACL权限,则可直接进行修改

#从集群中移除serverID为3的节点实例 reconfig -remove 3 #向集群中添加serverID为3的节点实例 reconfig -add server.3=192.168.126.132:2003:3003:participant;192.168.126.132:2183

如果要添加新的节点实例或者要变更节点实例时,需要将节点实例的信息手动添加到集群节点对应动态配置文件zoo.dynamic.cfg中,然后重启集群节点实例,再通过reconfig命令进行添加或变更实例角色; 需要注意的是:由于过半机制,添加或变更集群节点实例需要保证节点实例列表中的participant角色能够形成集群。

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: