【Zookeeper基础】01 基础知识

目录

1. Zookeeper 概述


1.1. 概述

1.1.1. 概述

  1. 用途

    1. Zookeeper 是 Apache 的一个顶级项目,yahoo开发的, 为分布式应用提供一致性高性能协调服务
    2. 可以用来做:配置维护、域名服务、分布式锁等。有很多开源组件,尤其是中间件领域,使用 Zookeeper 作为配置中心或者注册中心。
    3. 它是 Hadoop 和 HBase 的重要组件,是 Kafka 的管理和协调服务,是 Dubbo 等服务框架的注册中心等
    4. Zookeeper = 文件系统 +通知机制
  2. 工作机制:

    1. 从 设计模式 的角度来讲: 基于观察者模式 设计的分布式服务管理框架;
    2. 负责存储和管理 “大家都关心的数据”, 然后接受 观察者的注册,
    3. 一旦数据的状态发生变化, ZK 负责通知已经在 ZK 注册的那些观察者 做出相应的反应;

    工作机制

1.1.2. 特点

  • 集群
    集群
  1. Zookeeper: 一个领导者(Leader), 多个跟随者(Follower)组成的集群;
  2. 集群中只要有 半数以上 节点存活, Zookeeper集群就能正常服务;
  3. 全局数据一致: 每个server保存一份相同的数据副本, Client无论连接那个server, 数据均一致;
  4. 更新请求顺序进行: 来自 同一个Client 的更新请求按其发送顺序依次执行;
  5. 数据更新原子性: 一次数据更新, 要么成功, 要么失败;
  6. 实时性: 在一定时间范围内, Client 能读到最新数据;

1.1.3. 应用场景

  • ZK提供的服务:
    • 统一命名服务:

      1. 对 应用/服务 进行统一命名, 便于识别;
    • 统一配置管理

      1. 一个集群中所有节点的配置信息是一致的; 比如Kafka集群;
      2. 对配置文件修改后,快速同步到各个节点上;
    • 统一集群管理

      1. 实时监控各节点状态的变化;
    • 服务器节点动态上下线

      1. 客户端 能够时事观察到服务器上下线的变化;
    • 软负载均衡

参考资料: 重要

  1. ZooKeeper 官方文档
  2. w3c ZooKeeper教程
  3. ZooKeeper 笔记 ----安装等多篇

1.2. 组成介绍

  1. 角色
    1. Leader
    2. Follower
    3. Observer

2. 基本命令


2.1. 数据结构

  • 数据结构
    数据结构

