news 2026/4/15 11:38:37

Zookeeper及Kafka

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Zookeeper及Kafka

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、Zookeeper

1.Zookeeper简介

2.Zookeeper 工作机制

3.Zookeeper 数据结构

4.Zookeeper 应用场景

5.Zookeeper 选举机制

6.部署 Zookeeper 集群

二、Kafka

1.kafka简介

2.kafka工作机制

3.kafka特性

4.Kafka 系统架构

5.部署 kafka 集群

三、Filebeat+Kafka+ELK 部署

总结


前言

分布式系统的协调与管理是现代大数据和实时数据处理架构中的核心挑战之一。ZooKeeper作为高可用的分布式协调服务,为分布式应用提供一致性、可靠性和原子性操作,是构建复杂分布式系统的基石。Kafka作为高性能的分布式消息队列,依托其高吞吐、低延迟的特性,成为实时数据管道和流处理平台的关键组件。二者的结合为分布式环境下的数据一致性、消息传递和集群管理提供了完整的解决方案。

本内容将深入探讨ZooKeeper与Kafka的协同工作机制,分析其设计原理、核心功能及最佳实践,帮助开发者理解如何利用ZooKeeper保障Kafka集群的元数据一致性、Broker选举及分区状态管理,同时优化配置以应对高并发场景下的性能需求。

一、Zookeeper

1.Zookeeper简介

Zookeeper 是一个开源的分布式协调服务,由 Apache 维护。它用于管理分布式系统中的配置信息、命名服务、分布式同步和组服务。Zookeeper 通过简单的接口和高效的性能,帮助开发者解决分布式环境下的复杂协调问题。

2.Zookeeper工作机制

+-------------------+ +-------------------+ +-------------------+ | Client A | | Client B | | Client C | | (Watch /node1) | | (Watch /node2) | | (Write /node1) | +---------+---------+ +---------+---------+ +---------+---------+ | | | | | | +---------v---------------------------v---------------------------v---------+ | | | Zookeeper Cluster | | | | +-------------+ +-------------+ +-------------+ | | | Server 1 | | Server 2 | | Server 3 | | | | (Leader) | | (Follower) | | (Follower) | | | +------+------+ +------+------+ +------+------+ | | | | | | | +----------+----------+----------+----------+ | | | | | | v v | | +------------+ +------------+ | | | ZAB | | ZAB | | | | (ZooKeeper | | (ZooKeeper | | | | Atomic | | Atomic | | | | Broadcast) | | Broadcast) | | | +------------+ +------------+ | | | +---------------------------------------------------------------------------+

关键组件说明

客户端交互

  • 客户端通过会话(Session)连接到 Zookeeper 集群,可注册 Watcher 监听节点变化或发起写请求。

集群角色

  • Leader:负责处理所有写请求,并通过 ZAB 协议同步数据到 Follower。
  • Follower:处理读请求,并参与 Leader 选举和事务投票。

ZAB 协议

  • 原子广播协议确保事务顺序一致性:
    1. 写请求由 Leader 转换为 Proposal 广播给 Follower。
    2. 收到半数以上 ACK 后提交事务(Commit)。
    3. 所有服务器按相同顺序应用事务。

数据模型

  • 类似文件系统的树形结构(ZNode),支持临时节点和序列节点。
  • 每个 ZNode 存储数据(≤1MB)和元数据(版本号、ACL 等)。

Watch 机制

  • 客户端在 ZNode 上设置 Watch,当节点数据或子节点变化时触发通知(单次触发需重新注册)。

典型流程示例

  1. 客户端 C 发起写请求/node1,Leader 生成事务 ID(ZXID)并广播 Proposal。
  2. Follower 持久化 Proposal 后返回 ACK,Leader 收到多数确认后发送 Commit。
  3. 客户端 A 监听的/node1触发 Watch 通知,获取最新数据。

3.Zookeeper数据结构

ZNode:是Zookeeper中存储数据的基本单元,每个ZNode都可以存储少量的数据,并且可以
有子节点,形成树状结构。
持久节点:该类型的ZNode会一直存在,直到手动删除。
临时节点:客户端会话断开时,临时节点会自动删除,适用于实现分布式锁等功能。
顺序节点:在创建ZNode时,Zookeeper可以自动为其添加递增的编号,常用于实现分布式队列
或顺序任务处理。

