一、zookeeper简介

  • 中间件,提供协调服务
  • 作用于分布式系统,发挥其优势,可以为大数据服务
  • 支持java,提供java和c语言的客户端api

二、zookeeper特性

  • 一致性:数据一致性,数据按照顺序分批入库
  • 原子性:事务要么成功要么失败,不会局部化
  • 单一视图:客户端连接集群中的任意zk节点,数据都是一致的
  • 可靠性:每次对zk的操作状态都会保存在服务端
  • 实时性:客户端可以读取到zk服务端的最新数据

三、zoo.cfg配置

  • tickTime:用于计算的时间单元。比如session超时:N*tickTime
  • initLimit:用于集群,允许从节点连接并同步到master节点的初始化连接时间,以tickTime的倍数来表示
  • syncLimit:用于集群,master主节点与从节点之间发送消息,请求和应答时间长度。(心跳机制)
  • dataDir:必须配置
  • dataLogDir:日志目录,如果不配置会和dataDir公用
  • clientPort:连接服务器的端口,默认2181

四、zookeeper基本数据模型

  •  zk的数据模型也可以理解未linux/unix的文件目录:/usr/local...
  • 每一个节点都称之为znode,它可以有子节点,也可以有数据
  • 每个节点分为临时节点和永久节点,临时节点在客户端断开后消失
  • 每个zk节点都有各自的版本号,可以通过命令行来显示节点信息
  • 每当节点数据发生变化,那么该节点的版本号会累加(乐观锁)
  • 删除/修改过时节点,版本号不匹配则会报错
  • 每个zk节点存储的数据不宜过大,几k即可
  • 节点可以设置权限acl,可以通过权限来限制用户的访问

五、zookeeper作用体现

  • master节点选举,主节点挂了以后,从节点就会接手工作,并且保证这个节点是唯一的,这也是所谓首脑模式,从而保证我们的集群是高可用的
  • 统一配置文件管理,即只需要部署一台服务器,则可以把相同的配置文件同步更新到其他所有服务器,此操作在云计算中用的特别多(假设修改了redis统一配置)
  • 发布与订阅,类似消息队列MQ,dubbo发布者把数据存在znode上,订阅者会读取这个数据

提供分布式锁,分布式环境中不同进程之间争夺资源,类似于多线程中的锁

集群管理,集群中保证数据的强一致性

六、 zk特性-session基本原理

  • 客户端与服务端之间的连接存在会话
  • 每个会话都会可以设置一个超时时间
  • 心跳结束,session则过期
  • session过期,临时节点znode会被抛弃
  • 心跳机制:客户端向服务端的ping包请求

七、zookeeper客户端基本命令

  • helper:查看具体的命令
  • create:创建节点 create [-s] [-e] path data acl:-s:顺序节点(也是持久化的),-e临时节点,不写默认都是创建的持久节点
  • get:获取节点信息,ephemeralOwner属性为0x0表示持久节点,为其它长串数字则表示临时节点
  • set:修改节点信息,set path data [version],带上版本号会起到一个乐观锁的作用,如果当前节点的版本号不是命令所带的版本号会报错
  • delete:删除节点信息,delete path [version],version同set命令

 八、watcher机制

  • 针对每一个节点的操作,都会有一个监督者---->warcher
  • 当监控的某个对象(znode)发生了变化,则触发watcher事件
  • zk中的watcher是一次性的,触发后立即销毁
  • 父节点,子节点增删改都能触发其watcher
  • 针对不同类型的操作,触发的waatcher事件也不同
  • 1、(子)节点创建事件
  • 2、(子)节点删除事件
  • 3、(子)节点数据变化事件

九、Watcher命令行学习

  • 通过get path [watch]设置watcher
  • 父节点增删改操作触发watcher
  • 子节点增删改操作触发watcher

十、Watcher事件类型

1、父节点

  • 创建父节点触发:NodeCreated
  • 修改父节点数据触发:NodeDataChanged
  • 删除父节点触发:NodeDeleted

2、子节点 

  •  ls为父节点设置watcher,创建子节点触发:NodeChildrenChanged
  •  ls为父节点设置watcher,删除子节点触发:NodeChildrenChanged
  • ls为父节点设置watcher,修改子节点不触发事件,修改子节点比较特殊,需要为当前子节点设置watcher,才会触发子节点事件

如:get   /imooc/xyz watch

       set   /imooc/xyz 8080 才会触发子节点修改事件

十一、watcher使用场景

统一资源配置

 十二、zkclient常用命令

./zkServer.sh status   -- 查看集群节点角色
./zkCli.sh -server ip:port -- 远程连接zk
ls / 查看节点
rmr /xxx 递归删除节点