当前位置: 代码网 > 服务器>网络>网络协议 > zookeeper服务介绍

zookeeper服务介绍

2024年08月01日 网络协议 我要评论
host是该zk进程所在的IP地址,port1表示follower和leader交换消息所使用的端口,port2表示选举leader所使用的端口。例如,在分布式计算系统中,ZooKeeper可以监控各个计算节点的状态,并在节点故障时通知其他节点进行故障恢复。ZooKeeper在处理每个事务(例如数据写操作)时,会记录事务日志,以确保数据的一致性和持久性。ZooKeeper采用ZAB协议(ZooKeeper Atomic Broadcast)保证了数据的一致性,确保每个节点都能看到相同的数据。

基础概念

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]

详细命令可在官网查看

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com