4.Zookeeper应用场景

分布式锁

Zookeeper 通过临时节点和顺序节点实现分布式锁,确保多个进程或服务在访问共享资源时的互斥性。临时节点在客户端会话结束时自动删除,避免锁的永久占用。

配置管理

Zookeeper 提供集中式配置管理,允许动态更新配置信息。客户端可以监听配置节点的变化,实时获取最新配置,无需重启服务。

服务发现与注册

在微服务架构中,Zookeeper 用于服务注册与发现。服务启动时在 Zookeeper 上注册临时节点,客户端通过监听节点变化动态获取可用服务列表。

集群管理

Zookeeper 用于监控集群节点的状态,通过临时节点检测节点的存活情况。节点故障时,临时节点自动删除,触发集群重新选举或故障转移。

分布式队列

Zookeeper 的顺序节点特性可用于实现分布式队列。生产者创建顺序节点,消费者按节点顺序处理任务,保证任务的顺序执行。

命名服务

Zookeeper 提供统一的命名服务,客户端通过路径访问资源或服务,避免硬编码地址,增强系统的灵活性和可维护性。

领导者选举

在分布式系统中,Zookeeper 用于实现领导者选举。通过创建临时顺序节点,编号最小的节点成为领导者,其他节点作为备份,领导者失效时自动重新选举。

分布式屏障

Zookeeper 可用于实现分布式屏障(Barrier),协调多个进程的同步操作。所有进程到达屏障点后,屏障释放,允许后续操作继续执行。

5.Zookeeper选举机制

Zookeeper 的选举机制是其分布式协调服务的核心功能之一,确保集群中多个节点能够高效、一致地选举出 Leader 节点。选举过程基于 ZAB(Zookeeper Atomic Broadcast)协议,结合了 Fast Leader Election(快速领导者选举) 算法。

选举触发条件
集群启动时,所有节点初始状态为 LOOKING,开始选举。
现有 Leader 节点崩溃或失去多数节点的连接时,重新触发选举。
集群中超过半数节点认为 Leader 失效时,发起新一轮选举。
选举规则
投票内容:每个节点投票时包含自己的 myid(唯一标识)和 ZXID(事务 ID,越大表示数据越新)。
优先级比较:

优先比较 ZXID,较大的节点胜出。
若 ZXID 相同,则比较 myid,较大的 myid 胜出。
多数派原则:获得超过半数节点投票的候选者成为 Leader。
选举流程
节点启动后向其他节点发送投票信息(包含 myid 和 ZXID)。
收到其他节点的投票后,根据选举规则更新自己的投票。
若某个节点的投票被多数派认可,该节点转换为 LEADING 状态,其他节点转换为 FOLLOWING 或 OBSERVING 状态。
异常处理
网络分区:若集群分裂为多个少数派分区,选举无法完成,直到分区恢复多数派。
重复选举:通过 epoch(选举轮次)避免历史投票干扰新选举。

6.部署Zookeeper集群

部署环境ZK

环境准备
确保所有节点(zk01、zk02、zk03)已安装 JDK 1.8,并配置JAVA_HOME环境变量。下载 Zookeeper 3.5.7 和 Kafka 2.13-2.7.1 的安装包至各节点。

安装 Zookeeper
解压 Zookeeper 安装包到指定目录,例如/opt/zookeeper-3.5.7。创建数据目录和日志目录:

mkdir -p /data/zookeeper/data mkdir -p /data/zookeeper/logs

配置 Zookeeper
进入 Zookeeper 的配置目录conf,复制模板文件并修改:

cp zoo_sample.cfg zoo.cfg

编辑zoo.cfg,配置以下关键参数:

tickTime=2000 initLimit=10 syncLimit=5 dataDir=/data/zookeeper/data dataLogDir=/data/zookeeper/logs clientPort=2181 server.1=192.168.10.18:2888:3888 server.2=192.168.10.21:2888:3888 server.3=192.168.10.22:2888:3888

