zookeeper服务介绍

发布于:2024-06-29 ⋅ 阅读:(12) ⋅ 点赞:(0)

基础概念

ZooKeeper是一个分布式协调服务,主要用于管理和协调大型分布式系统。它提供了一些基本功能,例如配置维护、名字服务、分布式同步和组服务,这些功能对于分布式应用程序的正常运行至关重要。

主要功能

  1. 配置维护
    ZooKeeper可以存储配置信息,确保分布式系统中的所有节点可以访问相同的配置数据。比如在Hadoop集群中,ZooKeeper用来存储配置信息,使得每个节点都能实时获取最新的配置。

  2. 名字服务
    ZooKeeper提供一个命名服务,允许分布式系统中的各个组件通过名称查找资源或服务。例如,分布式数据库系统可以使用ZooKeeper来存储数据库节点的地址和状态信息。

  3. 分布式同步
    ZooKeeper可以用来实现分布式锁和其他同步机制,确保多个节点之间的操作按预期顺序执行。例如,多个节点试图同时写入同一个文件时,ZooKeeper可以确保只有一个节点可以进行写操作,其他节点则等待锁释放。

  4. 组服务
    ZooKeeper可以监控分布式系统中的节点状态,管理集群中的节点加入和退出事件。例如,在分布式计算系统中,ZooKeeper可以监控各个计算节点的状态,并在节点故障时通知其他节点进行故障恢复。

工作原理

  • 数据模型
    ZooKeeper的数据模型类似于文件系统,采用层次化的命名空间。每个节点称为ZNode,ZNode可以存储数据和子节点。ZNode有两种类型:持久节点(persistent)和临时节点(ephemeral)。

  • 事务日志
    ZooKeeper在处理每个事务(例如数据写操作)时,会记录事务日志,以确保数据的一致性和持久性。这些日志记录在本地磁盘上,确保在ZooKeeper服务器崩溃时能够进行数据恢复。

  • 选举机制
    ZooKeeper集群由多个服务器(称为ensemble)组成,通过选举机制选出一个Leader,其余为Follower。所有写操作必须通过Leader进行,而读操作可以由任意Follower处理。

  • 会话和监听器
    客户端与ZooKeeper集群之间的连接称为会话。ZooKeeper通过心跳机制保持会话的活跃状态。如果在一定时间内没有接收到客户端的心跳,ZooKeeper会认为会话已经过期,并清理相应的临时节点。

  • 客户端可以在节点上设置监听器,当节点状态发生变化时,ZooKeeper会通知相应的客户端。

  • 一致性保证
    ZooKeeper保证了一致性和高可用性,即使在网络分区和节点故障的情况下也能保持数据的一致性。它采用了ZAB协议(ZooKeeper Atomic Broadcast)来确保所有事务按顺序应用于所有服务器。

优点

  1. 高可用性
    ZooKeeper通过集群(ensemble)方式部署,确保了服务的高可用性。即使部分节点故障,集群仍能正常工作。

  2. 强一致性
    ZooKeeper采用ZAB协议(ZooKeeper Atomic Broadcast)保证了数据的一致性,确保每个节点都能看到相同的数据。

  3. 简洁的API
    ZooKeeper提供了一组简单易用的API,使得开发人员能够方便地实现分布式系统中的协调和管理功能。

  4. 自动故障恢复
    ZooKeeper能够自动检测节点故障,并通过选举机制选出新的Leader,继续提供服务。

  5. 灵活的事件通知机制
    ZooKeeper的事件通知机制允许客户端注册监听器,当特定的事件发生时,ZooKeeper会通知客户端,方便实现实时监控和动态调整。

缺点

  1. 单点瓶颈
    ZooKeeper的所有写操作必须通过Leader进行,这可能成为性能瓶颈。在高并发写操作场景下,Leader节点的负载可能会非常高。

  2. 数据一致性与性能的权衡
    ZooKeeper在保证数据一致性的同时,会牺牲一定的性能。在高并发读写场景下,ZooKeeper的性能可能不如一些分布式缓存或数据库。

  3. 延迟
    在网络延迟较高或集群节点较多的情况下,ZooKeeper的同步操作可能会有较高的延迟,影响系统的实时性。

  4. 复杂性
    虽然ZooKeeper的API相对简单,但在实现复杂的分布式协调功能时,仍需要深入理解其工作原理和配置,增加了系统设计和维护的复杂性。

  5. 依赖网络
    ZooKeeper依赖网络进行节点之间的通信和数据同步。如果网络状况不稳定,可能会影响ZooKeeper的性能和可靠性。

