zoukankan      html  css  js  c++  java
  • Windows安装Zookeeper

    Zookeeper下载:http://archive.apache.org/dist/zookeeper/

    我下载的是:zookeeper-3.4.13

    一、单节点

    # 解压到常用的安装目录

    # 将conf目录下的zoo_sample.cfg文件,复制一份,重命名为zoo.cfg。

    # 修改zoo.cfg配置文件,将dataDir=/tmp/zookeeper修改成zookeeper安装目录所在的data文件夹(需要在安装目录下面新建一个空的zkdata文件夹和zklog文件夹),再添加一条添加数据日志的配置,如下图:

    参数说明:

    tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。

    initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒

    syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒

    dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。

    clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。

    # 启动程序

    验证是否安装成功,双击zkCli.cmd:

    出现如图欢迎字样则安装成功!

    二、伪集群

    # 复制三份安装目录

    # 将conf目录下的zoo_sample.cfg文件重命名为zoo.cfg,并且按照下面的方式简单配置:

    zookeeper-1的zoo.cfg配置

    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=C:\install\zkCluster\zookeeper-1\data
    dataDirLog=C:\install\zkCluster\zookeeper-1\logs
    clientPort=2181
    server.1=127.0.0.1:2888:3888  
    server.2=127.0.0.1:2889:3889  
    server.3=127.0.0.1:2890:3890 

    zookeeper-2的zoo.cfg配置

    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=C:\install\zkCluster\zookeeper-2\data
    dataDirLog=C:\install\zkCluster\zookeeper-2\logs
    clientPort=2182
    server.1=127.0.0.1:2888:3888  
    server.2=127.0.0.1:2889:3889  
    server.3=127.0.0.1:2890:3890 

    zookeeper-3的zoo.cfg配置

    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=C:\install\zkCluster\zookeeper-3\data
    dataDirLog=C:\install\zkCluster\zookeeper-3\logs
    clientPort=2183
    server.1=127.0.0.1:2888:3888  
    server.2=127.0.0.1:2889:3889  
    server.3=127.0.0.1:2890:3890 

    关于zoo.cfg的配置进行说明:

    ① 在集群模式下,集群中每台机器都需要感知到整个集群是由哪几台机器组成的,在配置文件中,可以按照这样的格式进行配置,每一行都代表一个机器配置:server.id=host:port:port。其中,id被称为 Server ID,用来标识该机器在集群中的机器序列号。同时,在每台Zookeeper机器上,我们都需要在数据目录(即dataDir参数指定的那个目录)下创建一个myid文件,该文件只有一行内容,并且是一个数字,即对应于每台机器的Server ID 数字。

    第一个port用于指定follower与leader进行通信和数据同步所使用的tcp端口;第二个port指定leader选举中投票通信的tcp端口。

    ② 在Zk的设计中,集群中所有机器上的zoo.cfg文件的内容都应该是一致的。因此最好使用svn或是git把此文件管理起来,确保每个机器都能共享到一份相同的配置。

    ③ myid文件中只有一个数字,即一个Server ID。例如,server.1的myid文件内容就是"1"。注意,清确保每个服务器的myid文件中的数字不同,并且和自己所在机器的zoo.cfg中server.id=houst:port:port的id一致。另外,id的范围是1~255。

    ④ 参数的作用说明:

    1) tickTime:默认值为3000,单位是毫秒(ms),可以不配置。参数tickTime用于配置Zookeeper中最小时间单元的长度,很多运行时的时间间隔都是使用tickTime的倍数来表示的。例如,Zk中会话的最小超时时间默认是2*tickTime。

    2) dataDir:该参数无默认值,必须配置。参数dataDir用于配置Zookeeper服务器存储快照文件的目录。

    3) clientPort:参数clientPort用于配置当前服务器对外的服务端口,客户端会通过该端口和Zk服务器创建连接,一般设置为2181。

    4) initLimit:该参数默认值:10,表示是参数tickTime值的10倍,必须配置,且为正整数。该参数用于配置Leader服务器等待Follower启动,并完成数据同步的时间。Follower服务器在启动过程中,会与Leader建立连接并完成对数据的同步,从而确定自己对外提高服务的起始状态。leader服务器允许Follower在initLimit时间内完成这个工作。

    5) syncLimit:该参数默认值:5,表示是参数tickTime值的5倍,必须配置,且为正整数。该参数用于配置Leader服务器和Follower之间进行心跳检测的最大延时时间。在Zk集群运行的过程中,Leader服务器会与所有的Follower进行心跳检测来确定该服务器是否存活。如果Leader服务器在syncLimit时间内无法获取到Follower的心跳检测响应,那么Leader就会认为该Follower已经脱离了和自己的同步。

    6) server.id:该参数无默认值,在单机模式下可以不配置。该参数用于配置组成Zk集群的机器列表,其中id即为Server ID,与每台服务器myid文件中的数字相对应。同时,在该参数中,会配置两个端口:第一个端口用于指定Follower服务器与Leader进行运行时通信和数据同步时所使用的端口,第二个端口测专门用于进行Leader选举过程中的投票通信。

    # 创建myid文件

    在dataDir所配置的目录下,创建一个名为myid的文件,在该文件的第一行写上一个数字,和zoo.cfg中当前机器的编号对应上。即:

    在C:\install\zkCluster\zookeeper-1\data下创建值为"1"的myid文件。

    在C:\install\zkCluster\zookeeper-2\data下创建值为"1"的myid文件。

    在C:\install\zkCluster\zookeeper-3\data下创建值为"1"的myid文件。

    # 启动zk

    至此,所有Zk都已经基本配置完毕,可以使用 bin 目录下的zkServer.cmd脚本进行服务器的启动了。

    刚启动第一个Zk时会不断报错,这是正常的,因为集群中其它的Zk还未起来,Zk集群之间的心跳检测未检测到其它Zk,等集群中所有的Zk都启动后,就不会报错了。

    可以使用bin下的zkCli.cmd -server 127.0.0.1:2181连接到zk1这个实例了,当然2182,2183也是可以使用任意客户端连接上。

    # 查看节点

    因为zk的单一视图,我们可以在zk1查看zk2创建的节点。

    三、Zookeeper的操作

    退出客户端
    [zk: localhost:2181(CONNECTED) 6] quit
    ls查看

    默认只有zookeeper一个节点

    stat 获得节点的更新信息

    get 获取节点数据和更新信息

    cZxid :创建节点的id
    ctime : 节点的创建时间
    mZxid :修改节点的id
    mtime :修改节点的时间
    pZxid :子节点的id
    cversion : 子节点的版本
    dataVersion : 当前节点数据的版本
    aclVersion :权限的版本
    ephemeralOwner :判断是否是临时节点
    dataLength : 数据的长度
    numChildren :子节点的数量

    ls2 是ls命令和stat命令的整合

    创建节点

    create [-s] [-e] path data acl 可以注意一下各个版本的变化

    create -e 创建临时节点

     断开重连之后,临时节点自动消失(注:可能立即查时,因为心跳机制,临时节点还存在的情况,)

    create -s 创建顺序节点 自动累加

    set path data [version] 修改节点

    delete path [version] 删除节点
    watcher通知机制

    当每个节点发生变化,都会触发watcher事件,类似于mysql的触发器。zk中 watcher是一次性的,触发后立即销毁。

    stat path [watch] 设置watch事件 

    get path [watch]设置watch事件 

    子节点创建和删除时触发watch事件,子节点修改不会触发该事件。

    # stat path [watch] 设置watch事件

    # get path [watch] 设置watch事件

    #使用get命令添加watch事件
    [zk: localhost:2181(CONNECTED) 20] get /longfei watch
    test
    cZxid = 0x20000000e
    ctime = Sat Jun 02 14:43:15 UTC 2018
    mZxid = 0x20000000e
    mtime = Sat Jun 02 14:43:15 UTC 2018
    pZxid = 0x20000000e
    cversion = 0
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 4
    numChildren = 0
    #修改节点触发watcher事件
    [zk: localhost:2181(CONNECTED) 21] set /longfei new_test
    
    WATCHER::
    
    WatchedEvent state:SyncConnected type:NodeDataChanged path:/longfei
    cZxid = 0x20000000e
    ctime = Sat Jun 02 14:43:15 UTC 2018
    mZxid = 0x20000000f
    mtime = Sat Jun 02 14:45:06 UTC 2018
    pZxid = 0x20000000e
    cversion = 0
    dataVersion = 1
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 8
    numChildren = 0
    [zk: localhost:2181(CONNECTED) 22] 
    #删除触发watcher事件
    [zk: localhost:2181(CONNECTED) 23] get /longfei watch
    new_test
    cZxid = 0x20000000e
    ctime = Sat Jun 02 14:43:15 UTC 2018
    mZxid = 0x20000000f
    mtime = Sat Jun 02 14:45:06 UTC 2018
    pZxid = 0x20000000e
    cversion = 0
    dataVersion = 1
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 8
    numChildren = 0
    [zk: localhost:2181(CONNECTED) 24] delete /longfei
    
    WATCHER::
    
    WatchedEvent state:SyncConnected type:NodeDeleted path:/longfei
    [zk: localhost:2181(CONNECTED) 25] 
    ACL权限控制

    ZK的节点有5种操作权限:CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写)。
    注:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限。

    身份的认证有4种方式: 

    • world:默认方式,相当于全世界都能访问
    • auth:代表已经认证通过的用户(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)
    • digest:即用户名:密码这种方式认证,这也是业务系统中最常用的
    • ip:使用Ip地址认证

    # getAcl:获取某个节点的acl权限信息

    #获取节点权限信息默认为 world:cdrwa任何人都可以访问
    [zk: localhost:2181(CONNECTED) 34] getAcl /merryyou
    'world,'anyone
    : cdrwa
    [zk: localhost:2181(CONNECTED) 35] 

    # setAcl 设置权限

    [zk: localhost:2181(CONNECTED) 35] create /merryyou/test test
    Created /merryyou/test
    [zk: localhost:2181(CONNECTED) 36] getAcl /merryyou/test
    'world,'anyone
    : cdrwa
    #设置节点权限 crwa 不允许删除
    [zk: localhost:2181(CONNECTED) 37] setAcl /merryyou/test world:anyone:crwa
    cZxid = 0x200000018
    ctime = Sat Jun 02 16:18:18 UTC 2018
    mZxid = 0x200000018
    mtime = Sat Jun 02 16:18:18 UTC 2018
    pZxid = 0x200000018
    cversion = 0
    dataVersion = 0
    aclVersion = 1
    ephemeralOwner = 0x0
    dataLength = 4
    numChildren = 0
    #查询刚才设置的acl权限信息 crwa 没有删除权限
    [zk: localhost:2181(CONNECTED) 38] getAcl /merryyou/test
    'world,'anyone
    : crwa
    [zk: localhost:2181(CONNECTED) 39] 
    [zk: localhost:2181(CONNECTED) 39] create /merryyou/test/abc abc
    Created /merryyou/test/abc
    #删除子节点的时候提交权限不足
    [zk: localhost:2181(CONNECTED) 40] delete /merryyou/test/abc
    Authentication is not valid : /merryyou/test/abc
    #设置节点的权限信息为rda
    [zk: localhost:2181(CONNECTED) 41] setAcl /merryyou/test world:anyone:rda 
    cZxid = 0x200000018
    ctime = Sat Jun 02 16:18:18 UTC 2018
    mZxid = 0x200000018
    mtime = Sat Jun 02 16:18:18 UTC 2018
    pZxid = 0x20000001a
    cversion = 1
    dataVersion = 0
    aclVersion = 2
    ephemeralOwner = 0x0
    dataLength = 4
    numChildren = 1
    [zk: localhost:2181(CONNECTED) 42] getAcl /merryyou/test
    'world,'anyone
    : dra
    #可以成功删除
    [zk: localhost:2181(CONNECTED) 43] delete /merryyou/test/abc             
    [zk: localhost:2181(CONNECTED) 46] ls /merryyou/test
    []
    [zk: localhost:2181(CONNECTED) 47] 
    #设置节点信息为a admin
    [zk: localhost:2181(CONNECTED) 47] setAcl /merryyou/test world:anyone:a  
    cZxid = 0x200000018
    ctime = Sat Jun 02 16:18:18 UTC 2018
    mZxid = 0x200000018
    mtime = Sat Jun 02 16:18:18 UTC 2018
    pZxid = 0x20000001d
    cversion = 2
    dataVersion = 0
    aclVersion = 3
    ephemeralOwner = 0x0
    dataLength = 4
    numChildren = 0
    #获取 设置都提示权限不足
    [zk: localhost:2181(CONNECTED) 49] get /merryyou/test
    Authentication is not valid : /merryyou/test
    [zk: localhost:2181(CONNECTED) 50] set /merryyou/test 123
    Authentication is not valid : /merryyou/test
    [zk: localhost:2181(CONNECTED) 51] 

    # acl Auth 密码明文设置

    [zk: localhost:2181(CONNECTED) 53] create /niocoder/merryyou merryyou
    Created /niocoder/merryyou
    #查询默认节点权限信息
    [zk: localhost:2181(CONNECTED) 54] getAcl /niocoder/merryyou
    'world,'anyone
    : cdrwa
    [zk: localhost:2181(CONNECTED) 55] 
    #使用auth设置节点权限信息
    [zk: localhost:2181(CONNECTED) 2] setAcl /niocoder/merryyou auth:test:test:cdrwa  
    Acl is not valid : /niocoder/merryyou
    # 注册test:test 账号密码
    [zk: localhost:2181(CONNECTED) 3] addauth digest test:test
    [zk: localhost:2181(CONNECTED) 4] setAcl /niocoder/merryyou auth:test:test:cdrwa
    cZxid = 0x200000020
    ctime = Sat Jun 02 16:32:08 UTC 2018
    mZxid = 0x200000020
    mtime = Sat Jun 02 16:32:08 UTC 2018
    pZxid = 0x200000020
    cversion = 0
    dataVersion = 0
    aclVersion = 1
    ephemeralOwner = 0x0
    dataLength = 8
    numChildren = 0
    #查询节点权限信息 密码为密文格式
    [zk: localhost:2181(CONNECTED) 5] getAcl /niocoder/merryyou
    'digest,'test:V28q/NynI4JI3Rk54h0r8O5kMug=
    : cdrwa
    [zk: localhost:2181(CONNECTED) 6] 

    # acl digest 密码密文设置

    [zk: localhost:2181(CONNECTED) 13] create /names test
    Created /names
    [zk: localhost:2181(CONNECTED) 14] getAcl /names
    'world,'anyone
    : cdrwa
    #使用digest设置节点的权限信息 密码为test密文
    [zk: localhost:2181(CONNECTED) 15] setAcl /names digest:test:V28q/NynI4JI3Rk54h0r8O5kMug=:cdra
    cZxid = 0x400000006
    ctime = Sun Jun 03 01:01:17 UTC 2018
    mZxid = 0x400000006
    mtime = Sun Jun 03 01:01:17 UTC 2018
    pZxid = 0x400000006
    cversion = 0
    dataVersion = 0
    aclVersion = 1
    ephemeralOwner = 0x0
    dataLength = 4
    numChildren = 0
    #查询节点权限信息
    [zk: localhost:2181(CONNECTED) 16] getAcl /names
    'digest,'test:V28q/NynI4JI3Rk54h0r8O5kMug=
    : cdra
    #获取节点信息提示权限不足
    [zk: localhost:2181(CONNECTED) 5] get /names
    Authentication is not valid : /names
    # 注册账户
    [zk: localhost:2181(CONNECTED) 4] addauth digest test:test
    # 可以正常获取
    [zk: localhost:2181(CONNECTED) 17] get /names          
    test
    cZxid = 0x400000006
    ctime = Sun Jun 03 01:01:17 UTC 2018
    mZxid = 0x400000006
    mtime = Sun Jun 03 01:01:17 UTC 2018
    pZxid = 0x400000006
    cversion = 0
    dataVersion = 0
    aclVersion = 1
    ephemeralOwner = 0x0
    dataLength = 4
    numChildren = 0
    #由于没有设置写权限不能修改节点 w
    [zk: localhost:2181(CONNECTED) 18] set /names 111
    Authentication is not valid : /names
    [zk: localhost:2181(CONNECTED) 19] delete /names
    [zk: localhost:2181(CONNECTED) 20] 

    # acl ip 控制客户端

    [zk: localhost:2181(CONNECTED) 22] create /niocoder/ip aa
    Created /niocoder/ip
    [zk: localhost:2181(CONNECTED) 23] get /niocoder/ip
    aa
    cZxid = 0x40000000a
    ctime = Sun Jun 03 01:06:47 UTC 2018
    mZxid = 0x40000000a
    mtime = Sun Jun 03 01:06:47 UTC 2018
    pZxid = 0x40000000a
    cversion = 0
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 2
    numChildren = 0
    # 添加ip控制的权限信息
    [zk: localhost:2181(CONNECTED) 24] setAcl /niocoder/ip ip:192.168.0.68:cdrwa
    cZxid = 0x40000000a
    ctime = Sun Jun 03 01:06:47 UTC 2018
    mZxid = 0x40000000a
    mtime = Sun Jun 03 01:06:47 UTC 2018
    pZxid = 0x40000000a
    cversion = 0
    dataVersion = 0
    aclVersion = 1
    ephemeralOwner = 0x0
    dataLength = 2
    numChildren = 0
    [zk: localhost:2181(CONNECTED) 25] getAcl /niocoder/ip
    'ip,'192.168.0.68
    : cdrwa
    [zk: localhost:2181(CONNECTED) 26] 

    三、可视化工具ZooInspector

    下载地址: https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip

    用法: 下载后解压,然后进入目录ZooInspectoruild, 执行java -jar zookeeper-dev-ZooInspector.jar,然后会弹出操作窗口

    时刻与技术进步,每天一点滴,日久一大步!!! 本博客只为记录,用于学习,如有冒犯,请私信于我。
  • 相关阅读:
    2019 web安全基础知识学习
    nc语法和nc木马远程控制主机
    公钥、私钥、hash、数字签名、CA以及验证过程
    A5/1流加密理解和算法实现
    TCP/IP和OSI/RM以及协议端口
    【转】TCP/IP网络协议各层首部
    校园网 虚拟机VMware Linux桥接模式 无法上网 问题
    本地远程查看服务器tomcat 上虚拟机信息
    跨域访问的解决
    混合调用tk.mybatis.mapper 与 自编xml文件 的配置
  • 原文地址:https://www.cnblogs.com/myitnews/p/13739514.html
Copyright © 2011-2022 走看看