2.2. 基本命令

  1. 基本命令
    ==> 命令汇总:
    help:
    ZooKeeper -server host:port cmd args
            stat path [watch]
            set path data [version]
            ls path [watch]
            delquota [-n|-b] path
            ls2 path [watch]
            setAcl path acl
            setquota -n|-b val path
            history
            redo cmdno
            printwatches on|off
            delete path [version]
            sync path
            listquota path
            rmr path
            get path [watch]
            create [-s] [-e] path data acl
            addauth scheme auth
            quit
            getAcl path
            close
            connect host:port
    
    ===== 释义: =====
    get : 获取节点数据和更新信息
        [zk: 10.229.0.1:32181(CONNECTED) 2] get /zookeeper  #下面空行说明节点内容为空;
    
        cZxid = 0x0       # Zookeeper为节点分配的Id
        ctime = Thu Jan 01 08:00:00 CST 1970  # 节点创建时间
        mZxid = 0x0                           # 修改后的id
        mtime = Thu Jan 01 08:00:00 CST 1970  # 修改时间
        pZxid = 0x0       # 子节点id
        cversion = -1     # 子节点的version
        dataVersion = 0   # 当前节点数据的版本号
        aclVersion = 0    # 权限 version
        ephemeralOwner = 0x0    # 若为临时节点,值为该节点拥有者的session ID;
                                # 若该节点不是 ephemeral节点, ephemeralOwner值为0.
        dataLength = 0      # 数据长度
        numChildren = 1     # 子节点个数
    
    ls :  查看目录
        ls /
    ls2 : ls 和 stat命令的整合
        [zk: 10.229.0.1:32181(CONNECTED) 4] ls2 /zookeeper
        [quota]
        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 = -1
        dataVersion = 0
        aclVersion = 0
        ephemeralOwner = 0x0
        dataLength = 0
        numChildren = 1
    
    stat : 获取节点的更新信息;  检查状态
        [zk: 10.229.0.1:32181(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 = -1
        dataVersion = 0
        aclVersion = 0
        ephemeralOwner = 0x0
        dataLength = 0
        numChildren = 1
    
    ==== create
    create : 创建节点  : create [-s] [-e] path data acl
        [zk: 10.229.0.1:32181(CONNECTED) 5] create /tm testpoint
        Created /tm
        [zk: 10.229.0.1:32181(CONNECTED) 6] get /tm
        testpoint
        cZxid = 0x9841
        ctime = Tue Jun 23 21:09:02 CST 2020
        mZxid = 0x9841
        mtime = Tue Jun 23 21:09:02 CST 2020
        pZxid = 0x9841
        cversion = 0
        dataVersion = 0
        aclVersion = 0
        ephemeralOwner = 0x0
        dataLength = 9
        numChildren = 0
    
    ==其他:
        create -e 创建临时节点       # 断开重连之后, 临时节点自动消失;
        create -s 创建顺序节点, 自动累加;
    
    set path data [version] : 修改节点
        [zk: 10.229.0.1:32181(CONNECTED) 7] set /tm lastpoint
        cZxid = 0x9841
        ctime = Tue Jun 23 21:09:02 CST 2020
        mZxid = 0x99a1
        mtime = Tue Jun 23 21:21:33 CST 2020
        pZxid = 0x9841
        cversion = 0
        dataVersion = 1
        aclVersion = 0
        ephemeralOwner = 0x0
        dataLength = 9
        numChildren = 0
        [zk: 10.229.0.1:32181(CONNECTED) 8] get /tm
        lastpoint
        cZxid = 0x9841
        ctime = Tue Jun 23 21:09:02 CST 2020
        mZxid = 0x99a1
        mtime = Tue Jun 23 21:21:33 CST 2020
        pZxid = 0x9841
        cversion = 0
        dataVersion = 1
        aclVersion = 0
        ephemeralOwner = 0x0
        dataLength = 9
        numChildren = 0
    
    delete path [version] : 删除节点
    

参考:

  1. Zookeeper系列一:Zookeeper基础命令操作 //多篇

2.3. 启停 连接管理

  1. 基本命令

    # == 基本启停
        在准备好相应的配置之后,可以直接通过zkServer.sh 这个脚本进行服务的相关操作
        1. 启动ZK服务:       sh bin/zkServer.sh start
        2. 查看ZK服务状态:   sh bin/zkServer.sh status
        3. 停止ZK服务:       sh bin/zkServer.sh stop
        4. 重启ZK服务:       sh bin/zkServer.sh restart
        5. ZK服务连接:       sh bin/zkCli.sh -server 127.0.0.1:2181
    
        备注: 需要在zookeeper目录下去执行这些命令,如:
    
    # 连接使用
        ## 启动
        sh ./bin/zkServer.sh start
        ## 单机模式(只有一台服务器)连接
        ./bin/zkCli.sh -server 127.0.0.1:2181
    # == 退出
        ## 退出zookeeper客户端
            quit
    
  2. 连接状态

    KeeperState.Expired    # 过期状态
        客户端和服务器在ticktime的时间周期内,是要发送心跳通知的。这是租约协议的一个实现。
        客户端发送request,告诉服务器其上一个租约时间,服务器收到这个请求后,告诉客户端其下一个租约时间是哪个时间点。
        当客户端时间戳达到最后一个租约时间,而没有收到服务器发来的任何新租约时间,
        即认为自己下线(此后客户端会废弃这次连接,并试图重新建立连接)。这个过期状态就是 Expired状态;
    
    KeeperState.Disconnected
        当客户端断开一个连接(可能是租约期满,也可能是客户端主动断开), 此时客户端和服务器的连接是 Disconnected状态
    
    KeeperState.SyncConnected
        一旦客户端和服务器的某一个节点(多节点中的一个即可)建立连接,并完成一次version、zxid的同步,这时客户端和服务器的连接状态就是 SyncConnected
    KeeperState.AuthFailed
        zookeeper客户端进行连接认证失败时, 发生该状态;
    
    ==注意:==
        1. 这些状态在触发时,所记录的事件类型都是:EventType.None
    

3. 命令详解


3.1. 创建节点

  1. 基本命令
    create : 创建节点  : create [-s] [-e] path data acl
    -- 四类节点:
    # 无需持久节点  --默认模式
        create /hanchao_test/defatul_node "persistent,no-sequence"
    
    # 有序持久节点  -s
        # 有序节点名称=有序节点路基+10位顺序号
        [zk: localhost:2181(CONNECTED) 3] create -s /hanchao_test/sequence_node "persistent,sequence"
        Created /hanchao_test/sequence_node0000000001
    
    # 无序临时节点
        # 临时节点在 client端口断开之后关闭
        create -e /hanchao_test/temp_node "no-persistent,no-sequence"
    
    # 有序临时节点
        create -s -e /hanchao_test/temp_node_p "no-persistent,order"
    
    
    
    

3.2. watcher通知机制

  1. 概述

    1. 当指定的znode或znode的子数据更改时,监视器会显示通知。
  2. 基本命令

    ==== watcher 通知机制 ====
    stat path [watch]  # 设置watch事件
    get  path [watch]  # 设置watch事件
    
    

3.3. ACL权限控制

  1. 基本命令
    ==== ACL权限控制: ====
    getAcl : 获取某个节点的权限信息
    setAcl : 设置权限
    acl Auth : 密码明文设置
        # 注册test:test 账号密码
        [zk: localhost:2181(CONNECTED) 3] addauth digest test:test
        [zk: localhost:2181(CONNECTED) 4] setAcl /niocoder/merryyou auth:test:test:cdrwa
    acl digest : 密码明文设置
        setAcl /names digest:test:V28q/NynI4JI3Rk54h0r8O5kMug=:cdra
    acl ip : 控制客户端
        [zk: localhost:2181(CONNECTED) 3] addauth digest test:test
        [zk: localhost:2181(CONNECTED) 4] setAcl /niocoder/merryyou auth:test:test:cdrwa
    acl super 超级管理员
    
    

3.4. 四字命令 Four Letter Words

需要安装nc

  • 四字命令
    # 查看状态信息 stat
        [insight@localhost bin]$ echo stat | nc 10.229.0.1 32181
        Zookeeper version: 3.4.14-4c25d480e66aadd371de8bd2fd8da255ac140bcf, built on 03/06/2019 16:18 GMT
        Clients:
        /10.229.0.2:11515[0](queued=0,recved=1,sent=0)
        /10.229.0.1:18670[1](queued=0,recved=14557,sent=14557)
        /10.229.0.1:53171[1](queued=-1,recved=2565,sent=2592)
        /10.229.0.1:53229[1](queued=0,recved=6835,sent=6835)
    
        Latency min/avg/max: 0/2/20
        Received: 311648
        Sent: 326702
        Connections: 4
        Outstanding: 0
        Zxid: 0xaa0c
        Mode: standalone
        Node count: 8821
    
    # 查看zookeeper是否启动  ruok
        [root@localhost bin]  echo ruok | nc 192.168.0.68 2181
    
    # dump 查看没有处理的节点, 临时节点
        [root@localhost bin]  echo dump | nc 192.168.0.68 2181
    
    # conf 查看服务器配置
        [root@localhost bin] echo conf | nc 192.168.0.68 2181
    
    # cons 显示连接到服务端的信息
        [root@localhost bin]  echo cons | nc 192.168.0.68 2181
    
    # envi 显示环境变量信息
        [root@localhost bin]  echo envi | nc 192.168.0.68 2181
    
    # mntr 查看zk的健康信息
        [root@localhost bin]  echo mntr | nc 192.168.0.68 2181
    
    # wchs 展示watch的信息
        [root@localhost bin]  echo wchs | nc 192.168.0.68 2181
    
    # wchc 和 wchp 显示session的watch信息 path的watch信息
        需要在 配置zoo.cfg文件中添加 4lw.commands.whitelist=*
        [root@localhost bin]  echo wchc | nc 192.168.0.68 2181
        wchc is not executed because it is not in the whitelist.
        [root@localhost bin]  echo wchp | nc 192.168.0.68 2181
        wchp is not executed because it is not in the whitelist.
    
    

参考:

  1. Zookeeper系列一:Zookeeper基础命令操作 //多篇

4. Zookeeper内部原理

4.1. 选举机制

  • 半数机制:
    1. 集群中半数以上机器存活, 集群可用: ==> Zookeeper适合安装奇数台服务器;
    2. Leader 由内部的选举机制临时产生的;

4.1.1. 选举机制


5. 使用实战


5.1. 配置参数

  • 参数配置
    # The number of milliseconds of each tick   #心跳间隔: ms
    tickTime=2000
    # The number of ticks that the initial  #初始化时间: 心跳个数 Leader follower
    # synchronization phase can take
    initLimit=10
    # The number of ticks that can pass between    #工作时的心跳数限制
    # sending a request and getting an acknowledgement
    syncLimit=5
    
    

5.2. 连接数管理

5.2.1. 参数配置管理

  1. 连接数目
    ## 连接数
    maxClientCnxns:
        官方解释:单个客户端与单台服务器之间的连接数的限制,是ip级别的,
                    默认是 60, 如果设置为0,那么表明不作任何限制。
    

5.2.2. 问题处置

  1. 连接数目过多
    # 查看端口占用
        sudo netstat -nap |grep 2181  #2181 默认端口
    
    #== 解决方法: ==
        1.代码:     打补丁,解决zookeeper连接资源,producer.close 、consume.shutdown。
        2.配置文件: a.zookeeper默认连接数值60,可以适当调大至500。
                    b.在配置文件中加入会话超时设置,在conf/zoo.conf最后加上:minSessionTimeout=30000,maxSessionTimeout=60000
    
        ==集群重启:==
        建议搭建使用zookeeper集群管理平台exhibitor
    

参考:

  1. zookeeper集群模式下报连接数过多问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值