Kafka 的简介

Kafka 简介

Apache Kafka 是一款开源的消息引擎系统,它的主要功能是提供一套完备的消息发布与订阅解决方案。在 Kafka 中,发布订阅的对象是主题(Topic),你可以为每个业务、每个应用甚至是每类数据都创建专属的主题。

也是一个分布式流计算平台,此外,还可以作为数据存储。

image

Kafka 的功能

Kafka 的核心功能如下:

  • 消息引擎:Kafka 可以作为一个消息引擎系统。

  • 流处理:Kafka 可以作为一个分布式流处理平台。

  • 存储:Kafka 可以作为一个安全的分布式存储。

Kafka 的特性

Kafka 的设计目标:

  • 高性能

    • 分区、分段、索引:基于分区机制提供并发处理能力。分段、索引提升了数据读写的查询效率。

    • 顺序读写:使用顺序读写提升磁盘 IO 性能。

    • 零拷贝:利用零拷贝技术,提升网络 I/O 效率。

    • 页缓存:利用操作系统的 PageCache 来缓存数据(典型的利用空间换时间)

    • 批量读写:批量读写可以有效提升网络 I/O 效率。

    • 数据压缩:Kafka 支持数据压缩,可以有效提升网络 I/O 效率。

    • pull 模式:Kafka 架构基于 pull 模式,可以自主控制消费策略,提升传输效率。

  • 高可用

    • 持久化:Kafka 所有的消息都存储在磁盘,天然支持持久化。

    • 副本机制:Kafka 的 Broker 集群支持副本机制,可以通过冗余,来保证其整体的可用性。

    • 选举 Leader:Kafka 基于 ZooKeeper 支持选举 Leader,实现了故障转移能力。

  • 伸缩性

    • 分区:Kafka 的分区机制使得其具有良好的伸缩性。

Kafka 术语

客户端

向主题发布消息的客户端应用程序称为生产者(Producer),生产者程序通常持续不断地向一个或多个主题发送消息,而订阅这些主题消息的客户端应用程序就被称为消费者(Consumer)

和生产者类似,消费者也能够同时订阅多个主题的消息。我们把生产者和消费者统称为客户端(Clients)。

服务端

Kafka 的服务器端由被称为 Broker 的服务进程构成,即一个 Kafka 集群由多个 Broker 组成,Broker 负责接收和处理客户端发送过来的请求,以及对消息进行持久化

备份机制(Replication)

Kafka 定义了两类副本:领导者副本(Leader Replica)追随者副本(Follower Replica)。Kafka 中同一条消息能够被拷贝到多个副本,用于提供数据冗余,以实现高可用

领导者副本对外提供服务,与客户端程序进行交互;而追随者副本只是被动地追随领导者副本而已,不能与外界进行交互。

副本的工作机制:生产者总是向领导者副本写消息;而消费者总是从领导者副本读消息。而追随者副本,它只做一件事:向领导者副本发送请求,请求领导者把最新生产的消息发给它,这样它能保持与领导者的同步。

分区机制(Partitioning)

在其他分布式系统中,你可能听说过分片、分区域等提法,比如 MongoDB 和 Elasticsearch 中的 Sharding、HBase 中的 Region,其实它们都是相同的原理,只是 Partitioning 是最标准的名称。

Kafka 中的分区机制指的是将每个主题划分成多个分区(Partition),每个分区是一组有序的消息日志。生产者生产的每条消息只会被发送到一个分区中,也就是说,如果向一个双分区的主题发送一条消息,这条消息要么在分区 0 中,要么在分区 1 中。

Kafka 通过分区机制,把数据分割成多份保存在不同的 Broker 上,从而实现了伸缩性

如你所见,Kafka 的分区编号是从 0 开始的,如果 Topic 有 100 个分区,那么它们的分区号就是从 0 到 99。

三层消息架构

至此我们能够完整地串联起 Kafka 的三层消息架构:

  • 第一层是:主题层,每个主题可以配置 M 个分区,而每个分区又可以配置 N 个副本。

  • 第二层是:分区层,每个分区的 N 个副本中只能有一个充当领导者角色,对外提供服务;其他 N-1 个副本是追随者副本,只是提供数据冗余之用。

  • 第三层是:消息层,分区中包含若干条消息,每条消息的位移从 0 开始,依次递增。最后,客户端程序只能与分区的领导者副本进行交互。

