0%

kafka 简介

概述

Apache Kafka is an open-source distributed event streaming platform used by thousands of companies for high-performance data pipelines, streaming analytics, data integration, and mission-critical applications.

简言之,Apache Kafka 是一款开源的消息引擎系统。

消息引擎系统,通俗来讲,系统 A 发送消息给消息引擎系统,系统 B 从消息引擎系统中读取 A 发送的消息。

消息引擎模型:

  • 点对点模型
  • 发布/订阅模型

Q: why 消息引擎 ?

A: 削峰填谷

Kafka 高可用

  • 不同 Broker 分散运行在多个机器上
  • 副本机制,相同的数据拷贝到多台机器上

Kafka 副本机制

  • Kafka 定义了两类副本:领导者副本(Leader Replica)和追随者副本(Follower Replica)
  • Producer 总是向 Leader Replica 写消息;而 Consumer 总是从 Leader Replica 读消息。
  • Follower Replica,它只做一件事:向 Leader Replica 发送请求,请求Leader把最新生产的消息发给它(异步消息拉取),保持与 Leader 的同步 。

Kafka 伸缩性

副本机制可以保证数据的持久化或消息不丢失,但没有解决伸缩性的问题。

什么是伸缩性呢?我们拿副本来说,虽然现在有了领导者副本和追随者副本,但倘若领导者副本积累了太多的数据以至于单台 Broker 机器都无法容纳了,此时应该怎么办呢?

Kafka 分区机制

  • 每个主题划分成多个分区(Partition),每个分区是一组有序的消息日志。
  • 生产者生产的每条消息只会被发送到一个分区中,也就是说如果向一个双分区的主题发送一条消息,这条消息要么在分区 0 中,要么在分区 1 中。
  • 分区编号是从 0 开始的,如果 Topic 有 100 个分区,那么它们的分区号就是从 0 到 99。
  • 生产者向分区写入消息,每条消息在分区中的位置信息由一个叫位移 Offset的数据来表征。分区位移总是从 0 开始,假设一个生产者向一个空分区写入了 10 条消息,那么这 10 条消息的位移依次是 0、1、2、……、9(消息表征分区内的消息位置,它是不变的,即一旦消息被成功写入到一个分区上,它的位移值就是固定的了)。

Kafka 三层消息架构

  • 第一层是主题层,每个主题可以配置 M 个分区,而每个分区又可以配置 N 个副本。
  • 第二层是分区层,每个分区的 N 个副本中只能有一个充当领导者角色,对外提供服务;其他 N-1 个副本是追随者副本,只是提供数据冗余之用。
  • 第三层是消息层,分区中包含若干条消息,每条消息的位移从 0 开始,依次递增。
  • 最后,客户端程序只能与分区的领导者副本进行交互。

由消息层 => Kafka Broker 持久化数据

性能较好的顺序 I/O 写操作 [追加写入] ,避免了缓慢的随机 I/O 操作,是实现 Kafka 高吞吐量特性的一个重要手段。

  • Kafka 使用消息日志(Log)来保存数据,一个日志就是磁盘上一个只能追加写(Append-only)消息的物理文件。

  • 通过日志段(Log Segment)机制。一个日志又进一步细分成多个日志段,消息被追加写到当前最新的日志段中,当写满了一个日志段后,Kafka 会自动切分出一个新的日志段,并将老的日志段封存起来。

  • Kafka 在后台还有定时任务会定期地检查老的日志段是否能够被删除,从而实现回收磁盘空间的目的。

总结

Producer 和 Consumer 都是 Kafka 系统的 Clients

  • 消息:Record。这里的消息就是指 Kafka 处理的主要对象。
  • 主题:Topic。主题是承载消息的逻辑容器,在实际使用中多用来区分具体的业务。
  • 分区:Partition。一个有序不变的消息序列。每个主题下可以有多个分区。
  • 消息位移:Offset。表示分区中每条消息的位置信息,是一个单调递增且不变的值。
  • 副本:Replica。Kafka 中同一条消息能够被拷贝到多个地方以提供数据冗余,这些地方就是所谓的副本。副本还分为领导者副本和追随者副本,各自有不同的角色划分。副本是在分区层级下的,即每个分区可配置多个副本实现高可用。
  • 生产者:Producer。向主题发布新消息的应用程序。
  • 消费者:Consumer。从主题订阅新消息的应用程序。
  • 消费者位移:Consumer Offset。表征消费者消费进度,每个消费者都有自己的消费者位移。
  • 消费者组:Consumer Group。多个消费者实例共同组成的一个组,同时消费多个分区以实现高吞吐。
  • 重平衡:Rebalance。消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。Rebalance 是 Kafka 消费者端实现高可用的重要手段。

思考

Kafka 不像 MySQL 那样允许追随者副本对外提供读服务?

https://www.zhihu.com/question/327925275/answer/705690755