1.1集群中的角色
leader服务器:zookeeper集群的核心
follower服务器:zookeeper集群状态的跟随者
observer服务器:观察者
1.2会话
会话是指客户端与zookeeper服务器连接,客户端与服务器建立一个长的TCP的连接来维持一个session,客户端启动时首先与服务器建立一个TCP连接,通过这个连接,客户端能够通过心跳检测与服务器保持有效的对话,也能向服务器发送请求获取响应。
1.3数据节点
zookeeper中的数据节点有两类
集群中的一台机器称为一个节点;
数据模型中的数据单元Znode,分为持久节点和临时节点。
zookeeper就像一颗树,树的节点就是Znode
1.4版本号
version:当前数据节点数据内容的版本号
cversion:当前数据节点子节点的版本号
aversion:当前数据节点ACL变更版本号
在zookeeper中版本号一般是数据节点的变更次数,所以可以用来实现分布式锁
1.5事件监听器
zookeeper允许用户在指定节点上注册一些watcher,当数据节点发生变化的时候,zookeeper服务器会把变化通知给订阅的客户端。
1.6采用ACL策略进行权限控制
create:创建子节点的权限
read:获取节点数据和子节点列表的权限
write:更新节点列表的权限
delete:删除子节点列表的权限
admin:设置节点ACL的权限
ZooKeeper的模式分为三种,分别为:单机模式、集群模式和伪集群模式。
2.1 准备工作(集群模式)
使用vmware创建三个centos7的虚拟机,ip地址为,172.16.114.129,
172.16.114.130,172.16.114.133,必须安装java环境。
分别下载zookeeper包(3.4.6),将包下载到/opt目录下。
2.2 创建配置文件
zookeeper运行时默认加载conf的zoo.cfg文件,而在conf下有一份模版配置文件zoo_sample.cfg,复制这份模版并命名zoo.cfg。修改zoo.cfg。
dataDir:zookeeper存储快照文件的目录,可以改成/var/zookeeper
clientPort:zookeeper对外提供服务的端口号
配置服务器的格式:
server.id=host:port:port
id:服务器的id,为整数
host:服务器的ip地址
第一个port:follow服务器和leader服务器的通信端口
第二个port:用于leader选举过程中的投票通信端口
这里有三台服务器,所以配置三台(端口号不冲突就行)
server.1=172.16.114.129:2888:3888
server.2=172.16.114.130:2888:3888
server.3=172.16.114.133:2888:3888
2.3 启动服务器
在zookeeper的bin目录下有一些可执行文件
zkserver.sh 有几个参数
start:普通启动zookeeper服务器
start-foreground:启动zookeeper服务器,并在控制台打印出启动日志(这个启动日志在bin目录下zookeeper.out内)
stop:关闭服务器
restart:重启服务器
status:查看服务器状态
upgrade:升级zookeeper使用
print-cmd:查看zookeeper启动的各个参数,包括java路径等
这里启动zookeeper服务器
./zkServer.sh start
然后执行./zkServer.sh status查看启动状态
如果只启动了一台zookeeper肯定会报错,必须半数以上启动才成功。
伪集群模式:集群所有的机器都在一台机器上,但是还是以集群的特性对外提供服务。
配置文件:
server.1=172.16.114.129:2888:3888
server.2=172.16.114.129:2889:3889
server.3=172.16.114.129:2880:3880
单机模式:保留一台服务器
配置文件:
server.1=172.16.114.129:2888:3888
3.1建立连接
通过conf下的zkcli.sh,与服务器建立连接
./zkCli.sh -timeout 0 -r -server ip:port
timeout:与服务端建立连接的超时时间,通过心跳来判断连接的有效,如果在指定时间内没有收到心跳包,连接就失效。单位:毫秒
r:如果这个服务器也集群中半数以上服务器失去连接后,就不再处理客户端的请求,设置r可以使服务器对外只提供读服务。
./zkCli.sh -timeout 5000 -server 172.16.114.130:2181
3.2客户端命令
输入h:可以查看可使用的命令
基本归纳为对数据节点的增删改查
查询:
ls path:列出某个节点下的所有子节点的信息
例 ls / :列出根目录下所有的子节点信息
stat path:查看某个节点的状态信息
例 stat /node_3:node_3节点的状态信息
cZxid:zookeeper每一次写操作都是一次事务,代表事务id
ctime:当时创建的时间
mZxid:最后一次更新时的事务id
mtime:最后一次更新的时间
pZxid:最后一次修改子节点列表的事务id(子节点的添加删除,修改子节点数据内容不算在内)
cversion:子节点的版本号
dataVersion:数据版本号
aclVersion:权限版本号
ephemeralOnwer:临时节点版本号,如果是持久节点固定为0
datalength:数据的长度
numChildren:子节点的数目
get path:获取节点的数据内容
例 get /node_3
stat指令的内容也会输出
ls2 path:相当于 ls指令加上stat指令
创建:
create [-s] [-e] path data acl
-s:创建顺序节点
-e:创建临时节点
path:创建的路径
data:创建节点的数据内容
acl:创建节点的权限管理
加-s和不加的区别在于
所以可以利用顺序节点制作分布式的主键生成器
修改:
set path data [version]:version修改的版本号
版本号会自增,而当我们添加版本号参数时,版本号必须与当前版本号一致,否则修改失败,相当于验证版本号(和乐观锁类似)
删除:
delete path [version]:只能删除没有子节点的节点
rmr path:循环删除子节点
配额(限制子节点的个数与子节点数据值的长度):
setquota -n|-b val path:设置配额
-n:val代表所有子节点的个数(包括他自己)
-b:val代表所有子节点数据值的长度(包括他自己的数据值)
配额的设置不是不允许你超过这个值,而是超过后会以警告的形式记录到日志(zookeeper.out)中。
listquota path:查看配额信息
第一行:配额设置的完整路径
第二行:设置的配置信息,-1代表没做设置
第三行:当前节点的信息
delquota -n|-b path:删除配额
其他:
quit:结束当前客户端与服务端会话
connect host:port :与其他服务端建立连接
close:关闭与其他服务端的连接
history:执行过的指令
redo cmdno:根据历史命令的编号重复执行该条指令
4.1基础配置
dataDir:zookeeper存储快照文件的目录
clientPort:zookeeper对外提供服务的端口号
tickTime:zookeeper中配置最小时间单元的长度
4.2高级配置
dataLogDir:设置存储事务日志文件的目录(默认会和快照数据存放在同一目录)
为了保证事务的一致性,zookeeper会在事务请求响应之前,必须将本次请求对应的事务日志写入到磁盘中,因此事务写入的性能,直接决定zookeeper处理请求的吞吐量。因此将日志存储点挂载在新的磁盘上能大大提高性能。
globalOutStandingLimit:为了防止服务端资源过度消耗,服务端限制同时处理的请求数。
preAllocSize:事务日志文件预分配的存储空间,默认64M
snapCount:用于配置相邻两次数据快照之间的事务处理次数
maxClientCnxns:限制单个服务器与单台客户机之间的并非连接数,通过IP地址
ClientPortAddress:针对多网卡机器,为每个ip地址指定不同的监听端口
maxSessionTimeout、minSessionTimeout:服务端对客户端超时时间进行限制
fsync.warningthresholdms:事务日志记录消耗时间的报警阀值,一旦超过这个时间就会在日志中打印出警告信息
autopurge.snapRetainCount:3.4.0版本开始,提供历史事务日志和快照数据自动清理的功能,该参数保证清理时需要保存的最小事务日志和快照数据文件,最小值是3。
autopurge.purgeInterval:与autopurge.snapRetainCount配套使用,设定清理的频率,配置0或负数就不开启,默认不开启
electionAlg:用于配置leader选举算法,目前没什么意义
initLimit:用于配置leader服务器等待follow服务器启动并完成数据同步的时间
follow服务器在启动时会与leader服务器建立连接,并完成对数据的同步,从而确定自己对外提供服务的起始状态。leader服务器允许follow服务器在initLimit时间内完成这个操作。通常不配置。当数据量增大时,可以适当调整。
leaderServes:用于配置leader服务器是否接受客户端的连接,默认是。通常leader服务器用于处理分布式的协调。
syncLimit:leader服务器和follow服务器进行心跳检测的最大延时时间。网络延时时,适当调大参数。
cnxTimeout:用于配置leader选举过程中,各个服务器之间进行数据交换,建立TCP连接的最大超时时间
forceSync:用于配置服务器是否在事务提交的时候将日志写入操作,强制刷入磁盘,默认是yes
jute.maxbuffer:单个节点上可以存储的最大数据量的大小,必须所有服务器都设置才生效,默认1M
skipACL:用于配置服务器是否跳过ACL权限检查,默认是no。
详细可以查看
http://zookeeper.apache.org/doc/r3.4.6/zookeeperAdmin.html
5.1 echo stat|nc 172.16.114.133 2181
5.2 echo conf|nc 172.16.114.133 2181
用于输出zookeeper的运行时的基本配置信息
5.3 echo cons|nc 172.16.114.133 2181
当前这台服务器所有客户端连接的详细信息(ip,会话id,最后一次与服务器交互的操作类型)
5.3 echo crst|nc 172.16.114.133 2181
重置所有客户端连接统计信息
5.4 echo dump|nc 172.16.114.133 2181
用于输出当前集群的所有会话信息,包括这些会话的会话ID,以及每个会话创建的临时节点信息。
5.5 envi命令用于输出ZooKeeper所在服务器运行时的环境信息。
5.6 ruok命令用于输出当前ZooKeeper服务器是否在正常运行。如果返回"imok"则表示正常,否则没有任何响应输出。
5.7 srvr命令和stat命令的功能一致,唯一的区别是srvr不会将客户端的连接情况输出,仅仅输出服务器的自身信息。
5.8 srst命令是一个功能性命令,用于重置所有服务器的统计信息。
5.9 wchs命令用于输出当前服务器上管理的Watcher的概要信息。
5.10 wchc命令用于输出当前服务器上管理的Watcher的详细信息,以会话为单位进行归组,同时列出该会话注册了Watcher的节点路径。
5.11 wchp命令和wchc命令非常类似,用于输出当前服务器上管理的Watcher的详细信息。
5.12 mntr命令用于输出比stat命令更详细的服务器统计信息,包括请求处理的延迟情况、服务器内存数据库大小和集群的数据同步情况。
ZK的节点有5种操作权限:CREATE、READ、WRITE、DELETE(对子节点的删除权限)、ADMIN 增、删、改、查、管理权限,这5种权限简写为crwda
身份的认证有4种方式:
world:默认方式,相当于全世界都能访问
auth:代表已经认证通过的用户(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)
digest:即用户名:密码这种方式认证
ip:使用Ip地址认证
可以通过getAcl path 来查看当前的权限
添加权限:
ip方式:
setAcl /node ip:172.16.114.129:crwda
digest方式:create /node data digest:(Base64(SHA-1(username:password))):权限
create /node 3123 digest:wjw:SR86oLgHR5LQYIJvgm1H7U9j/Z8=:crwda
当然也能对已创建的节点添加 把create 换成 setAcl即可
认证用户:
addauth digest wjw:123456
addauth ip:172.16.114.129
还有一种用明文的方式创建
先用addauth digest user:12345 增加一个认证用户,然后用 setAcl /test auth:user:12345:r 设置权限
当权限密码忘了,zookeeper还提供了超级管理员,修改zkServer.sh的109行添加
"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:g9oN2HttPfn8MMWJZ2r45Np/LIA="
使之变成
nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "-Dzookeeper.DigestAuthenticationProvider.superDigest=wj:T+mFmaVnFBU3Do5/VBaOdCMlLsE=" \
1.修改zookeeper的启动脚本(zkServer.sh)
修改ZOOMAIN
-Djava.rmi.server.hostname=172.16.114.129(规定jconsole连接的服务器的名称)
-Dcom.sun.management.jmxremote.port=8899(端口号)
-Dcom.sun.management.jmxremote.ssl=false(是否启用ssl)
-Dcom.sun.management.jmxremote.authenticate=false(是否启用权限验证)
重新启动(每个服务器都要修改)
打开jdk bin目录下的jconsole,然后登陆。
在MBean下org.apache.ZooKeeperService下是zookeeper服务器的一些信息。