七的博客

Kafka快速入门2-Kafka架构

消息队列

Kafka快速入门2-Kafka架构以及核心概念

实际上手前,先了解下 kafka 的架构以及核心概念,可以有一个全面的认识。

1. 架构

kafka 的架构大致如下图,下面这个图里的概念理解了,kafka 的使用基本也就没问题。

Kafka简单架构图

上面这张图中涉及到下面几个概念:

  • Broker: Kafka服务节点。
  • Topic: 主题。
  • Partition: 分区。
  • Producer:生产者。
  • Consumer:消费者。
  • Zookeeper:Kafka集群管理以及协调。

2. 核心概念

Kafka 的核心概念大部分都是在上面这张图中,可以针对性对这几个概念进行讲解。

2.1 Zookeeper

Zookeeper 是一个分布式协调服务,是单独部署的进程,目前由 Apache 基金会进行维护。可以简单的理解 Zookeeper 起到了一个 kafka 节点信息维护、topic 信息维护、消费信息数据等的维护。

主要几点作用:

  • 每个 Kafka Broker 启动的时候会向 Zookeeper 注册当前实例节点的信息。
  • Topic 的配置信息,包括分区数量、副本数量等都会注册到 Zookeeper 中。
  • 当分区的 Leader 节点失效时, Zookeeper 会帮助选择新的 Leader 节点。
  • 跟踪消费者组成员、消费的分区、消费的偏移量。

2.2 Broker

Kafka Broker

Broker 是 Kafka 的核心组件,主要负责消息的存储跟传输。 每个 Broker 都是一个独立的 Kafka 服务实例,一个 Kafka 集群就是有若干个 Broker 实例,每个 Broker 有自己唯一的 ID。

Broker 的主要功能包括:

  • 接收生产者发送的消息,保存在本地磁盘上。
  • 向消费者提供保存的消息,不过 Broker 本身不会去维护消费者的状态信息。
  • 每个 Broker 会管理一定数量的分区。

在 Kafka 集群中可以比较容易的添加新的 Broker ,也就代表着可以比较容易通过扩容实例来提升性能。

2.3 Topic

kafka 中的 topic 可以理解为消息的类别,每个 topic 都有一个唯一的名称。比如举几个电力采集行业的 topic 名称:

  • new-meter-data 新安装的电表数据
  • low-balance-event 电表余额比较低的事件
  • power-outage-event 电表停电事件
  • voltage-anomaly-event 电压异常事件

每个 topic 的名称会代表其特定的业务含义,感兴趣的消费者可以订阅对应的 topic 进行消息消费。单个 topic 支持多个消费者进行订阅消费。

topic 基本概念

每个 topic 可以有多个分区,这样可以提升并行处理消息的速度。分区数可以在创建 topic 的时候指定,也可以建立好后后续增加。

需要注意的是 topic 是一个逻辑概念,这种概念对于使用 kafka 的人比较友好,可以通过 topic 去区分不同的业务。

2.4 Partition

上面讲了 topic 是逻辑概念, partition 分区是 topic 的物理实现。 每一个 topic 会由一个或者多个分区组成,每个 topic 至少会有一个分区。

分区是以文件的形式存储在 broker 的文件系统上,每个分区会由多个分段 segment 文件组成,这样可以更加高效读写数据。

kafka partition 简单概念

每个分区都是一个有序、不可变的消息序列。一个 topic 下的分区可以分布在不同的 broker 中,这样可以提高并行度。同时分区是Kafka实现负载均衡和故障转移的基本单位。

正常情况下,修改 topic 的分区时, kafka 会尝试在可用的 broker 中均匀的分配分区。 如果 kafka 集群的服务器性能有差距,也可以进行手动控制分配。

这样设计的好处:

  • 不同的 broker 可以同时处理同一个 topic 的不同分区,这样提升整体的读写吞吐量性能。
  • 一个 broker 失效,只会该节点上的分区不可用,不会导致整个 topic 不可用。
  • 可以动态增加分区数量来应对增长的数据量。
  • 消费者可以使用多个消费者并行进行消费。

2.5 Replication

副本是分区数据的一个完整拷贝。在 Kafka 中,每个 topic 被划分为一个或多个 partition ,而每个 partition 可以有一个或多个副本,这些副本分布在集群的不同 broker 上。

topic、partition、replication 的示意图如下,稍微理解下这几个的概念就容易记住。

Kafka 3副本示意图

副本分为 2 种:

  • 领导者副本 Leader Replica : 每个分区都有一个领导者副本,负责处理该分区的所有读写请求。
  • 跟随者副本 Follower Replica :领导者以外的副本被称为跟随者副本。它们从领导者那里复制数据,不直接处理客户端的读写请求。

副本的作用:

  • 提升数据的可用性,因为 Follower 副本只是保存数据,不对外提供数据请求处理。 当 Leader 副本不可用的时候, Follower 可以快速的被提升为 Leader 进行对外服务。
  • 多个副本在多个物理节点保存,降低数据丢失风险。

2.6 Producer

生产者就是负责创建消息并发送到 kafka 节点的角色,这个角色比较好理解。

生产者主要干以下几件事:

  • 将消息发送到指定的 topic 。
  • 将消息发送到指定的 topic 分区。
  • 将数据序列化成二进制格式。
  • 发送失败的消息,选择性的进行自动重试发送。
  • 为了提升性能,会将消息攒成一批进行发送。
  • 支持异步以及同步写入。

2.7 Consumer

消费者的概念也比较好理解,就是负责从 kafka 节点读取消息,然后做一定的业务逻辑处理。

消费者主要做的事情:

  • 订阅一个或者多个 topic。
  • 从一个或者多个分区读取消息。
  • 跟踪已经消费的消息位置,也叫 Offset。

2.8 Consumer Group

Kafka 消费者组就是一组协同消费 Kafka 主题的消费者实例的集合,这些消费者运行相同的程序代码,但是有多个不同的进程,通常也会部署在不同的机器上。

消费者组的作用:

  • 通过多个消费者并行处理消息,提升数据消费的吞吐量。
  • kafka 会自动在这个组的消费者分配分区,这样可以均匀的消费消息。
  • 组中的消费者下线后,其他消费者可以接管原来消费者消费的分区。
  • 每个 topic 分区的消息同一时刻只会被组内的一个消费者消费。

2.9 Offset

Offset 偏移量是消息在分区中的唯一标识,类似于数组的索引。它可以帮助消费者跟踪已经消费的消息位置。

可以想想平时看视频的时候,Offset 就像一个视频的进度条,进度条的每一个点都代表的是时间戳。

  • 可以从上次观看的位置继续看视频,这个过程就是读取最后提交的Offset。
  • 也可以从头开始看视频,这个过程就是重置 Offset 到开始位置。
  • 也可以跳到任意位置看视频,这个过程就是手动设置Offset。

偏移量的特点:

  • 单调递增,但可能不连续。

  • 消费者可以控制 Offset 的提交。

  • 支持从任意 Offset 位置开始消费。

参考链接