设置节点 ID
在每个节点的dataDir目录下创建myid文件,写入对应的服务器 ID:

  • zk01:echo "1" > /data/zookeeper/data/myid
  • zk02:echo "2" > /data/zookeeper/data/myid
  • zk03:echo "3" > /data/zookeeper/data/myid

启动 Zookeeper 服务
在各节点执行启动命令:

bin/zkServer.sh start

验证集群状态:

bin/zkServer.sh status

正常输出应显示followerleader状态。

防火墙配置
确保各节点的防火墙允许以下端口通信:

  • 2181(客户端连接)
  • 2888(节点间数据同步)
  • 3888(选举通信)

验证集群健康
使用 Zookeeper 客户端连接任意节点,测试集群功能:

bin/zkCli.sh -server 192.168.10.18:2181

执行ls /查看根节点,确认连接正常。

二、Kafka

1.kafka简介

Apache Kafka 是一个分布式流处理平台,主要用于构建实时数据管道和流应用程序。它具有高吞吐量、低延迟、可扩展性和持久性等特性,广泛应用于日志聚合、事件溯源、消息队列等场景。

2.kafka工作机制

[生产者] → [Kafka集群(Broker)] → [消费者] ↑ ↑ ↑ | | | [Topic A] [Partition] [Consumer Group]

关键组件说明

生产者(Producer)

  • 将数据发布到Kafka集群
  • 可指定消息发送到特定Topic或Partition
  • 支持异步/同步发送模式

Kafka集群(Broker)

  • 由多个服务器节点组成
  • 每个节点称为Broker
  • 负责消息存储和转发

Topic(主题)

  • 消息的逻辑分类单位
  • 可划分为多个Partition实现并行处理
  • 示例代码创建Topic:
    kafka-topics --create --topic test --partitions 3 --replication-factor 2

    Partition(分区)

  • 每个Partition是有序消息队列
  • 消息通过offset定位
  • 分区公式: partition = hash(key) % partition_count

消费者(Consumer)

数据流示例

  • 从Topic读取数据
  • 通过Consumer Group实现负载均衡
  • 维护消费位移(offset)
Producer → Topic:orders (Partition0: [msg1, msg2]) (Partition1: [msg3, msg4]) ↓ ConsumerGroup1 - Consumer1 ← Partition0 - Consumer2 ← Partition1

存储机制

  • 消息按分区存储为segment文件
  • 保留策略基于时间或大小
  • 索引文件加速消息查找

3.kafka特性

高吞吐量

Kafka设计用于处理大规模数据流,支持每秒百万级消息处理。其高效的数据结构和分区机制减少了磁盘I/O开销,通过批量压缩和顺序写入提升性能。

持久化与低延迟

消息持久化存储在磁盘,并通过零拷贝技术优化传输。消费者可实时或批量读取数据,延迟可控制在毫秒级。

水平扩展

通过增加Broker节点轻松扩展集群容量。分区机制允许数据分散存储,支持并行处理,扩展时无需停机。

高可用性

多副本机制(Replication)确保数据冗余。Leader-Follower架构自动处理节点故障,故障转移期间服务不间断。

消息顺序性

单个分区内消息严格有序,适用于需要顺序处理的场景(如日志审计)。全局顺序性可通过单分区实现。

多客户端支持

提供Java、Python、Go等多种语言客户端API,兼容主流开发环境。支持REST代理和第三方插件扩展。

流处理集成

与Kafka Streams、Flink等流处理框架深度集成,支持实时计算、窗口操作和状态管理,简化流式应用开发。

数据保留策略

支持基于时间(如7天)或大小(如1TB)的日志保留策略。消费者可回溯历史数据,适用于重放和恢复场景。

安全机制

提供SSL/TLS加密、SASL身份验证和ACL访问控制列表,支持与Kerberos、LDAP等企业安全系统集成。

生态系统完善

与Confluent平台、Zookeeper(或KRaft模式)、Connector工具链协同,形成完整的数据管道解决方案。

4.Kafka系统架构

Kafka 是一个分布式流处理平台,其架构设计围绕高吞吐量、可扩展性和容错性展开。核心组件包括生产者、消费者、Broker、ZooKeeper 和主题(Topic)。

