Zookeeper分布式专题

zookeeper简介

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

  • 特性:

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

分布式系统

  • 多个计算机组成一个整体,一个整体一致对外并且处理同一请求
  • 内部的每台计算机都可以通信,restful/rpc
  • 客户端到服务端的一次请求到响应结束会经历多台计算机

zookeeper的安装

jdk安装

  1. 下载linux的jdk1.8,上传服务器
  2. 解压缩jdk,配置jdk
  3. 测试:java -version

    1
    2
    3
    4
    ubuntu@VM-0-8-ubuntu:~$ java -version
    java version "1.8.0_181"
    Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
    Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

zookeeper基本数据模型

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

基本操作

  • 客户端连接
  • 查看znode
  • 关闭连接

zk的作用

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

zk基本特性

  • ./zkCli.sh打开客户端

  • ls

  • ls2

  • get

  • stat

参数信息:

  • cZid:节点id
  • ctime:创建时间
  • mZid:修改节点的id
  • mTime
  • pZxid:子节点id
  • cversion:子节点version
  • dataVersion:当前节点数据的版本号
  • aclVersion:权限版本号
  • ephemeralOwner:
  • dataLength:
  • numChildren:子节点的个数

session的基本原理

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

create命令

  • 创建持久化节点

  • 创建临时节点

  • 创建顺序节点

set命令

  • 根据版本号实现乐观锁

delete命令

  • 不设置版本号

  • 设置版本号需要版本号匹配才可以删除

watcher机制

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

watcher命令行

  • watcher事件类型

    • 创建父节点触发:NodeCreated
    • 修改父节点数据触发:NodeDataChanged
    • 删除节点触发:NodeDeleted
    • ls为父节点设置watcher,创建子节点触发:NodeChildrenChanged
    • ls为父节点设置watcher,删除子节点触发:NodeChildrenChanged
    • ls为父节点设置watcher,修改子节点不触发任何事件
  • watcher使用场景

    • 统一资源配置

ACL(Acess Control Lists)权限控制

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

ACL命令行

  • getAcl:获取某个节点的acl权限信息
  • setAcl:设置某个节点的acl权限信息
  • addauth:输入认证权限信息,注册时输入明文密码登录,但是在zk的系统中,密码以加密形式存在。
  • zk的acl通过【scheme:id:permissions】来构成权限列表
    • scheme:代表采用的某种权限机制
      • world:world下只有一个id,也就是只有一个用户anyone,任何人都可以访问该节点
      • auth:代表认证登录,需要注册用户有权限就可以,明文密码登录
      • digest:需要对密码加密才能访问
      • ip:当设置ip为指定的ip地址,此时限制ip进行访问
      • super:代表超级管理员,拥有所有的权限
    • id:代表允许访问的用户
    • permissions:权限组合字符串
      • crdwa:权限字符串
      • create:创建子节点
      • read:获取节点、子节点
      • write:设置节点数据
      • delete:删除子节点
      • admin:设置权限
  1. world:anyone:cdrwa

  1. auth:user:pwd:cdrwa
  2. digest:user:BASE64(SHA1(pwd)):cdrwa
  3. addauth digest user:pwd

zk集群

集群搭建的注意点

  • 配置文件myid 1/2/3对应server.1.2.3
  • 通过./zkCli.sh -server [ip]:[port]检测集群是否配置成功
Donate comment here