适用场景
尽管存在一些缺点,ZooKeeper在以下场景中表现出色:

  • 分布式配置管理
    如Hadoop、Kafka等分布式系统使用ZooKeeper来管理和同步配置信息,确保各节点获取一致的配置信息。

  • 分布式锁
    在需要多个客户端对共享资源进行互斥访问的场景中,ZooKeeper可以实现高效可靠的分布式锁。

  • 服务发现
    在微服务架构中,ZooKeeper可以作为服务注册与发现的基础设施,记录各服务的地址和状态信息。

  • 集群管理
    ZooKeeper可以监控分布式系统中各节点的状态变化,自动处理节点的加入和退出,并通过事件通知机制通知其他节点。

安装使用

Ubuntu2404环境: 官网下载zookeeper包

root@huhy:~# tar -xf apache-zookeeper-3.6.4-bin.tar.gz
root@huhy:~# ls
apache-zookeeper-3.6.4-bin  apache-zookeeper-3.6.4-bin.tar.gz

修改zoo_sample.cfg文件为zoo.cfg

cp apache-zookeeper-3.6.4-bin/conf/zoo_sample.cfg{,.bak}
mv apache-zookeeper-3.6.4-bin/conf/zoo_sample.cfg apache-zookeeper-3.6.4-bin/conf/zoo.cfg
vim apache-zookeeper-3.6.4-bin/conf/zoo.cfg

官网配置文档

tickTime=2000:定义ZooKeeper中的基本时间单位(以毫秒为单位)。这个时间单位被用于ZooKeeper服务器的调度和心跳机制。每个“tick”是2000毫秒(2秒)。

initLimit=10:定义在Leader选举过程中,允许Follower完成初始化同步的tick数量。默认最多10个tick时间(即20秒)来完成初始化同步。

syncLimit=5:定义Leader和Follower之间发送消息和接收确认之间允许的tick数量。如果Follower在指定时间内没有响应,Leader将认为Follower已失效。默认允许最多5个tick时间(即10秒)来完成同步。

dataDir=/tmp/zookeeper:定义存储ZooKeeper快照文件的目录。这个目录存放持久数据,确保在ZooKeeper重启时数据不会丢失。示例中使用了 /tmp/zookeeper,但在生产环境中应该使用更稳定的存储位置。

clientPort=2181:定义客户端连接ZooKeeper服务器的端口号。默认是2181端口。

#maxClientCnxns=60:定义单个客户端IP地址允许的最大连接数。默认被注释掉了,表示使用默认值60。

#autopurge.snapRetainCount=3:定义ZooKeeper在自动清理过程中保留的快照文件数量。此项被注释掉了,表示未启用。

#autopurge.purgeInterval=1:定义自动清理任务的时间间隔(以小时为单位)。设置为0表示禁用自动清理功能。此项被注释掉了,表示未启用。

#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider:定义使用的指标提供者类名。,默认PrometheusMetricsProvider被注释掉了,表示未启用Prometheus指标导出。

#metricsProvider.httpPort=7000:定义指标导出服务的HTTP端口。默认7000端口被注释掉了,表示未启用。

#metricsProvider.exportJvmInfo=true:定义是否导出JVM信息。设置为true表示导出JVM信息。此项被注释掉了,表示未启用。

server.id=host:port1:port2:其中id为一个数字,表示zk进程的id,这个id也是dataDir目录下myid文件的内容。host是该zk进程所在的IP地址,port1表示follower和leader交换消息所使用的端口,port2表示选举leader所使用的端口。(一般用于集群)

默认不修改该文件,直接启动

安装java环境

tar -zxvf jdk-8u144-linux-x64.tar.gz -C /usr/local/
vi /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_144
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin
source /etc/profile
root@huhy:~# java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
cd apache-zookeeper-3.6.4-bin/bin/

可查看到为独立模式(单节点)

root@huhy:~/apache-zookeeper-3.6.4-bin/bin# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /root/apache-zookeeper-3.6.4-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
root@huhy:~/apache-zookeeper-3.6.4-bin/bin# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /root/apache-zookeeper-3.6.4-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: standalone

连接到 ZooKeeper(bin目录下执行)

./zkCli.sh -server 127.0.0.1:2181
root@huhy:~/apache-zookeeper-3.6.4-bin/bin# ./zkCli.sh -server 127.0.0.1:2181
Connecting to 127.0.0.1:2181
2024-06-28 05:54:41,748 [myid:] - INFO  [main:Environment@98] - Client environment:zookeeper.version=3.6.4--d65253dcf68e9097c6e95a126463fd5fdeb4521c, built on 12/18/2022 18:10 GMT
............
WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: 127.0.0.1:2181(CONNECTED) 0]

在 shell 中,键入help以获取可以从客户端执行的命令列表,如下所示:

[zk: 127.0.0.1:2181(CONNECTED) 0] help
ZooKeeper -server host:port -client-configuration properties-file cmd args
        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] 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 val path
        stat [-w] path
        sync path
        version
Command not found: Command not found help
[zk: 127.0.0.1:2181(CONNECTED) 1]

详细命令可在官网查看