写在前面:
我们了解了zookeeper的命令后,那么下面我们来了解zookeeper的原理以及其他知识。
进入主题:
1.存储结构
- zookeeper是一个树状结构,维护一个小型的数据节点znode
- 数据以keyvalue的方式存在,目录是数据的key
- 所有的数据访问都必须以绝对路径的方式呈现
-
我们了解一下get里面的参数是什么意思吧; [zk:localhost:2181(CONNECTED)10]get /lzj 666 当前节点的值 cZxid=0xf00000013 创建这个节点的事务id,ZXID是一个长度64位的数字,低32位是按照数字递增,即每次客户端发起一个proposal,低32位的数字简单加1。高32位是leader周期的epoch编号 ctime=MonDec0917:33:06CST2022 创建时间 mZxid=0xf00000013 最后一次修改节点数据的事务 IDmtime=MonDec0917:33:06CST2022修改时间 pZxid=0xf00000014子节点的最新事务ID cversion=1对此znode的子节点进行的更改次数 dataVersion=对此znode的数据所作的修改次数 aclVersion=对此znode的acl更改次数 ephemeralOwner=0x0(持久化节点)0x16ee9fc0feb0001(临时节点) dataLength=3数据的长度 numChildren=1子节点的数目
2.节点的分类
zookeeper节点可以分为3类:持久化节点,临时节点,序列化节点。
持久化节点:默认创建的就是持久化节点
临时节点:
- 创建临时节点命令是 create -e
- 只要创建节点的会话有效,节点就不会消失。(类似于session,只要你创建那台服务器的zookkeeper客户端不关闭,那么这个节点就不会消失)
- 可以被所有的客户端所查看
- 事务编号和临时节点编号是一致的(sessionid跟ephemeralOwner是一样的)
- 一旦会话结束,临时节点也会被自动删除,一般这个功能用于判断节点和服务器是否保持连接
序列化节点:
1.创建序列化节点命令是 create -s
2.znode被创建后,znode名称会自动添加一个编号,编号会自动递增。
3.编号递增不会因为连接断开而重置
4.编号递增不会因为zookeeper重启而重置
3.zkServer的监听机制(watch)
命令:help里可以找到怎么使用。例:get /xx watch
原理:
Watch是一个一次性的触发器,当被设置了Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端,以便通知它们。
机制特点
一次性触发数据发生改变时,一个watcher event会被发送到client,但是client只会收到一次这样的信息。watcher event异步发送
数据监视
1.Zookeeper有数据监视和子数据监视getdata() and exists()设置数据监视,getchildren()设置了子节点监视
2.watch监听有不同的类型,有监听状态的stat,内容的get,目录结构的ls。如下:
get /path[watch]NodeDataChanged
stat /path[watch]NodeDeleted
ls /path[watch]NodeChildrenChanged
3.父节点Watcher事件类型:
- 创建父节点触发:NodeCreated
- 修改父节点数据触发: NodeDataChanged
- 删除父节点触发:NodeDeleted
4.子节点Watcher事件类型:
- 使用ls命令为父节点设置watcher,子节点被创建时触发:NodeChildrenChanged
- 使用ls命令为父节点设置watcher,子节点被删除时触发:NodeChildrenChanged
- 使用ls命令为父节点设置watcher,子节点被修改时,不触发事件
补充监听机制讲解:
图1
如图1,当主节点在zk创建临时节点live,备用节点一直watch(监听,一次性)着主节点创建的临时节点,突然主节点挂掉,主节点挂掉乡相应的临时节点也会消失。备用节点感知到了。往下看
图2
如图2,那么备用节点会在zk上创建自己的临时节点live:node02。往下看
图3
如图3,那么备用节点就成为了主节点,当之前的主节点苏醒过来后,发现zk上已经有了主节点,自己之前的临时节点已经被人占了,那么自己会watch主节点,也就是会watch临时节点live:node02,自己成为从节点,这样就完成了主备切换。
完毕。