核心组件

生产者(Producer)生产者负责将数据发布到 Kafka 的主题中。数据以消息的形式发送,生产者可以指定分区或由 Kafka 根据分区策略自动分配。

消费者(Consumer)消费者从主题中读取消息。消费者可以以单播或多播的方式消费数据,并支持消费者组(Consumer Group)实现负载均衡。

BrokerBroker 是 Kafka 的服务器节点,负责存储和管理消息。每个 Broker 可以处理多个主题的分区,并通过副本机制实现数据冗余。

ZooKeeperZooKeeper 用于管理 Kafka 集群的元数据,如 Broker 注册、主题配置和分区状态。Kafka 2.8.0 后逐步引入自管理的元数据机制(KRaft),减少对 ZooKeeper 的依赖。

主题(Topic)主题是消息的逻辑分类,分为多个分区(Partition)。每个分区是一个有序、不可变的消息队列,支持并行读写。

分区与副本

分区是 Kafka 实现水平扩展的基础。每个分区可以分布在不同的 Broker 上,副本(Replica)分为 Leader 和 Follower:

  • Leader 处理所有读写请求。
  • Follower 异步复制 Leader 的数据,并在 Leader 故障时参与选举。
Partation数据路由规则:
1.指定了patition,则直接使用;
2.未指定patition但指定key(相当于消息中某个属性),通过对keyvalue进行hash取模,选出
一个patition
3patitionkey都未指定,使用轮询选出一个patition
每条消息都会有一个自增的编号,用于标识消息的偏移量,标识顺序从0开始。
每个partition中的数据使用多个segment文件存储。
如果topic有多个partition,消费数据时就不能保证数据的顺序。严格保证消息的消费顺序的场景下
(例如商品秒杀、 抢红包),需要将partition数目设为1broker存储topic的数据。如果某topicNpartition,集群有Nbroker,那么每个
broker存储该topic的一个partition
如果某topicNpartition,集群有(N+M)broker,那么其中有Nbroker存储topic
一个partition, 剩下的Mbroker不存储该topicpartition数据。
如果某topicNpartition,集群中broker数目少于N个,那么一个broker存储该topic
一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka
集群数据不均衡。
② 分区的原因
方便在集群中扩展,每个Partition可以通过调整以适应它所在的机器,而一个topic又可以有多个
Partition组成,因此整个集群就可以适应任意大小的数据了;
可以提高并发,因为可以以Partition为单位读写了。
1Replica
副本,为保证集群中的某个节点发生故障时,该节点上的partition数据不丢失,且kafka仍然能
够继续工作,kafka提供了副本机制,一个topic的每个分区都有若干个副本,一个leader和若干
follower
2Leader
每个partition有多个副本,其中有且仅有一个作为LeaderLeader是当前负责数据的读写的
partition
3Follower
Follower跟随Leader,所有写请求都通过Leader路由,数据变更会广播给所有Follower
FollowerLeader保持数据同步。Follower只负责备份,不负责数据的读写。
如果Leader故障,则从Follower中选举出一个新的Leader
Follower挂掉、卡住或者同步太慢,Leader会把这个FollowerISRLeader维护的一个和
Leader保持同步的Follower集合) 列表中删除,重新创建一个Follower

数据存储

Kafka 使用日志文件(Segment)存储消息,每个分区对应一个目录,包含多个日志段文件。消息按偏移量(Offset)索引,支持高效顺序读写。

生产者与消费者交互

生产者通过分区器(Partitioner)决定消息写入的分区,支持轮询、哈希或自定义策略。消费者通过订阅主题或分区消费数据,并提交偏移量以记录消费进度。

高可用性设计

  • 副本机制:通过 ISR(In-Sync Replicas)列表维护同步副本,确保数据一致性。
  • 故障恢复:Leader 故障时,Controller(通过 ZooKeeper 选举)重新选举 Leader。
  • 数据保留:支持基于时间或大小的日志清理策略。

