Zookeeper:概述

Zookeeper简介

提出问题

概述

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

Zookeeper的特性

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

Zookeeper目录结构

  • bin:主要的一些运行命令。
  • conf:存放配置文件。
    • zoo.cfg。
      • tickTime:用于计算的时间单元,是基本的时间单元。比如session超时:N*tickTime。
      • initLimit:用于集群,允许从节点连接并同步到master节点的初始化连接时间,以tickTime的倍数表示。
      • syncLimit:用于集群,master主节点与从节点间发送消息,请求和应答的时间长度(心跳机制)。
      • dataDir:数据存放的目录。
      • dataLogDir:日志目录,不配置则值为dataDir。
      • clientPort:连接服务器的端口,默认2181。
  • contrib:附加的功能。
  • dist-maven:mvn编译后的目录。
  • docs:文档。
  • lib:需要依赖的jar包。
  • recipes:案例demo代码。
  • src:源码。

Zookeeper作用

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

应用

适用性

案例1

对比

Zookeeper基本数据模型

  • 是一个树形结构,类似于前端开发中的tree.js:

    • 1563703948258
    • 即zookeeper的数据模型可以理解为一个文件目录:/user/local等。
  • 每一个节点都称为znode,可以有子节点,也可以有数据。

    • 每个节点分为临时节点和永久节点,临时节点在客户端断开后消失。
    • 每个zk节点都有各自的版本号,可以通过命令行来显示节点信息。
    • 每当节点数据发生变化,则节点的版本号会累加(乐观锁)。
    • 删除/修改过时节点,版本号不匹配会报错(乐观锁)。
    • 每个zk节点存储的数据不宜过大,几K即可。
    • 节点可以设置权限acl,通过权限限制用户的访问。

Zookeeper数据模型基本操作

启动zookeeper:sh zkServer.sh start

常用命令行操作

进入zookeeper

在bin目录下的sh zkCli.sh <server>

则会进入到zookeeper当中。

命令

  • ls:查看zookeeper的节点或数据。
  • ls2:会显示状态信息,ls+stat。
  • get:提前当前目录的数据。
  • stat:状态信息,==status。
    • cZxid:创建后,zookeeper为这个节点所分配的ID。
    • cTime:创建时间。
    • mZxid:修改后的ID。
    • pZxid:子节点的ID。
    • cversion:子节点的version。
    • dataVersion:当前数据的版本号。
    • aclVersion:权限。
    • ephemeralOwner:如果有值则为临时节点。
    • dataLength:数据长度。
    • numChildren:下面子节点的数目。

create命令

  • create [-s] [-e] path data acl
    • -e:创建一个临时节点。
    • -s:顺序节点。

set命令

  • set path data [version]
    • 每次set后,dataversion都会改变。
  • 乐观锁:set path data [originalVersion] [version]

delete命令

  • delete path [version]

Zookeeper特性

session的基本原理

客户端与服务端之间的连接存在会话。

每个会话都可以设置一个超时时间。

心跳结束,session则过期。

session过期,则临时节点znode会被抛弃。

心跳机制,客户端向服务端的ping包请求。

watcher机制

  • 针对每个节点的操作,都会有一个监督者->watcher。
    • 即当节点发生一些变化,都会触发一个watcher,即一个事件。
  • 当监控的某个对象发生了变化,则触发watcher事件。
  • zk中的watcher是一次性的,触发后立即销毁。
    • 也可以设置为永久性的。
  • 父节点、子节点的增删改都能够触发其watcher。
    • 不同的操作会触发不同的watcher事件。
    • (子)节点创建(删除\数据变化)事件。

watcher设置

  • get path [watch]。设置watcher。
  • stat path [watch]
  • ls path [watch]
  • ls2 path [watch]

事件类型

  • 创建父节点触发:NodeCreated。

    • 1
      2
      3
      watcher::

      WatchedEvent state:SyncConnected type:NodeCreated path:/path
  • 修改父节点数据触发:NodeDataChanged。

  • 删除父节点触发:NodeDeleted。

  • 创建子节点触发:NodeChildrenChanged。

  • 删除子节点触发:NodeChildrenChanged。

  • 修改子节点不会触发事件。如果要监听子节点的修改事件,必须将其当作父节点。而删除等操作,其与父节点存在联系,对其有影响。

适用性

  • 统一资源配置。
    • 当更新了节点为新的配置信息,则触发watcher去更新其他的客户端配置。

ACL

access control lists。

  • 针对节点可以设置相关读写等权限,目的是为了保障数据安全性。
  • 权限permissions可以指定不同的权限范围与角色。

概述

默认权限 :

1
2
‘world,'anyone
:cdrwa

ACL构成

[scheme: id:permissions​]来构成权限列表。

  • scheme:代表采用的某种权限机制。
    • world:world下只有一个id,即只有一个用户,也就是anyone。
    • auth:代表认证登录,需要注册用户有权限就可以,需要明文密码。
    • digest:需要对密码加密才可以访问。digest:username:BASE64(SHA1(password)):[permissions],需要密文密码。
  • id:代表允许访问的用户。
    • ip:当设置为IP指定的IP地址,此时限制IP进行访问,例如ip:192.168.1.1:[permisssion]
    • super:代表超级管理员,拥有所有的权限。
  • permissions:权限组合字符串,缩写crdwa。
    • 赋值时可以任意组合,例如crw。
    • CREATA:创建子节点。READ:获得节点/子节点。WRITE:设置节点数据。DELETE:删除子节点。ADMIN:设置权限,即是最高的权限。

命令行

  • getAcl path:获取某个节点的acl权限信息。
  • setAcl path acl:设置某个节点的acl权限信息。
  • addauth:输入认证授权信息,注册时输入密码登录。

适用性

  • 开发/测试环境分离,开发者无权操作测试库的节点,只能看。
  • 生产环境上控制指定IP的服务可以访问相关节点,防止混乱。

四字命令

Four Letter Words

  • zk可以通过它自身提供的简写命令来与服务器进行交互。
  • 需要使用nc命令,yum install nc。
  • echo [command] | nc [ip] [port]
    • stat:查看zk的状态信息,以及是否mode,即是集群模式还是单例模式。
    • ruok:查看当前zkserver是否启动,返回imok,即已启动。
    • dump:列出未经处理的会话和临时节点。
    • conf:查看服务器配置。
    • cons:展示连接到服务器的客户端信息。
    • envi:环境变量。
    • mntr:监控zk健康信息。
      • node数目、watch数目,临时节点等
    • wchs:展示watch的信息。
    • wchc与wchp:session与watch以及path与watch信息。

Zookeeper集群

zk集群:

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

最少的集群至少有3个节点。当master挂掉后,经过选举模式,zz上位。如果xx节点恢复重连,则也无法回到Master位置上,而是作为一个Slave。

1566277551934

集群搭建注意点:

  • 配置数据文件myid 1/2/3对应server1/2/3。即存在3台服务器。
  • 通过./zkCli.sh -server [ip]:[port]检测是否配置成功。

选举模式

Zookeeper Java客户端

原生Java API

会话的连接与恢复

接待你的增删改查

watch与ACL

Apache curator

参考