ZooKeeper

zookeeper是一个中间件,用来提供协调服务。作为分布式系统,发挥其优势,可以为大数据服务。支持Java,提供Java和C语言的客户端API。

zookeeper 入门

zookeeper的特性

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

zookeeper 目录结构

  • bin 目录 可执行文件目录
  • conf 存放配置文件,其中我们需要修改zk.cfg
  • contrib 附件的一些功能
  • Dist-maven mvn编译后的目录
  • docs 文档
  • lib 需要依赖的jar包
  • recipes 案例demo代码

zoo.cfg 配置

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

Zookeeper 基本数据模型

zookeeper服务器一般是一个集群,维护一个数据模型,这个模型是树形的,然后客户端可以访问,修改,删除这个树状的数据模型中的数据。每一个目录下都是zookeeper用来保存的数据。

是一个树形结构,类似前端开发的tree.js组件。

zookeeper的数据模型可以理解为linux/unix的文件目录。

每一个节点都是成为znode,它可以由子节点,也可以有数据。

每个节点可以分为临时节点和永久节点,临时节点在客户端断开后消失。

每个zk节点都有各自的版本号,可以通过命令行来显示节点信息。

每当节点数据发生变化,那么该节点的版本号就会累加(乐观锁)。

删除/修改过时节点,版本号不匹配则会报错。

每个zk节点存储的数据不宜过大,几k即可。

节点可以设置权限acl,可以通过权限来限制用户的访问。

zk的作用体现

  • master节点选举,主节点挂了以后,从节点就会接手工作,并且保证这个节点是唯一的,这也是所谓首脑模式,从而保证我们的集群是高可用的。
  • 统一配置文件管理,即只需要部署一台服务器,就可以把相同的配置文件同步更新到其他所有服务器,此操作在云计算中用的特别多。
  • 发布与订阅,类似消息队列,dubbo发布者把数据存在znode上,订阅者会读取这个数据。
  • 提供了分布式锁,分布式环境中不同进程之间争夺资源,类似于多线程中的锁。
  • 集群管理,集群中保证数据的强一致性。

Zookeeper 的使用

zk特性 -session的基本原理

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

zk常用命令行操作 ([]表示的可选)

通过./zKCli.sh打开zk的客户端进行命令行后台。

Help 命令查看所有命令。

  • ls与 ls2命令 (ls2 =ls+stat)

ls 加目录 表示查看目录列表

stat 加目录 显示具体信息

ls2 =ls+stat

  • Get 与stat 命令

stat 就是status的意思,就是显示状态信息。

Get 读取当前节点的数据

  • create (-s 创建顺序节点)(-e创建临时节点) path data acl
  • set path data [version可选] 修改节点的值
  • delete path [version] 删除节点的值(set 和delete的版本号都是乐观锁的机制)

zk特性 -watcher 机制

  • 针对每一个节点的操作,都会有一个监督者,这个监督者就是watcher 。
  • 当监控的某个对象发生了变化,则触发了watcher 事件。
  • zk中的watcher是一次性的,当触发后就会立即销毁。
  • 父节点,子节点,增删改查都能够触发其watcher。
  • 针对不同类型的操作,触发的watcher事件也不同。

watcher 命令行

通过get path [watch] 设置watcher 。

父节点增删改查的操作触发watcher 。

子节点的增删改查的操作触发watcher。

get 目录 watch 设置父节点事件

创建父节点会触发 NodeCreated事件

修改父节点数据触发 NodeDataChanged事件

删除父节点触发:NodeDeleted事件

ls 目录 watch 为父节点创建watch在此目录下的子节点增删改查都会触发事件

watch 使用场景

  • 统一资源配置

ACL access cintrol lists 权限控制

针对节点可以设置相关读写等权限,目的是为了保障数据安全性。

权限permissions可以指定不同的权限范围以及角色

ACL 命令行

  • getAcl 获取某个节点的acl权限信息getacl path acl
  • setAcl 设置某个节点的acl权限信息setacl path acl
  • Addauth 输入认证授权信息,注册时输入明文密码(登录) 但是在zk的系统里,密码是以加密的形式存在的。
  • zk的ACL通过[scheme:id :permissions]来构成权限列表。scheme代表采用的某种权限机制,id代表允许访问的用户。permissions代表权限组合字符串。

zookeeper 集群搭建

主从节点,心跳机制(选举模式)