zookeeper 安装部署与简单使用

官网:

https://www.apache.org/dyn/closer.cgi/zookeeper/

ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效、高可用的分布式协调服务,提供了诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知和分布式锁等分布式基础服务。由于 ZooKeeper 便捷的使用方式、卓越的性能和良好的稳定性,被广泛地应用于诸如 Hadoop、HBase、Kafka 和 Dubbo 等大型分布式系统中。

Zookeeper 有三种运行模式:单机模式、伪集群模式和集群模式。

**单机模式:**这种模式一般适用于开发测试环境,一方面我们没有那么多机器资源,另外就是平时的开发调试并不需要极好的稳定性。

**集群模式:**一个 ZooKeeper 集群通常由一组机器组成,一般 3 台以上就可以组成一个可用的 ZooKeeper 集群了。组成 ZooKeeper 集群的每台机器都会在内存中维护当前的服务器状态,并且每台机器之间都会互相保持通信。

**伪集群模式:**这是一种特殊的集群模式,即集群的所有服务器都部署在一台机器上。当你手头上有一台比较好的机器,如果作为单机模式进行部署,就会浪费资源,这种情况下,ZooKeeper 允许你在一台机器上通过启动不同的端口来启动多个 ZooKeeper 服务实例,以此来以集群的特性来对外服务。

1. 安装

  • 下载

    下载zookeeper安装包:https://mirrors.bfsu.edu.cn/apache/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz

    下载完成后,我们将其上传至服务器中,然后通过tar -zxvf命令解压。

    tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz
    

    image-20220104114941358

  • 配置

    初次使用zookeeper,需要将conf目录下的zoo_sample.cfg文件copy一份重命名为zoo.cfg

    修改dataDir目录,dataDir表示日志文件存放的路径;还可以自定义修改端口啥的,详细配置可以到官网查看。

    image-20220104115455715

image-20220104120158314

  • 启动

    相关的脚本都位于bin目录下,常用脚本如下:

    1. 启动ZK服务:

      bin/zkServer.sh start

    2. 查看ZK服务状态:

      bin/zkServer.sh status

    3. 停止ZK服务:

      bin/zkServer.sh stop

    4. 重启ZK服务:

      bin/zkServer.sh restart

    5. 连接服务器

      zkCli.sh -timeout 0 -r -server ip:port

      一般情况直接zkCli.sh即可,默认连接本地服务。

2. 常用操作命令

  • 创建节点

    create [-s] [-e] [-c] [-t ttl] path [data] [acl]
    

    [-s]:sequential 序列化的,即可以重复创建,在路径后面加上序列号

    [-e]:ephemeral 临时的,断开连接后自动失效

    [-c] :表示container node(容器节点),

    [-t ttl]:表示TTL Nodes(带超时时间的节点)

    [acl]:是针对这个节点创建一个权限的,如果创建权限了,则拥有权限的才可以访问

    在同一层级下不能重复

    image-20220104123322667

  • 删除节点

    删除节点,-v表示版本号,实现乐观锁机制

    delete [-v version] path
    

    如果需要删除全部节点则使用 deleteall 关键字即可。

  • 更新节点

    给节点赋值 -s返回节点状态

    set [-s] [-v version] path data
    
    # set /person/tom 18
    
  • 查询节点信息

    获取指定节点的值

    get [-s] [-w] path
    # get /person/tom
    

    image-20220104123438838

3. Zookeeper的数据模型

如果我们把zookeeper当成是一个内存数据库的话,那么crud就是对zookeeper内存数据库进行一个数据的增删改查操作,那zookeeper的数据结构是什么样的呢?如下图所示,zookeeper的视图结构和标准的文件系统非常类似,每一个节点称之为ZNode, 是zookeeper的最小单元。每个znode上都可以保存数据以及挂载子节点,构成一个层次化的树形结构

image-20220104123802453

4. 节点类型

Zookeeper中包含4种类型的节点,分别说明如下。

4.1 持久化节点

持久化节点可以细分为两种节点,分别是:

  • PERSISTENT:持久化,不会随客户端的断开而自动删除,默认类型,如下图所示

    image-20220104124659751

  • PERSISTENT_SEQUENTIAL:带序号的持久化,znode的名字将被附加一个单调递增的数字,如下图所示

    image-20220104124738801

4.2 临时节点

  • EPHEMERAL:临时节点,当客户端断开时自动删除,如下图所示,如果该Client创建了/Server1和/Server2这两个节点,当Client的session断开后,这两个节点会被Zookeeper自动删除。

    image-20220104124824303

  • EPHEMERAL_SEQUENTIAL:带序号的临时节点,znode的名字将被附加一个单调递增的数字,如下图所示

    image-20220104125153037

4.3 容器节点 Container

CONTAINER:container节点是一个特殊用途的节点,它是为Leader、Lock等操作而设计的节点类型,它的作用是: 当容器节点的最后一个子节点被删除后,容器节点将会被标注并且在一段时间后删除。

由于容器节点存在这个特性,所以当我们在容器节点下创建一个子节点时,需要捕获KeeperException.NoNodeException异常,如果捕获到这个异常,就需要重新创建容器节点。

4.4 TTL节点

如果某个节点设置为TTL节点类型,那么这个节点在指定TTL时间(单位为毫秒)段内没有修改并且没有子节点时,该节点会在一段时间后被删除。

  • PERSISTENT_WITH_TTL:zookeeper的扩展类型,如果znode在给定的TTL内没有被修改,它将在没有子节点时被删除。要想使用该类型,必须在zookeeper的bin/zkService.sh中的启动zookeeper的java环境中设置环境变量zookeeper.extendedTypesEnabled=true(具体做法在下边),否则KeeperErrorCode = Unimplemented for /**。

    设置zookeeper.extendedTypesEnabled=true

    打开zookeeper bin/zkServer.sh(win是zkService.cmd),修改启动zookeeper的命令,加上-Dzookeeper.extendedTypesEnabled=true,也就是设置java的一个环境变量。

    nohup "$JAVA" $ZOO_DATADIR_AUTOCREATE "-Dzookeeper.log.dir=${ZOO_LOG_DIR}"  "-Dzookeeper.log.file=${ZOO_LOG_FILE}" "- Dzookeeper.extendedTypesEnabled=true" "- Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"  -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p'  -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &
    
  • PERSISTENT_SEQUENTIAL_WITH_TTL:同上,是不过是带序号的。

5. 节点特性

  • 同级节点不能存在相同名字的节点
  • 临时节点不能存在字节点
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>