使用客户端进行连接
ZooKeeper集群中有类似于linux文件系统的一个简版的文件系统;目录结构也是树状结构
重要技巧:不会就喊help
首先进到bin目录中,使用zkCli.sh -server node01:2181,node02:2181,node03:2181 进行与服务器交互
客户端随机的连接三个服务器中的一个
1.常用命令
查看ZooKeeper根目录/下的文件列表:ls /
创建节点,并写入数据:create /test test
获得某节点的数据: get /test
修改节点数据:set /test test2
.删除节点: delete /test
分布式通信方式:1直接通过网络连接方式进行通信2、通过共享存储方式,来进行通信或数据的传输
zookeeper使用共享存储方式,提供分布式协调服务
zookeeper数据结构:
ZooKeeper=①简版文件系统(Znode)+②原语+③通知机制(Watcher)。
ZK文件系统:基于类似于文件系统的目录节点树方式的数据存储
原语:可简单理解成ZooKeeper的基本的命令
Watcher(监听器)
数据节点:ZNode
ZNode 分为四类:持久节点(create)临时节点(create -e)有序节点(create -s) 有序临时节点(create -s -e)
临时节点:
设计临时节点原因:防止多个不同的客户端在同一目录下,创建同名ZNode,由于重名,导致创建失败
临时节点的生命周期跟客户端会话session绑定,一旦会话失效,临时节点被删除。
client1上创建临时节点
create -e /tmp tmpdata
client2上查看client1创建的临时节点
ls /
client1断开连接
close
client2上观察现象,发现临时节点被自动删除
ls /
有序节点:
命令行使用-s选项:create -s /test test-data
一旦节点被标记上这个属性,那么在这个节点被创建时,ZooKeeper 就会自动在其节点后面追加上一个整型数字
这个整数是一个由父节点维护的自增数字。
提供了创建唯一名字的ZNode的方式
会话(Session)
什么是会话
客户端要对ZooKeeper集群进行读写操作,得先与某一ZooKeeper服务器建立TCP长连接;此TCP长连接称为建立一个会话Session。
每个会话有超时时间:SessionTimeout
当客户端与集群建立会话后,如果超过SessionTimeout时间,两者间没有通信,会话超时
会话的特点
客户端打开一个Session中的请求以FIFO(先进先出)的顺序执行;
如客户端client01与集群建立会话后,先发出一个create请求,再发出一个get请求;
那么在执行时,会先执行create,再执行get
若打开两个Session,无法保证Session间,请求FIFO执行;只能保证一个session中请求的FIFO
会话的生命周期
会话的生命周期:未建立连接------->正在连接-------->已连接----------->关闭连接
请求
通过客户端向ZooKeeper集群中写数据
通过客户端从ZooKeeper集群中读数据
事务zxid
客户端的写请求,会对ZooKeeper中的数据做出更改;如增删改的操作
每次写请求,会生成一次事务
每个事务有一个全局唯一的事务ID,用 ZXID 表示;全局自增
事务特点
ACID:
原子性atomicity | 一致性consistency | 隔离性isolation | 持久性durability
ZXID结构:
通常是一个64位的数字。由epoch+counter组成
epoch、counter各32位
Watcher监视与通知
为什么要有Watcher
问:客户端如何获取ZooKeeper服务器上的最新数据?
方式一轮询:ZooKeeper以远程服务的方式,被客户端访问;客户端以轮询的方式获得znode数据,效率会比较低(代价比较大)
方式二基于通知的机制:
客户端在znode上注册一个Watcher监视器
当znode上数据出现变化,watcher监测到此变化,通知客户端
什么是Watcher?
客户端在服务器端,注册的事件监听器;watcher用于监听znode上的某些事件比如znode数据修改、节点增删等;当监听到事件后,watcher会触发通知客户端
可以设置watcher的命令如下:
示例3:节点上下线监控
原理:
节点1(client1)创建临时节点
节点2(client2)在临时节点,注册监听器watcher
当client1与zk集群断开连接,临时节点会被删除
watcher发送消息,通知client2,临时节点被删除的事件
用到的zk特性:
Watcher+临时节点
好处:
通过这种方式,检测和被检测系统不需要直接关联(如client1与client2),而是通过ZK上的某个节点进行关联,大大减少了系统耦合。
ZooKeeper工作原理
ZooKeeper使用原子广播协议叫做Zab(ZooKeeper Automic Broadcast)协议
Zab协议有两种模式
恢复模式(选主):因为ZooKeeper也是主从架构;当ZooKeeper集群没有主的角色leader时,从众多服务器中选举leader时,处于此模式
广播模式(同步):当集群有了leader后,客户端向ZooKeeper集群读写数据时,集群处于此模式
为了保证事务的顺序一致性,ZooKeeper采用了递增的事务id号(zxid)来标识事务,所有提议(proposal)都有zxid