zookeeper

参考:https://juejin.im/post/5d0bd358e51d45105e0212db

安装

目录结构

bin —> 包括了linux和window的运行程序的运行目录
conf —> zookeeper的配置zoo.cfg
contrib —> 其他一些组件和发行版本
dist-maven —> maven发布下的一些jar包
docs —> 文档
lib —> 库
recipe —> 一些应用实例
src —> zookeeper的源码,因为zookeeper是java写出来的

zoo.cfg配置

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

##zookeeper基本数据模型

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

zookeeper数据模型的基本操作

客户端连接

  • 用官方给的cli连接,运行后显示
    1
    2
    WatchedEvent state:SyncConnected type:None path:null
    [zk: localhost:2181(CONNECTED) 0]

表示连接到localhost的2181端口

命令

help命令

可以看所有命令的帮助

###ls命令

  • 相当于linux的ls或者ll命令,是查看某一个节点下的节点
    例如:ls /是查看根节点下的节点

stat

  • 相当于status,查看是某一个节点的状态信息,比如cZxid是创建后zk为节点分配的id,ctime是节点创建的时间,mZxid表示修改后的id,mtime是修改后的时间,pZxid表示子节点id,cversion表示子节点的版本,dataVersion表示当前节点数据的版本号,aclVersion表示权限版本号,dataLength数据长度等信息,numChilden表示孩子结点的个数
  • 例如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [zk: localhost:2181(CONNECTED) 3] stat /zookeeper
    cZxid = 0x0
    ctime = Thu Jan 01 08:00:00 CST 1970
    mZxid = 0x0
    mtime = Thu Jan 01 08:00:00 CST 1970
    pZxid = 0x0
    cversion = -2
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 0
    numChildren = 2

ls2命令

  • 相当于ls+stat
  • 也可以运行ls -s

create命令

  • 创建节点的命令

持久节点

  • 直接通过create path value所创建

create /xwm
表示创建/xwm节点,此时执行ls/会有zookeeper和xwm两个节点

临时节点

  • create -e path value

create -e /xwm/temp
表示创建临时节点/xwm/temp,此时执行ls2 /xwm会发现下面的temp节点并且/xwm节点的版本号会增加1
当此session断开过了心跳机制的期限时间以后临时节点会被抛弃

顺序节点

  • create -s path value

create -s /xwm/shun
表示创建顺序节点,第一个节点id是1,第二个是2,执行两边后的结果
[shun0000000001, shun0000000002, tmp]

set命令

  • set path data [version]
    给path设置data,后面可以设置版本号
    如果后面的版本号不是最新的节点的版本号,则会报错,乐观锁的体现

get命令

  • get [-s] [-w] path
    获取某个节点的数据

delete命令

  • delete [-v version] path
    删除节点操作,version是版本号,乐观锁机制

getAcl

  • getAcl [-s] path
    获取某个节点的权限

setAcl

  • setAcl [-s] [-v version] [-R] path acl
    设置某个节点的权限

addauth

  • addauth scheme auth
    添加某个权限,比如addauth digest lee:lee

zk的作用体现

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

zk的session的基本原理

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

watcher机制

  • 针对每个节点得操作,都会有一个监督者->watcher
  • 可以理解为触发器,当节点有一些变化的时候,比如更新删除都会触发watcher事件,类似于触发器
  • zk中watcher是一次性的,触发后立即销毁

  • 父节点,子节点 增删改都会出发其watcher

  • 针对不同类型的操作,触发的watcher事件也不同,比如创建事件,删除事件,节点数据变化事件

命令行学习watcher

  • 通过get [-w] path设置watcher
  • stat [-w] path设置watcher
    例如执行 stat -w /xwm,此时就给xwm设置一个watcher,当修改/xwm得时候,如set /xwm 123时,会触发一个
    1
    WatchedEvent state:SyncConnected type:NodeDataChanged path:/xwm

格式的watcher,当再次执行set命令,则不会执行

watcher使用场景

  • 统一资源配置
    例如一个集群中所有的节点都一样,给他们设置watcher,当一个改变了,客户端就会收到一个watcher事件,客户端就会进行相应的操作集群中其他的机器

acl权限控制

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

命令

  • getAcl:获取某个节点的acl权限信息
  • setAcl:设置某个节点的acl权限信息
  • addauth:输入认证授权信息,注册时输入明文密码(登录)但是在zk系统里,密码是以加密的形式存在的

获取到一个节点的权限:getAcl /xwm/tmp

1
2
'world,'anyone
: cdrwa

  • zk的acl通过[scheme:id:permissions]来构成权限列表
    scheme:代表采用的某种权限机制
    id:代表允许访问的用户
    permissions:权限组和字符串

scheme

  • world:world下只有一个id,即只有一个用户,也就是anyone,那么组合写法就是world:anyone:[permissions]

  • auth:代表认证登录,需要注册用户权限就可以,形式为auth:user:passworld:[permissions]

  • digest:需要对密码加密才能访问,组合形式为digest:username:BASE64(SHA1(password)):[permissions]

  • auth和digest的区别就是前者是明文,后者是密文setAcl/path auth:lee:lee:cdrwa与setAcl /path digest:BASE64(SHA1(password))cdrwa是等价的,在通过addauth digest lee:lee后都能操作指定节点的权限。

  • ip:但设置为ip指定的ip地址,对此限制ip进行访问,比如ip:192.168.1.1:[permissions]

  • super:代表超级管理员,拥有所有的权限

permissions

  • 权限字符串缩写crdwa
  • create:创建子节点
  • read:获取节点/子节点
  • write:设置节点数据
  • delete:删除子节点
  • admin:设置权限

设置super权限

  1. 修改zkServer,增加super管理员
    在运行Java的代码中添加
    1
    "-Dzookeeper.DigestAuthenticationProvider.spuerDigest=hello:JD3gbdfzNg9biCKhgtpVo+3enoI="

则添加了超级管理员hello:123456

  1. 重启zkServer
  2. 登录超级管理员
    1
    addauth digest hello:123456

zk四字命令 four letter words

  • zk可以通过它自身提供的简写命令来和服务器进行交互
  • 需要nc命令,安装yum install nc
  • echo [commond] | nc [ip] [port]

commond

  • envi环境变量
  • conf输出相关服务配置的详细信息。
  • cons列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息。包括“接受 / 发送”的包数量、会话 id 、操作延迟、最后的操作执行等等信息。
  • dump列出未经处理的会话和临时节点。
  • envi输出关于服务环境的详细信息(区别于 conf 命令)。
  • reqs列出未经处理的请求
  • ruok测试服务是否处于正确状态。如果确实如此,那么服务返回“imok ”,否则不做任何相应。
  • stat输出关于性能和连接的客户端的列表。
  • wchs列出服务器 watch 的详细信息。
  • wchc通过 session 列出服务器 watch 的详细信息,它的输出是一个与watch 相关的会话的列表。
  • wchp通过路径列出服务器 watch 的详细信息。它输出一个与 session相关的路径。
  • mntr监控zk健康信息

zk集群