Zookeeper

概述

开源的分布式协调服务框架,用来解决分布式集群中应用系统的一致性和数据管理问题。核心件,分布式锁。

特点

  • 本质是一个分布式文件系统,适合存放小文件(配置文件,数据同步)
  • zk也是一个集群,分为不通的节点,znode为外部提供服务。类似树形结构。
  • 可通过操作文件的方式操作zk。

    • 根据路径读取、增加、删除、修改等操作。

架构

zk集群是一个基于主从架构的高可用集群。每个服务器承担三个角色的一种。

  • leader:核心,一般只有一个。,负责维护与其他两种角色间的心跳,所有操作通过leader广播给其它服务器。进行事务操作(写操作)
  • follower:可进行投票。事务型操作转发给leader。可处理客户端非事务型请求。
  • observer:无投票权。可处理客户端非事务型请求。

应用场景

  • 数据发布订阅

有两种模式,推拉模式,zk集合两种。

  • 命名服务

提供一套分布式全局唯一id的分配机制,方便客户端获取资源实体。

  • 分布式协调/通知

    • 心跳检测

    创建临时子节点监测某个节点是否存活,当某个节点心跳超时之后,这个临时子节点立即消失。

    • 工作进度汇报

    在一个节点下面为每个客户端创建临时子节点,一方面检测心跳,另一方面将任务进度写入该子节点。

    • 系统调度
  • 分布式锁

    • 排他锁,写锁或独占锁

      • 获取锁:只允许某个客户端创建/exclusive_lock/lock子节点,其他客户端只能够注册监听。
      • 释放锁:节点宕机或者业务完成会删除子节点,重新发起分布式锁获取。

    zk的操作都是通过创建子节点来实现的?树结构。。

    • 共享锁,读锁

    加上共享锁之后其他节点只能加共享锁,直到所有节点释放共享锁。客户端在/shared_lock下创建

  • 分布式队列

分布式环境下创建一个类似单进程队列的组件来实现跨进程、网络、主机之间的数据共享和传递。

  • 选举机制

至少2台机器,选举一个leader。

  • 启动时选举leader
  • leader节点宕机

选举过程:

​ myid:服务器编号

​ zxid:事务id,值越大事务越新。

1、每个sever发起一个投票,先各自给自己投一票。键值对保存(myid,zxid),然后将投票转发给集群中其他机器。存放为[(myid1,zxid1),(myid2,zxid2)]

2、接受投票

3、处理投票,进行pk,优先检查zxid,较大的优先作为leader

如果zxid相同就比较myid,myid较大的作为leader服务器

4、统计投票,每次投票后都统计投票信息,判断是否有过半机器收到相同的投票信息。过半机制。

5、改变服务器状态,一旦确定leader,每个服务器就更改自己的状态,follower-following,leader-leading。

一般要求zk的节点为奇数个,选举。zk宕机选举过程相同。

zk安装

  • 下载zk安装包,并上传到服务器

    https://dlcdn.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
  • 解压

    tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz
  • 修改配置文件

    cd apache-zookeeper-3.7.0-bin/
    mkdir zkdata
    cp conf/zoo_sample.cfg conf/zoo.cfg
    vim conf/zoo.cfg
    #data路径目录
    dataDir=/opt/apache-zookeeper-3.7.0-bin/zkdata
    #保留快照最大数目
    autopurge.snapRetainCount=3
    #日志多少小时清理一次
    autopurge.purgeInterval=1
    
    server.1=node001:2888:3888
    server.2=node002:2888:3888
    server.3=node003:2888:3888
  • 添加myid配置

    vim zkdata/myid
    写入myid的值,如1
  • 安装包分发到其他服务器

    scp -r /opt/apache-zookeeper-3.7.0-bin root@node003:/opt

修改其他两台的myid为23

  • 三台机器启动zk

    #启动
    bin/zkServer.sh start
    #查看状态
    bin/zkServer.sh status
    #查看java相关的进程
    jps

zk的数据模型

zk的数据模型拥有层次的命名空间,都采用树形结构。和文件的目录树相似。不同之处:

1、Znode兼具目录和文件两种。

2、Znode存储数据大小有限制。一般不超过1M,管理调度文件。

3、Znode通过绝对路径引用。

4、每个Znode由3部分组成

  • stat:状态,描述版本和权限
  • data:与znode关联的数据
  • children:该znode下的子节点

Znode的节点类型

一旦建立不可更改。

  • 临时节点

依赖建立的会话,会话结束,节点删除,也可手动删除。其不允许拥有子节点。

  • 永久节点

不依赖会话,当客户端执行删除操作时其才被删除。

具有序列化特性,创建时指定,该Znode名字后自动追加一个不断增加的序列号,记录创建先后顺序,(格式%10d,无数值用0补充)

可以对应出4种节点类型

  • PRESISTENT:永久节点
  • EPHEMERAL:临时节点
  • PRESISTENT_SEQUENTIAL:永久序列化节点
  • EPHEMERAL_SEQUENTIAL:临时序列化节点

zk客户端操作

  • 登录zk客户端

    bin/zkCli.sh -server node001:2181
  • 客户端操作命令

    addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE
    addauth scheme auth
    close 
    config [-c] [-w] [-s]
    connect host:port
    create [-s] [-e] [-c] [-t ttl] path [data] [acl]
    delete [-v version] path
    deleteall path [-b batch size]
    delquota [-n|-b|-N|-B] path
    get [-s] [-w] path
    getAcl [-s] path
    getAllChildrenNumber path
    getEphemerals path
    history 
    listquota path
    ls [-s] [-w] [-R] path
    printwatches on|off
    quit 
    reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
    redo cmdno
    removewatches path [-c|-d|-a] [-l]
    set [-s] [-v version] path data
    setAcl [-s] [-v version] [-R] path acl
    setquota -n|-b|-N|-B val path
    stat [-w] path
    sync path
    version 
    whoami 

| 命令 | 说明 | 参数说明 |
| ------------------------------------------------ | ------------------------------------ | ------------------------------------ |
| create [-s] [-e] [-c] [-t ttl] path [data] [acl] | 创建Znode | -s 指定顺序节点
-e 指定临时节点 |
| ls [-s] [-w] [-R] path | 列出path下所有子Znode | |
| get [-s] [-w] path | 获取path对应的Znode的数据和属性 | |
| ls2 [-s] [-w] [-R] path | 列出path下所有子Znode及子Znode的属性 | |
| set [-s] [-v version] path data | 更新节点 | |
| | | |
| | | |

实例说明:

#创建永久节点
create /hello world
#创建临时节点
create -e /hello world
#创建永久序列化节点
create -s /persistent node
#创建临时序列化节点
create -e -s /ehello world
#修改节点数据
set /hello xxx
#删除节点,有子节点无法删除
delete /hello
#递归删除节点
rmr /hello
#列出历史记录
history

zk的节点属性

通过命令get获取节点属性

dateVersion:set一下数据值加一

cversion:子节点版本号,当znode子节点变化时值加一

aclVersion:acl版本号

cZxid:znode创建的事务id

ctime:创建时的时间戳

mtime:修改时的时间戳

ephemeralOwner:为临时节点值为sessionID,否则为0

watch机制

作用:发布、订阅;监控集群中主机的存活状态。类似数据库的触发器,一旦znode变化的时候watchmanager会调用对应的watcher。

文章目录