性能优化

  • 批处理:生产者支持批量发送消息,减少网络开销。
  • 零拷贝:通过sendfile系统调用直接传输磁盘数据到网络。
  • 压缩:支持消息压缩(如 GZIP、Snappy)降低存储和带宽占用。

5.部署kafka集群

环境准备

确保服务器满足 Kafka 的运行要求,包括 Java 环境(推荐 JDK 8 或更高版本)、足够的磁盘空间和内存。建议使用 Linux 系统,如 CentOS 或 Ubuntu。

下载 Kafka 安装包,可以从 Apache Kafka 官网获取最新版本:

wget https://downloads.apache.org/kafka/<version>/kafka_<scala-version>-<kafka-version>.tgz tar -xzf kafka_<scala-version>-<kafka-version>.tgz cd kafka_<scala-version>-<kafka-version>

配置 Kafka

修改config/server.properties文件,配置以下关键参数:

broker.id=<unique-id> # 每个节点必须唯一 listeners=PLAINTEXT://<hostname>:9092 log.dirs=/path/to/kafka-logs zookeeper.connect=<zookeeper-host1>:2181,<zookeeper-host2>:2181

如果启用集群模式,确保broker.id在不同节点上不重复,并配置相同的zookeeper.connect地址。

配置 Zookeeper

Kafka 依赖 Zookeeper 进行集群协调。修改config/zookeeper.properties

dataDir=/path/to/zookeeper-data clientPort=2181 server.1=<zookeeper-host1>:2888:3888 server.2=<zookeeper-host2>:2888:3888

在每个 Zookeeper 节点的dataDir目录下创建myid文件,内容为对应的server.x编号(如12)。

启动服务

先启动 Zookeeper 集群:

bin/zookeeper-server-start.sh config/zookeeper.properties

再启动 Kafka 节点:

bin/kafka-server-start.sh config/server.properties

验证集群

创建 Topic 并验证集群状态:

bin/kafka-topics.sh --create --topic test --partitions 3 --replication-factor 2 --bootstrap-server <kafka-host>:9092 bin/kafka-topics.sh --describe --topic test --bootstrap-server <kafka-host>:9092

可选优化

  • 调整num.partitionsdefault.replication.factor以适应业务需求。
  • 配置log.retention.hours控制日志保留时间。
  • 启用 SSL 或 SASL 认证增强安全性。

监控与维护

使用 Kafka 自带的工具或第三方监控(如 Prometheus + Grafana)监控集群状态。定期清理日志和优化配置。

三、Filebeat+Kafka+ELK部署

环境准备

确保已安装以下组件:

  • Filebeat 8.x
  • Kafka 2.8+
  • Elasticsearch 8.x
  • Logstash 8.x
  • Kibana 8.x

所有组件需保持版本兼容性,建议使用官方推荐组合。

Kafka 配置

  1. Zookeeper 与 Kafka 启动
    修改 Kafka 配置文件server.properties,指定 Zookeeper 地址和监听端口:

    zookeeper.connect=localhost:2181 listeners=PLAINTEXT://:9092
  2. 创建 Topic
    创建用于接收 Filebeat 数据的 Topic:
    bin/kafka-topics.sh --create --topic filebeat-logs --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1