image

数据持久化

消息日志

Kafka 使用 消息日志(Log) 来保存数据,一个日志就是磁盘上一个只能追加写(Append-only)消息的物理文件。因为只能追加写入,故避免了缓慢的随机 I/O 操作,改为性能较好的顺序 I/O 写操作,这也是实现 Kafka 高吞吐量特性的一个重要手段。

日志段

不过如果你不停地向一个日志写入消息,最终也会耗尽所有的磁盘空间,因此 Kafka 必然要定期地删除消息以回收磁盘。怎么删除呢?

简单来说就是通过日志段(Log Segment)机制。在 Kafka 底层,一个日志又进一步细分成多个日志段,消息被追加写到当前最新的日志段中,当写满了一个日志段后,Kafka 会自动切分出一个新的日志段,并将老的日志段封存起来。Kafka 在后台还有定时任务会定期地检查老的日志段是否能够被删除,从而实现回收磁盘空间的目的。

消费者组(Consumer Group)

一般消息队列有两种消息模型,即点对点模型(Peer to Peer,P2P)和发布订阅模型。这里面的点对点指的是同一条消息只能被下游的一个消费者消费

在 Kafka 中实现这种点对点模型的方法就是引入了消费者组(Consumer Group)

消费者组指的是多个消费者实例共同组成一个组来消费一组主题。这组主题中的每个分区都只会被组内的一个消费者实例消费,其他消费者实例不能消费它。

为什么要引入消费者组呢?主要是为了提升消费者端的吞吐量。多个消费者实例同时消费,加速整个消费端的吞吐量(TPS)。

另外这里的消费者实例可以是运行消费者应用的进程,也可以是一个线程,它们都称为一个消费者实例(Consumer Instance)。

假设组内某个实例挂掉了,Kafka 能够自动检测到,然后把这个 Failed 实例之前负责的分区转移给其他活着的消费者。这个过程就是 Kafka 中大名鼎鼎的“重平衡”(Rebalance)。

总结

  • 消息(Record):Kafka 的数据单元被称为消息。

  • 主题(Topic)承载消息的逻辑容器,在实际使用中多用来区分具体的业务。。

    • 不同主题的消息是物理隔离的;

    • 同一个主题的消息保存在一个或多个 Broker 上。但用户只需指定消息的 Topic 即可生产或消费数据而不必关心数据存于何处。

    • 主题有一个或多个分区。

  • 分区(Partition):分区是一个有序不变的消息序列,消息以追加的方式写入分区,然后以先入先出的顺序读取。Kafka 通过分区来实现数据冗余和伸缩性。

  • 消息偏移量(Offset):表示分区中每条消息的位置信息,是一个单调递增且不变的值。

  • 副本(Replica):Kafka 中同一条消息能够被拷贝到多个地方以提供数据冗余,这些地方就是所谓的副本。

    副本还分为领导者副本和追随者副本,各自有不同的角色划分。副本是在分区层级下的,即每个分区可配置多个副本实现高可用。

  • 生产者(Producer):生产者是向主题发布新消息的 Kafka 客户端。

    生产者可以将数据发布到所选择的主题中。生产者负责将记录分配到主题中的哪一个分区中。

  • 消费者(Consumer):消费者是从主题订阅新消息的 Kafka 客户端。

    消费者通过检查消息的偏移量来区分消息是否已读。

  • 消费者群组(Consumer Group):多个消费者共同构成的一个群组,同时消费多个分区以实现高并发。

    • 每个消费者属于一个特定的消费者群组(可以为每个消费者指定消费者群组,若不指定,则属于默认的群组)。

    • 群组中,一个消费者可以消费多个分区

    • 群组中,每个分区只能被指定给一个消费

  • 重平衡(Rebalance):消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。重平衡是 Kafka 消费者端实现高可用的重要手段。


参考:

posted @ 2023-07-04 14:40  LARRY1024  阅读(109)  评论(0编辑  收藏  举报