KAFKA基本原理要点
KAFKA基本原理要点
KAFKA作为数据连接层,以集群的方式运行,可以自由伸缩,持续处理大型的数据流。
KAFKA的消息通过主题进行分类。
主题可以被分为若干个分区,一个分区就是一个提交日志。
- 消息以追加的方式写入分区,然后以先入先出的顺序读取。
- 一个主题包含多个分区,无法在整个topic上保证消息的顺序性,但可以保证消息在单个分区上的顺序性
- KAKFA可以通过分区来实现数据的伸缩性和冗余性
- 多个分区可以分布在不同的服务器上,因此可以提供比单服务器更强大的性能
KAFKA的客户端主要分为:生产者和消费者;
- 数据集成用的KAFKA Connect API
- 流式处理的KAFKA Stream ==> Flink
生产者创建消息
- 生产者在默认情况下把消息均衡地分布到主题的所有分区上,而并不关心特定消息会被写到哪个分区
- 生产者会把消息直接写到指定的分区。这通常是通过消息键和分区器来实现的
- 分区器为键生成一个散列值,并将其映射到指定的分区上。这样可以保证包含同一个键的消息会被写到同一个分区上。
- 生产者也可以使用自定义的分区器,根据不同的业务规则将消息映射到分区。
消费者读取消息
- 消费者订阅一个或多个主题,并按照消息生成的顺序读取消息。
- 消费者通过检查消息的偏移量来区分已经读取过的消息。
偏移量
- 偏移量是另一种元数据,它是一个不断递增的整数值,在创建消息时,Kafka会把它添加到消息里。
- 在给定的分区里,每个消息的偏移量都是唯一的。
- 消费者把每个分区最后读取的消息偏移量保存在 Zookeeper 或 Kafka 上,如果消费者关闭或重启,它的读取状态不会丢失。
消费者群组
- 由多个消费者组成,群组保证每个分区只能被一个消费者使用。
- 消费者与分区之间的映射通常被称为消费者对分区的所有权关系。
broker 和集群
- 一个独立的 Kafka 服务器被称为 broker。
- 作用1:broker 接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。
- 作用2:broker 为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘上的消息
- broker 是集群的组成部分。每个集群都有一个 broker 同时充当了集群控制器的角色(自动从集群的活跃成员中选举出来)https://raft.github.io/
- 一个 Kafka集群需要多少个 broker 取决于以下几个因素。
- 首先,需要多少磁盘空间来保留数据,以及单个 broker 有多少空间可用。如果整个集群需要保留 10TB 的数据,每个broker 可以存储 2TB,那么至少需要 5 个 broker。
- 一个分区可以分配给多个 broker,这个时候会发生分区复制。这种复制机制为分区提供了消息冗余,如果有一个 broker 失效,其他 broker 可以接管领导权。
- 保留消息:Kafka 的一个重要特性。Kafka broker 默认的消息保留策略是这样的:要么保留一段时间(比如 7 天),要么保留到消息达到一定大小的字节数(比如 1GB)。当消息数量达到这些上限时,旧消息就会过期并被删除。https://redis.io/topics/lru-cache
KAFKA的一些特性
- 多生产者
- 多消费者
- 基于磁盘的数据存储
- 伸缩性
- 高性能消息流处理工具
生产者写数据
- 向KAFKA发送消息的主要步骤
- ProducerRecord 对象需要包含目标主题和要发送的内容。我们还可以指定键或分区。
- 在发送 ProducerRecord 对象时,生产者要先把键和值对象序列化成字节数组,这样它们才能够在网络上传输。
- 数据被传给分区器。如果之前在 ProducerRecord 对象里指定了分区,那么分区器 就不会再做任何事情,直接把指定的分区返回。如果没有指定分区,那么分区器会根据 ProducerRecord 对象的键来选择一个分区。
- 选好分区以后,生产者就知道该往哪个主题和分区发送这条记录了。紧接着,这条记录被添加到一个记录批次里,这个批次里的所有消息会被发送到相同的主题和分区上。有一个独立的线程负责把这些记录批次发送到相应的broker 上
- 服务器在收到这些消息时会返回一个响应。如果消息成功写入 Kafka,就返回一个 RecordMetaData 对象,它包含了主题和分区信息,以及记录在分区里的偏移量。如果写入失败,则会返回一个错误。生产者在收到错误之后会尝试重新发送消息,几次之后如果还是失败,就返回错误信息。
- 向KAFKA发送消息的主要步骤
发送消息的方式
- 发送并忘记(fire and forget)
把消息发送给服务器,但并不关心它是否正常到达。因为 Kafka 是高可用的,而且生产者会自动尝试重发。不过,使用这种方式有时候 也会丢失一些消息。- 同步发送
明确的等待消息是否发送成功 - 异步发送
指定一个回调函数,服务器在返回响应时调用该函数。
- 同步发送
- 发送并忘记(fire and forget)
消费者消费
1.消费者组
再均衡
2.1当一个消费者被关闭或发生崩溃时,它就离开群组,原本由它读取的分区将由群组里的其他消费者来读取。在主题发生变化时,比如管理员添加了新的分区,会发生分区重分配。
2.2 分区的所有权从一个消费者转移到另一个消费者,这样的行为被称为再均衡。
消费者通过向被指派为群组协调器的 broker(不同的群组可以有不同的协调器)发送心跳来维持它们和群组的从属关系以及它们对分区的所有权关系。
如果消费者停止发送心跳的时间足够长,会话就会过期,群组协调器认为它已经死亡,就会触发一次再均衡。
KAFKA基本原理要点
https://zty-f.github.io/2024/03/25/KAFKA基本原理要点/