Filebeat 配置

  1. 输出到 Kafka
    修改filebeat.yml,将输出目标设置为 Kafka:

    output.kafka: hosts: ["kafka-server:9092"] topic: "filebeat-logs" required_acks: 1
  2. 日志输入配置
    指定需要采集的日志路径:
    filebeat.inputs: - type: log paths: - /var/log/*.log

Logstash 配置

  1. Kafka 输入插件
    配置logstash.conf从 Kafka 消费数据:

    input { kafka { bootstrap_servers => "kafka-server:9092" topics => ["filebeat-logs"] } }
  2. 过滤与输出
    添加必要的过滤规则并输出到 Elasticsearch:
    filter { grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:content}" } } } output { elasticsearch { hosts => ["http://es-node:9200"] index => "filebeat-logs-%{+YYYY.MM.dd}" } }

Elasticsearch 与 Kibana

  1. 索引模式创建
    在 Kibana 的Management > Stack Management > Index Patterns中创建filebeat-logs-*索引模式。

  2. 数据可视化
    通过DiscoverDashboard功能查看和分析日志数据。

验证与调试

  • 使用kafka-console-consumer.sh确认 Kafka 是否收到数据。
  • 检查 Elasticsearch 索引是否存在:
    curl -XGET 'http://localhost:9200/_cat/indices?v'
  • 在 Kibana 中验证日志字段是否被正确解析。
  • 性能优化建议

  • Kafka 分区数量根据数据吞吐量调整。
  • Logstash 增加workers参数提升处理并发能力。
    • Elasticsearch 分片数根据集群规模配置。


总结

ZooKeeper与Kafka的集成展现了分布式系统中协调服务与消息队列的完美互补。ZooKeeper通过维护Kafka集群的Broker状态、Topic配置及消费者偏移量,确保了系统的可靠性与故障恢复能力;而Kafka则通过分区复制和ISR机制,在ZooKeeper的底层支持下实现了高吞吐的消息传递。

在实际部署中,需关注ZooKeeper的集群配置(如tickTimeinitLimit参数调优)及Kafka对ZooKeeper的依赖管理(如逐步迁移至Kafka自身的KRaft模式以减少外部依赖)。通过合理的监控(如ZooKeeper的四字命令和Kafka的JMX指标)和容灾设计,二者能够支撑起从日志聚合到事件流处理的多样化场景,成为分布式架构中不可或缺的技术组合。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 13:34:13

Altium Designer操作技巧(20)——鼠标滚轮配置详解

大家好,欢迎来到“电子工程师之家”,大家也可以关注微信公众号同号“电子工程师之家”。微信公众号中有更多精彩内容。 家人们,大家好! 今天我们继续分享有关System系统配置中有关鼠标滚轮配置(System - Mouse Wheel Configuration)。 合理配置鼠标滚轮操作,可以提升电…

作者头像 李华
网站建设 2026/4/7 18:01:52

一阶鬼魔魔方

目录 一阶鬼魔魔方 1&#xff0c;魔方三要素 &#xff08;1&#xff09;组成部件 &#xff08;2&#xff09;可执行操作 A套餐&#xff08;用于魔方分类、魔方打乱&#xff09; &#xff08;3&#xff09;可执行操作 B套餐&#xff08;用于魔方复原&#xff09; &#xf…

作者头像 李华
网站建设 2026/4/12 20:02:36

基于Spring Boot的人力资源管理信息系统

基于Spring Boot的人力资源管理信息系统介绍 一、系统定位与用户需求分析 核心目标&#xff1a;随着信息化时代的到来&#xff0c;企业对于人力资源管理的需求日益增加&#xff0c;传统的人力资源管理方式存在工作效率低、工作繁杂等问题&#xff0c;已无法满足现代企业的需求。…

作者头像 李华
网站建设 2026/4/14 18:20:07

ECharts 事件处理

ECharts 事件处理 引言 ECharts 是一个使用 JavaScript 实现的开源可视化库,广泛用于数据可视化。在 ECharts 中,事件处理是一个重要的功能,它允许开发者根据用户的交互动态更新图表。本文将详细介绍 ECharts 事件处理的各个方面,包括事件类型、监听方法以及实际应用案例…

作者头像 李华
网站建设 2026/4/10 23:44:26

springboot基于JAVA框架的学生寝室管理系统

基于SpringBoot的Java学生寝室管理系统介绍 一、系统背景与目标 学生寝室管理是高校后勤管理的重要环节&#xff0c;传统人工管理存在效率低、信息滞后、数据易出错等问题。本系统基于SpringBoot框架与Java语言开发&#xff0c;旨在实现寝室管理的数字化、智能化、规范化&#…

作者头像 李华
网站建设 2026/4/10 6:34:53

HTML 视频(Video)播放

HTML 视频(Video)播放 概述 HTML5 引入的 <video> 元素为网页提供了一种在浏览器中嵌入和播放视频内容的方式。它极大地简化了在网页上嵌入视频的过程,并允许开发者通过多种方式进行控制。 视频元素介绍 在 HTML5 中,<video> 元素用于在网页上嵌入视频。它…

作者头像 李华