当前位置:   article > 正文

【Zookeeper基础】01 基础知识_注册服务与zk建立多个连接数

注册服务与zk建立多个连接数

目录

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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123

参考:

  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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  2. 连接状态

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

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"
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

3.2. watcher通知机制

  1. 概述

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

    ==== watcher 通知机制 ====
    stat path [watch]  # 设置watch事件
    get  path [watch]  # 设置watch事件
    
    
    • 1
    • 2
    • 3
    • 4

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 超级管理员
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

参考:

  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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

5.2. 连接数管理

5.2.1. 参数配置管理

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

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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

参考:

  1. zookeeper集群模式下报连接数过多问题
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/763516
推荐阅读
相关标签
  

闽ICP备14008679号