zookeeper简介
目录
zookeeper概念
zookeeper的全局数据一致性
zookeeper集群角色
zookeeper文件系统
znode节点类型
zookeeper监听机制
zookeeper shell
典型应用
zookeeper概念
zookeeper是一个分布式协调服务的软件。主要用来解决分布式集群中应用系统的一致性问题。本质上是一个分布式的小文件存储系统
zookeeper的全局数据一致性
集群中的每个服务器都保存着一份相同的数据副本,cilent无论连接哪台服务器,看到的数据都是一样的;
Q:多个客户端同时操作不同服务器,会冲突,那如何保证全局一致性?
1.针对非事务性操作(查):不需要维护一致性
2.针对事务性操作(增、删、改):follower向leader转发事务性请求,leader把所有请求编成事务ID,根据编号进行执行。
zookeeper集群角色
leader:集群工作的核心,事务请求的唯一调度和处理者,保证集群事务处理的顺序性;集群内部各个服务器的调度者;给事务请求编号并执行操作
follower:处理客户端非事务请求,转发事务请求给leader;参与集群leader的选举投票
observer:不参与投票,但其他与follower作用一致,在不影响集群事务处理能力的前提下,提升集群的读写能力
zookeeper文件系统
一个标准的文件系统特征
1、采用树形目录结构,从根目录开始
3、由文件夹和文件组成
2、同一目录下,文件名唯一
而zookeeper文件系统特征
1、从结构上类似目录树结构
2、但内部没有文件夹、文件之分,统称为znode,既可以创建子目录,也可以保存数据
3、路径从/根目录开始
znode节点类型
持久节点:客户端断开连接后不会删除,需手动删除
持久带序号节点:持久化,且创建时自动添加单调递增序列号(如 /lock-0000000001),保证同路径下子节点唯一性
临时节点:客户端与 ZooKeeper 会话结束后自动删除,适合临时标识(如服务心跳)
临时带序号节点:临时节点 + 自动序列号,常用于分布式锁等场景
zookeeper监听机制
实现步骤
客户端给节点设置监听
节点事件发生,触发监听,客户端收到通知
监听特性
先注册再触发
一次性监听
异步通知
通知是使用event事件来封装的
zookeeper shell
Q:客户端操纵zookeeper集群分为几步?
1、客户端连接集群,建立会话
2、根据需求对zookeeper目录树进行增删改查
3、客户端断开连接,结束会话
连接zookeeper
①连接本地单机
zkCli.sh -server localhost:2181
②连接远程集群
zkCli.sh -server node1:2181,node2
#连接成功后,终端会显示 [zk: localhost:2181(CONNECTED) 0] 提示符
节点操作命令
①creat:创建节点,语法:create [-s] [-e] 节点路径 节点数据
-s:创建顺序节点,自动追加数字后缀
-e:创建临时节点,会话断开后自动删除
②get:查看节点数据,语法:get [-w] 节点路径
-w:对接待你注册监听器(数据变化时触发通知,一次性有效)
③set:更新节点数据,语法:set 节点路径 新数据 [版本号]
④delete:删除指定节点,该节点必须无子节点,语法:delete 节点路径 [版本号]
⑤deleteall:递归删除节点及其所有子节点
⑥ls:列出指定节点的直接子节点名称,ls [-w] 节点路径
-w:对子节点变化注册监听器(子节点增删时触发)
⑦ls2:列出子节点名称+节点元数据(等价于ls+stat)
⑧stat:查看节点的元数据(如版本号、创建时间、是否为临时节点等),语法:stat [-w] 节点路径
-w:注册监听器(节点删除或数据变化时触发)
查看集群状态
①conc:列出所有连接到当前zookeeper服务器的客户端会话信息
②ruok:检查当前服务器是否正常(返回imok表示正常)
③stats:查看当前服务器的状态信息(如启动时间、连接数、节点总数等)
④quit/exit:关闭连接
典型应用
①数据配置与同步(监听机制)
实现配置集中管理维护,达到自动更新同步的效果
②提供集群选举
实现集群选主,主挂掉备份切换成主
③分布式锁
在分布式系统中,多个节点可能同时操作共享资源,需要通过锁机制保证:同一时间只有一个节点能持有锁、锁释放后,其他节点能正确竞争到锁,避免死锁、部分节点故障不影响锁机制正常运行。
假设有 3 个客户端 A、B、C 竞争锁:
1、A 创建节点 /locks/lock-0000000001,B 创建 /locks/lock-0000000002,C 创建 /locks/lock-0000000003。
2、排序后,A 的节点序号最小,A 获取锁。
3、B 监听 A 的节点,C 监听 B 的节点,进入等待。
4、A 释放锁(删除 /locks/lock-0000000001),B 收到通知,发现自己是当前最小节点,获取锁。
5、B 释放锁后,C 收到通知,获取锁。