临时节点(有序)、持久化节点(有序)
zookeeper是一个开源的分布式协调框架:数据订阅发布、负载均衡、集群、master选举、分布式锁。。。
原子性:要么同时成功、要么同时失败(分布式事务)
单一视图:无论客户端连接到哪个服务器,所看到的模型都是一样
可靠性:一旦服务器提交了一个事务并且获得了服务器返回成功的标识,那么这个事务所引起的服务器端的变更会一直保留
实时性:近实时
zookeeper并不是用来存储数据的,通过监控数据状态的变化,达到基于数据的集群管理
集群配置
1、修改zoo.cfg
server.id=ip:port1:port2 第一个port数据同步通信,第二个port:leader选举(3181) id=myid(myid参与leader选举,在整个
集群中表示唯一服务器的标识)
2、dataDir目录下 创建一个myid的文件,内容:server.id对应当前服务器的id号
3、如果增加observer,需要在第一步中,server.id=ip:port:port:observer ; peerType=observer
会话
NOT_CONNECTED -> CONNECTING -> CONNECTED -> CLOSE(会话过期或连接关闭)
CONNECTED->CONNECTING(服务器端没有响应)
数据模型
数据模型是一个树形结构,最小数据单元是ZNODE
临时节点(在当前会话中)和持久化节点(保存在本地磁盘)
临时有序节点 create -s -e /temp 11
持久化有序节点
状态信息
Stat:
#创建节点的事物ID
cZxid = 0x385
#创建时间
ctime = Tue Sep 24 17:26:28 CST 2019
#修改节点的事物ID
mZxid = 0x385
#最后修改时间
mtime = Tue Sep 24 17:26:28 CST 2019
# 子节点变更的事物ID
pZxid = 0x385
#这表示对此znode的子节点进行的更改次数(不包括子节点)
cversion = 0
# 数据版本,变更次数
dataVersion = 0
#权限版本,变更次数
aclVersion = 0
#临时节点所属会话ID
ephemeralOwner = 0x0
#数据长度
dataLength = 17
#子节点数(不包括子子节点)
numChildren = 0
zab协议: 如果客户端发了一个事务请求给leader,而leader发送给各个follower以后,并且收到了ack, leader已经commit。在准备ack给各个follower节点commit时,leader挂了,怎么处理
1、选举新的leader(zxid的最大值)
2、同步给其他的follower
watcher
EventType
None 客户端与服务器端成功建立会话
NodeCreated 节点创建
NodeDeleted 节点删除
NodeDataChanged 数据变更:数据内容
NodeChildrenChanged 子节点发生变更,子节点删除、新增才会触发
watcher的特性
一次性触发:事件被处理一次后,会被移除,如果需要永久监听,则需要反复注册
zkClient(永久监听的封装)
curator
java API:zk.exists, zk.getData 创建一个watcher监听