一、kafka消息发送的流程?
发送原理:
在消息发送的过程中,涉及到了两个线程——main 线程和 Sender 线程。在 main 线程中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给 RecordAccumulator,Sender 线程不断从 RecordAccumulator 中拉取消息发送到 Kafka Broker。
0: 生产者发送的数据,不需要等数据落盘应答。
1:生产者发送过来的数据,Leader收到数据后应答。
-1:(all):生产者发送过来的数据,Leader 和 ISR 队列里面的所有节点收齐数据后应答。 -1 和 all 是等价的。
二、Kafka 的设计架构?
Kafka 基础架构:
ISR:In-Sync Replicas isr 是一个副本的列表,里面存储的都是能跟leader 数据一致的副本
1)Producer:消息生产者,就是向 Kafka broker 发消息的客户端。
2)Consumer:消息消费者,向 Kafka broker 取消息的客户端。
3)Consumer Group(CG):消费者组,由多个 consumer 组成。消费者组内每个消 费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
4)Broker:一台 Kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker 可以容纳多个 topic。
5)Topic:可以理解为一个队列,生产者和消费者面向的都是一个 topic。
6)Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。
7)Replica:副本。一个 topic 的每个分区都有若干个副本,一个 Leader 和若干个 Follower。
8)Leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是 Leader。
9)Follower:每个分区多个副本中的“从”,实时从 Leader 中同步数据,保持和 Leader 数据的同步。Leader 发生故障时,某个 Follower 会成为新的 Leader。
三、Kafka 分区的目的?
(1)便于合理使用存储资源,每个Partition在一个Broker上存储,可以把海量的数据按照分区切割成一块一块数据存储在多台Broker上。合理控制分区的任务,可以实现负载均衡的效果。
(2)提高并行度,生产者可以以分区为单位发送数据;消费者可以以分区为单位进行消费数据。
四、Kafka 是如何做到消息的有序性?
生产经验——数据有序
生产者发送的数据,单分区内可以做到有序,多分区,无法保证,除非把多个分区的数据拉到消费者端,进行排序,但这样做需要等,效率很低,还不如直接设置一个分区。
生产经验——数据乱序
1)kafka在1.x版本之前保证数据单分区有序,条件如下:
max.in.flight.requests.per.connection=1(不需要考虑是否开启幂等性)。
2)kafka在1.x及以后版本保证数据单分区有序,条件如下:
(2)开启幂等性
max.in.flight.requests.per.connection需要设置小于等于5。
(1)未开启幂等性
max.in.flight.requests.per.connection需要设置为1。
原因说明:因为在kafka1.x以后,启用幂等后,kafka服务端会缓存producer发来的最近5个request的元数据, 故无论如何,都可以保证最近5个request的数据都是有序的。
出现乱序的原因:
1)生产者在发送3请求的时候,发生异常,发生异常需要重新发送,所以排在了后面,在进行落盘的时候,先落盘1,2 ,落盘3的时候发现是4,需要等,等到3出现为止,然后将 3,4 ,5排序,排序后再进行落盘。
顺序错乱了,会自动排序(开启幂等性)。
五、ISR、OSR、AR 是什么?
1. AR(Assigned Replica,分配的副本)
AR 是指被分配给分区的副本集合。在 Kafka 中,每个分区都有一个 AR 集合,其中包含了分区的所有副本。AR 是在 Kafka 控制器节点进行计算和管理的,它决定了每个分区的副本分配策略和副本的分布情况。
主要作用:
- 副本分配: AR 确定了每个分区的副本分配策略,包括副本的数量、分布和位置等。AR 决定了哪些节点上有分区的副本,以及每个节点上分配了多少个副本。
- 负载均衡: AR 通过动态调整副本的分布,实现了集群的负载均衡。通过在不同节点上分配副本,AR 可以避免某些节点的负载过重,提高了系统的整体性能和稳定性。
2. ISR(In-Sync Replica,同步副本)
ISR 是指与 Leader 副本保持数据同步的副本集合。在 Kafka 中,每个分区都有一个 ISR 集合,其中包含了与 Leader 副本保持数据同步的所有副本。ISR 是动态调整的,根据副本的同步状态和延迟情况而变化。
主要作用:
- 数据同步: ISR 确保了分区的所有副本与 Leader 副本保持数据同步。当消息被 Leader 副本确认接收后,ISR 中的副本也会逐渐复制消息,确保所有副本之间的数据一致性。
- 高可用性: ISR 中的副本可以快速接管分区的读写请求,提高了分区的高可用性。当 Leader 副本发生故障时,ISR 中的副本可以立即接管分区的服务,而无需等待数据复制完成。
3. OSR(Out-of-Sync Replica,不同步副本)
OSR 是指与 Leader 副本不保持数据同步的副本集合。在 Kafka 中,每个分区都有一个 OSR 集合,其中包含了与 Leader 副本数据不同步的副本。OSR 的存在是正常的,可能由于网络延迟、副本故障或其他原因导致副本与 Leader 副本之间的数据同步出现滞后。
主要作用:
- 故障检测: OSR 中的副本可能由于故障或其他原因导致与 Leader 副本的数据不同步。监控 OSR 中的副本状态可以帮助及时检测和处理副本的故障或异常情况。
- 动态调整: OSR 中的副本可以通过数据同步和复制来重新加入到 ISR 中,从而提高分区的可用性和性能。Kafka 控制器会根据副本的同步状态和延迟情况动态调整 ISR 和 OSR 的成员。