kafka入门
定义
是一种高吞吐量的分布式发布订阅消息系统。由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。
目的
通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时消息。
特点
- 高吞吐量:可满足每秒百万级别的消息的生产和消费。
- 持久性:具备一套完整的消息的存储机制,可以确保消息数据的高效的安全的持久化。
- 分布式:既有扩展以及容错性。
相关术语
生产者(Producer)
消息生产者,负责把产生的消息发送到Broker(kafka服务器)。
消费者(Consumer)
消息消费者,从Broker(kafka服务器)读取消息并处理。
消费者群组(Consumer Group)
消费者群组,一个消费者群组可以包含一个或多个消费者,每个消费者属于一个特定的消费者群组,一条消息可以被多个不同的消费者群组消费,但是一个消费者群组中只能有一个消费者能够消费该消息,同一消费者组中的消费者不会重复消费消息。
主题(Topic)
消息主题,即消息的分类,kafka的数据保存在topic中,每个broker可以创建多个 topic ,一个kafka集群可以有多个topic。
kafka节点(Broker)
消息中间件处理节点,一个kafka节点就是一个broker,一个kafka集群有由多个broker组成,一个broker可以创建多个topic,一个broker可以容纳多个topic的多个 partition。
分区(Partition)
topic的分区,每个topic可以有多个分区,每个分区内部消息是有序的。
偏移量(Offset)
- 介绍:偏移量是消息在每个分区中的唯一标识符,用于标识消息在分区中的位置,是一个单调递增的64位整数,每个分区的偏移量从0开始,随着消息的写入线性增加。(不同分区的偏移量没有直接关系,偏移量只在分区内有意义)
- 作用:
- 消息位置跟踪:消费者通过记录已消费消息的偏移量来跟踪消费进度。
当消费者读取消息后,会提交当前的偏移量(如offset=100)。
下次重启时,消费者会从上次提交的偏移量继续消费(从offset=101开始)。
- 消息顺序保证
同一分区内,消息按偏移量顺序存储,消费者按顺序读取。
但不同分区之间的消息无法保证全局顺序(除非只用一个分区)
- 消费重放:通过重置偏移量,消费者可以重新消费历史消息。
- 消息保留策略:Kafka 根据偏移量和保留时间(如 7 天)决定何时删除旧消息。
- 偏移量管理方式:
消费者通过自动提交或手动提交偏移量来控制消费进度:
- 自动提交:消费者定期自动提交当前偏移量(默认 5 秒)。
- 优点:简单易用。
- 缺点:可能导致重复消费(如提交后但处理未完成时重启)。
- 手动提交:开发者在消息处理完成后手动提交偏移量。(有同步和异步两种方式手动提交)
- 优点:精确控制消费进度,避免重复消费。
- 缺点:需处理异常情况(如提交失败)。
- 偏移量重置策略:
- earliest:从分区起始位置(最小偏移量)开始消费,即从分区最早的消息开始消费。
- latest(默认):从分区末尾(最新偏移量)开始消费,即只消费新到达的消息。
- none:若没有已提交的偏移量,则抛出异常。
副本因子(replicationFactor)
指每个分区的副本数量。它决定了每一条消息会被复制到多少个不同的Broke节点上,从而实现数据冗余和高可用性。
- replicationFactor = 1:每个分区只有 1 个副本(即 Leader 本身),没有冗余。如果该 Broker 故障,数据将不可用。
- replicationFactor = 3:每个分区会有 3 个副本,分布在 3 个不同的 Broker 上。此时系统可容忍2 个 Broker 同时故障(只要至少 1 个副本存活,数据就不会丢失)。
replicationFactor越大,系统容错能力越强,但副本数量越多同样会增加网络传输和磁盘IO开销,并且可能导致选举延迟变成,建议生产环境设置为 3。
replicationFactor数量不能超过Broke数量,例如集群有 3 个 Broker,replicationFactor最大只能设为 3,否则会有副本无法分配。
副本机制
- 副本概念:副本就是对分区的备份。
- 副本机制概念:同一个分区下的所有副本保存有相同的消息序列,这些副本分散保存在不同的Broker上,从而能够对抗部分 Broker 宕机带来的数据不可用。
- 副本类型:
- 首领副本(Leader):每个分区都有一个Leader副本,生产者请求和消费者请求都会经过这个副本,生产者写操作和消费者的读操作都发生在Leader上,同时Leader负责把数据同步给Follow。
- 跟随者副本(Follow):首领以外的副本都是跟随者副本。它们的主要任务是接收Leader的同步数据,保持与Leader一致的状态。如果首领发生崩溃,那么其中的一个跟随者就会被提拔为新首领。
Kafka 默认副本 1 个,生产环境一般配置为 2 个,保证数据可靠性;太多副本会增加磁盘存储空间,增加网络上数据传输,降低效率。
Kafka 中副本分为: Leader 和 Follower。 Kafka 生产者只会把数据发往 Leader,然后 Follower 找 Leader 进行同步数据。
ISR机制
- 概念:在 Kafka 的分区副本机制中,每个分区有一个 Leader 副本和多个 Follower 副本,而 ISR 就是由 Leader 副本和所有与 Leader 保持同步的 Follower 副本组成的集合。
- 作用:通过动态维护一个与Leader副本保持同步的Follower副本集合,确保在Leader发生故障的时候,系统可以从同步副本列表中快速选出新的Leader,避免数据丢失。实现高可用性和数据一致性。
- Kafka根据副本同步的情况,分成3个集合。
- AR:被分配到某个分区的副本集合,Kafka 分区中的所有副本统称为 AR,AR包括ISR和OSR。
- ISR:表示和Leader副本保持同步的Follower副本集合。 如果 Follower 长时间未向 Leader 发送通信请求或同步数据,则该 Follower 将被踢出 ISR。
该时间阈值由 replica.lag.time.max.ms参数设定,默认 30s。 Leader 发生故障之后,就会从 ISR 中选举新的 Leader。 - OSR:未能与Leader副本保持同步的副本(即不在ISR中的副本),例如由于网络延迟、宕机或者IO问题,Follow可能被移除ISR,进入OR。
副本同步机制介绍
- 介绍:Follow副本定期从Leader副本拉取数据并更新日志的过程。
- 副本同步的作用:确保副本之间的数据一致性。通过将消息从Leader副本同步到Follow副本,可以确保这些副本之间的数据保持一致。此外,副本同步还可以用于实现数据的高可用性。当Leadedr副本发生故障时,可以从Follow副本中选择一个作为新的Leader副本,从而避免服务中断。
- 副本同步的实现原理:
- Follow副本定期向Leader副本发送拉取请求(FetchRequest),请求包括Follow副本已经同步的最大偏移量(maxOffset)。
- Leader副本收到拉取请求后,根据Follow副本的最大偏移量返回对应的消息。
- Follow副本收到Leader副本返回的消息后,将消息写入本地日志,并更新最大偏移量。
在副本同步过程中,Follow副本需要定期向Leader副本发送心跳,以维持与Leader副本的连接。如果Follow副本与Leader副本的连接中断,或者同步延迟超过一定阈值,Follow副本会被移出 ISR(In-Sync Replicas)。
生产者发送确认三种模式(ACK机制)
ACK机制概念:确认机制,指生产者在发送消息后,需要等待Broker的确认信号,以确保消息成功发送。这种机制的主要目的是保证消息的可靠性,防止因网络问题或Broker故障导致消息丢失。
Kafka 在生产者上有一个可选的参数 ack,该参数指定了必须要有多少个分区副本收到消息,生产者才会认为消息写入成功,配置值如下所示:
- acks=0
- 含义:生产者发送消息后不需要等待任何确认,直接继续发送下一条消息。
- 优缺点:消息发送吞吐量高,但可靠性低,生产者无法知道消息是否成功到达 Kafka 服务器,可能导致消息丢失。
- 适用场景:日志数据采集。
- acks=1
- 含义:生产者发送消息后,只要等待集群的首领节点(leader)收到消息,生产者就会得到确认,而不需要等待其它副本。
- 优缺点:可靠性和吞吐量较高,但也存在消息丢失的可能性,例如Leader副本将消息同步给Follow副本时Leader发送故障。
- 适用场景:实时监控数据的传输。
- acks=all 或 acks=-1
- 含义:生产者发送消息后,需要等待所有ISR(In-Sync Replicas)副本都成功接收并确认消息后才会收到确认信号。
- 优缺点:可靠性最高,但会增加延迟,降低吞吐量。
- 适用场景:金融交易数据的传输。
Kafka生产者在发送消息后,如果设置了等待服务器的确认(通过acks参数配置),会等待一定时间来收到来自服务器的确认(ack)。这个等待时间由timeout.ms参数控制,默认是10000毫秒(10秒)。如果在等待时间内没有收到服务器的确认,生产者可以选择重试发送或者处理发送失败的逻辑。这取决于生产者的配置。通常,生产者会根据配置的重试次数和重试间隔来进行重试,以确保消息最终被成功发送。
在Kafka 的生产者配置中,你可以找到以下与重试相关的配置项:
- retries:定义了生产者在发送消息时的最大重试次数。
- retry.backoff.ms:定义了两次重试之间的等待时间间隔。
优点
- 高吞吐量:支持每秒百万级消息处理。
- 低延迟:最低延迟只有几毫秒。
- 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失。
- 容错性高:允许集群中节点失败,当集群中的某个节点失效时,生产者和消费者可以自动重定向到其他可用节点,确保消息的连续性。(若副本数量为n,则允许n-1个节点失败)。
- 可扩展性:可增加节点实现水平扩展。
缺点
- 顺序性:跨分区场景下无法保证消息的顺序性。
- 依赖Zookeeper:旧版本Kafka依赖Zookeeper进行集群管理和元数据存储。如果Zookeeper集群出现问题,可能会影响到Kafka的稳定性和可用性。
- 扩容复杂:当需要增加Kafka集群的容量时,可能需要重新分配分区和副本,这可能会导致数据迁移和停机时间。
适用场景
- 日志收集和分析。
- 分布式系统监控和告警:Kafka可以接收来自分布式系统的监控数据和告警信息,并进行实时处理和通知。
- 消息队列:削峰填谷,解耦生产者与消费者。
- 事件驱动架构:微服务间异步通信。
- 数据流处理:如用户行为分析、实时监控。
.net集成kafka源码地址
https://github.com/confluentinc/confluent-kafka-dotnet
流程图


浙公网安备 33010602011771号