赞
踩
java -version
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
cp conf/zoo_sample.cfg conf/zoo.cfg && ll conf
bin/zkServer.sh start conf/zoo.cfg
ps -ef|grep zookeeper
bin/zkCli.sh -server 192.168.126.132:2181
配置属性 | 描述 |
---|---|
tickTime | 用于配置Zookeeper中最小时间单位的长度,很多运行时的时间间隔都是使用tickTime的倍数来表示 |
initLimit | 用于配置Leader服务器等待Follower启动,并完成数据同步的时间。Follower服务器再启动过程中,会与Leader建立连接并完成数据的同步,从而确定自己对外提供服务的起始状态。Leader服务器允许Follower再initLimit 时间内完成这个工作 |
syncLimit | Leader 与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的事务ID |
ctime | 创建znode的时间 |
mZxid | 最后修改znode的事务ID |
mtime | 最近修改znode的时间 |
pZxid | 最后添加或删除子节点的事务ID |
cversion | znode子节点结果集版本(一个节点的增加或删除子节点都会影响这个版本) |
dataVersion | znode当前数据版本 |
aclVersion | znode当前acl版本 |
ephemeralOwner | znode为临时节点时表示znode所有者的sessionID,若为非临时节点则值为0x0 |
dataLength | znode数据字段的长度 |
numChildren | znode的子节点的数量 |
#查看节点数据的同时查看节点状态信息
get -s /persistNodes/persistSubNode
#查看子节点信息
ls /persistNodes
#递归查看子节点列表
ls -R /persistNodes
#查看数据并对节点进行监听
get -w /persistNodes/persistSubNode
#获取节点状态信息并对节点进行监听
stat -w /persistNodes/persistSubNode
ls -w /
ls -R -w /
zk ACL可以控制节点的读写操作,保证数据安全。ACL权限设置分为三个部分:权限模式、授权对象、权限信息。
通过系统参数zookeeper.skipACL=yes进行配置,默认是no,可以配置为true, 则配置过的ACL将不再进行权限检测
即把权限赋予谁,范围验证模式可以是一个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超级管理员授权
本次示例为伪集群环境搭建,包含一个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
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
/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. 验证集群
/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
/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
/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启动脚本中配置如下:
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
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
其他三个节点实例同理,重复步骤四操作,修改对应动态配置文件位置即可
/usr/local/zookeeper-3.5.10/bin/zkCli.sh -server 192.168.126.132:2181
#查看集群配置信息
config
#也可直接通过/zookeeper/config节点查看集群配置信息
get /zookeeper/config
前提:已通过zkCli.sh客户端连接上(任一)集群节点实例
addauth digest jeffrey:666
#从集群中移除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角色能够形成集群。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。