02、Kafka 简介
1、 Kafka 简介
Apache Kafka 是一个分布式的发布-订阅消息系统,最初由 LinkedIn 公司开发,并在 2010 年贡献给了 Apache 软件基金会,成为一个*开源项目。Kafka 设计之初是为了满足高吞吐量、可扩展性、持久性、容错性以及高并发的需求,它非常适合用于实时数据流的处理,包括日志聚合、事件源、流式处理等场景。
Kafka 的架构包括以下几个关键组件:
- 生产者(Producer):负责发布消息到 Kafka 的主题(Topic)。
- 消费者(Consumer):订阅一个或多个主题,并从 Kafka 集群中拉取(Pull)数据进行消费。
- Broker:Kafka 集群中的服务器,负责存储生产者写入的消息。
- 主题(Topic):Kafka 中的消息分类,每个主题可以分成多个分区(Partition)以支持数据的水平扩展和并行处理。
- 分区(Partition):是主题的一个子集,可以分布在不同的 Broker 上以实现负载均衡。
- 副本(Replica):为了保证数据的可靠性,每个分区都有多个副本,其中一个是领导者(Leader),其他的是追随者(Followers)。
- ZooKeeper:Kafka 集群依赖 ZooKeeper 来管理集群中的节点状态、分区状态以及副本状态。
Kafka 的主要特点包括:
- 高吞吐量和低延迟:Kafka 能够以极低的延迟处理高吞吐量的数据。
- 持久性和可靠性:消息被持久化到磁盘,并且支持数据备份以防止数据丢失。
- 可扩展性:Kafka 集群支持热扩展,可以轻松添加更多的 Broker 来扩展系统。
- 容错性:允许集群中的节点失败而不会丢失数据。
- 高并发:支持数千个客户端同时读写。
Kafka 常用于以下场景:
- 日志收集:集中收集各种服务的日志,提供统一的日志分析接口。
- 消息系统:解耦生产者和消费者,提供异步处理能力。
- 用户活动跟踪:记录用户的各种活动,如浏览、搜索、点击等,供实时监控分析或离线分析挖掘。
- 流式处理:与如 Spark Streaming 和 Storm 等流处理系统结合使用。
- 事件源:作为事件源,记录系统中发生的所有事件。
Kafka 的设计思想和架构使其成为了大数据处理领域中一个非常流行的工具。
2、 Kafka 的设计目标
Kafka 的设计目标主要围绕以下几个核心点:
- 高吞吐率:Kafka 旨在实现高吞吐量的消息处理,即使在非常廉价的商用机器上也能做到单机支持每秒 100K 条以上消息的传输。
- 消息持久化:Kafka 提供了以时间复杂度为 O(1) 的方式进行消息持久化的能力,保证了对 TB 级以上数据也能保证常数时间复杂度的访问性能。
- 完全分布式:Kafka 支持消息分区以及分布式消费,并保证分区内的消息顺序,同时支持 Producer、Broker、Consumer 的水平扩展。
- 同时支持在线和离线数据处理:Kafka 能够同时满足实时数据处理和离线批处理的需求。
- 在线水平扩展(Scale out):Kafka 支持在线水平扩展,可以轻松地通过增加更多的服务器来扩展系统。
- 容错性:Kafka 通过副本和分区机制提供了容错性,能够在出现机器故障时保证系统的可靠性和数据的不丢失。
- 高并发:Kafka 支持数千个客户端同时读写,适合大规模分布式系统。
- 解耦和扩展性:Kafka 允许系统的不同组件以消息为中心进行通信,从而实现解耦,同时提供了系统的可扩展性。
- 端到端的精确处理:Kafka 通过与外部存储系统的协作,提供了端到端的精确一次处理语义(Exactly once),尽管这通常需要额外的机制来实现。
- 灵活性和峰值处理能力:Kafka 能够使关键组件顶住突发的访问压力,同时保持系统的灵活性。
Kafka 的设计哲学和目标使其成为了一个在大数据处理领域非常流行的工具,尤其适用于需要高吞吐量、数据持久化和分布式系统的场景。
3、 Kafka 的核心概念
Kafka 的核心概念包括以下几个方面:
-
生产者(Producer):
- 负责创建和发送消息到 Kafka 集群中的特定主题。
-
消费者(Consumer):
- 从 Kafka 集群中的主题拉取(pull)消息进行处理。
-
Broker:
- Kafka 集群中的一个节点,负责维护和管理消息数据。
-
主题(Topic):
- 消息的分类单位,生产者将消息发送到主题,消费者从主题读取消息。
-
分区(Partition):
- 主题可以被划分为一个或多个分区,以支持大规模数据的并行处理和负载均衡。
-
副本(Replica):
- 为了提高消息的可靠性,每个分区都有多个副本,其中一个副本是领导者(Leader),其他副本是追随者(Followers)。
-
领导者(Leader):
- 分区中的一个副本作为领导者,负责处理所有对该分区的读写请求。
-
追随者(Follower):
- 分区中的其他副本作为追随者,复制领导者中的数据以提供冗余。
-
ZooKeeper:
- Kafka 集群使用 ZooKeeper 来管理集群的元数据以及进行领导者选举等操作。
-
消费组(Consumer Group):
- 消费者可以组成一个组,以便能够并行地消费消息。每个分区只能由消费组中的一个消费者消费。
-
消息(Message):
- Kafka 中的基本数据单元,包含有效载荷(payload)和元数据(如键和时间戳)。
-
偏移量(Offset):
- 消息在分区中的序列号,用于追踪消息的位置和确保消息顺序。
-
持久性(Durability):
- Kafka 提供了持久化消息的机制,确保消息不会因为系统故障而丢失。
-
可扩展性(Scalability):
- Kafka 支持在线水平扩展,可以通过增加更多的 Broker 来扩展系统。
-
流处理(Stream Processing):
- Kafka 支持流处理,允许对实时数据流进行处理和分析。
-
消息保留策略(Retention Policy):
- Kafka 允许设置消息的保留时间或大小,超过限制后,旧的消息将被删除。
-
高吞吐量(High Throughput):
- Kafka 设计用于高吞吐量的消息处理,即使在廉价的硬件上也能实现高性能。
这些核心概念共同构成了 Kafka 强大的消息系统,使其在分布式系统中的数据传输和处理方面表现出色。
4、 Kafka 的核心 API
Kafka 提供了几个核心的 API,以支持不同类型的数据处理和应用场景:
-
Producer API:
- 允许应用程序向一个或多个 Kafka 主题发送消息记录。生产者可以批次发送消息以提高效率。
-
Consumer API:
- 允许应用程序订阅一个或多个主题并处理生成的记录流。消费者可以从主题读取数据。
-
Streams API:
- 允许应用程序作为一个流处理器,从一个或多个主题中消费输入流,并为其生成输出流,有效将输入流转换为输出流。
-
Connector API:
- 允许构建和运行可重用的生产者或消费者,将 Kafka 主题连接到现有的应用程序或数据系统,如关系型数据库。
这些 API 使得 Kafka 不仅可以作为简单的消息队列使用,还可以构建复杂的流处理应用程序。客户端和服务器之间的通信是通过简单、高性能、语言无关的 TCP 协议完成的,此协议已版本化并保持与旧版本的向后兼容性。Kafka 提供了多种语言的客户端库,以支持不同的编程环境。