zookeeper概念
- zookeeper是一个分布式的协调服务软件
协调服务:在分布式环境下,如何控制大家有序的去做某件事。
顺序
一致
共同
共享
- zookeeper的本质:分布式的小文件存储系统
- zookeeper是一个标准的主从架构集群。
- zookeeper最重要的特性:全局数据一致性。
可以类比关系型数据库的事务操作
事务(transaction):通俗理解 多个操作组成一个事务,要么一起成功,要么一起失败,不会存在中间的状态。如果中间失败了要进行回滚操作。即回到事务操作前的状态。
- 存储系统:存储数据、存储文件 目录树结构
- 小文件:上面存储的数据有大小限制
- 分布式:可以部署在多台机器上运行,对比单机来理解。
- 问题:zookeeper这个存储系统和我们常见的存储系统不一样。基于这些不一样产生了很多应用方式。
zookeeper节点类型
- 临时节点
会话结束节点删除(会话:就是一个客户端的连接状态,客户端连接成功,会话建立,客户端关闭,会话结束) - 永久节点
创建后,节点永久存在 - 序列化特征:
当我们创建节点后,会自动进行编号,在同一个节点中不能出现同名子节点,此时如果我们使用的是序列化节点,则会自动编号避免重复 - 节点的类型,在创建节点时及定义完成,后续不可修改
create [-s] [-e] path data acl
-s 序列化节点
-e 临时节点
- 普通节点和序列化节点的区别
[zk: node1(CONNECTED) 1] create /itcast 123 # 创建永久节点
Created /itcast
[zk: node1(CONNECTED) 2] create -s /itcast/qianyu 123 # 创建永久序列化节点
Created /itcast/qianyu0000000000 # 自动给节点编号,不会出现同名节点
[zk: node1(CONNECTED) 3] create -s /itcast/qianyu 123
Created /itcast/qianyu0000000001
[zk: node1(CONNECTED) 4] create -s /itcast/qianyu 123
Created /itcast/qianyu0000000002
[zk: node1(CONNECTED) 5] ls /itcast# 创建多个节点编号不同
[qianyu0000000000, qianyu0000000001, qianyu0000000002]
- 永久节点和临时节点的区别
- 如果是永久节点
会话地址为0 - 如果是临时节点
回话地址为一段长字符串
且会话结束的时候, 临时节点会被删除
zookeeper选举机制
在首次启动zookeeper的时候会进行投票
以五台机子为例
- node1先启动,将票投给自己
node1:1票
- node2再启动, 将票投给自己
node1: 1票node2: 1票
改票环节: 查询谁的zid值大就投给谁
node1: 0票node2: 2票
- node3启动, 将票投给自己
node1: 0票node2: 2票node3:1票
改票关节, 查询谁的zid值大,就投给谁
node1: 0票node2:0票, node3:3票
node3已经票数过半直接当选.其他服务自动分配follower角色
- node4启动直接变为follower
- node5启动直接变为follower
- 如果leader宕机,则挑选zid大的值为新leader, 如果zid的值相同,则比较myid值的大小
- 如果旧leader宕机后,又重新连接到集群中会做什么呢?
- 以follower的身份重新加入集群
- 对比自己的数据,如果与集群内其余服务不相同,则同步数据
- 比较自身的数据日志中的编号是否一致,如果不一致则修改.
Zookeeper监听机制Watch
- 监听实现需要几步?
#1、设置监听
#2、执行监听
#3、事件发生,触发监听 通知给设置监听的 回调callback
- zookeeper中的监听是什么?
- 谁监听谁?
客户端监听zk服务
不是zk集群中的角色间互相监听,而是zk客户端监听zk服务端
- 监听什么事?
监听zk上目录树znode的变化情况。
znode增加了 删除了 增加子节点了 不见了
- zk中监听实现步骤
#1、设置监听 然后zk服务执行监听
ls path [watch]
没有watch 没有监听 就是查看目录下子节点个数
有watch 有监听 设置监听子节点是否有变化
get path [watch]
监听节点数据是否变化
eg: get /itcast watch
#2、触发监听
set /itcast 2222 #修改了被监听的节点数据 触发监听
#3、回调通知客户端
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/itcast
监听的属性 监听类型 监听节点
-
zk的监听特性
-
先注册 再触发:客户端先在服务端注册监听,再等待事件触发
-
一次性的监听:监听触发一次后立即失效
-
异步通知:设置监听后可以进行其他操作,当监听被触发后立即回调监听通知
- 同步: 按序执行
- 异步(async): 无序执行
-
通知是使用event事件来封装的
state:SyncConnected type:NodeDataChanged path:/itheima
type:发生了什么
path:哪里发生的
-
所有的监听本质上是监控dataVersion,dataVersion改变了则监听触发
-
zk中监听类型
- 连接状态事件监听 系统自动触发 用户如果不关心可以忽略不计
- 上述所讲的是用户自定义监听 主要监听zk目录树的变化 这类监听必须先注册 再监听。