1. Kafka有哪些组件?

2. Kafka的LSO、LEO、 HW 的含义?

LSO,LEO,HW其实都是kafka中的偏移量。只不过它们代表的含义是不相同的。

这里的LSO有两层含义:

一个是Log Start Offset, 一个是Log Stable Offset,第一个表示数据文件的起始偏移量,同学们还记的,咱们的log文件的文件名吗,文件名中的那个数字就是当前文件的LSO, 第二个表示的位移值是用来判断事务型消费者的可见性,就是所谓的事务隔离级别,一个叫read_commited, 一个叫read_uncommited。当然了,如果你的生产者或消费者没有使用事务,那么这个偏移量没有任何的意义。

LEO 表示 Log End Offset,就是下一个要写入的数据偏移量,所以这个偏移量的数据是不存在的

HW表示高水位线偏移量的意思。是kafka为了数据的一致性所增加的一种数据隔离方式。简单的理解,就是消费者只能消费到,小于高水位线偏移量的数据。

3. Controller的选举是怎么实现的?

这里的controller选举主要指的还是Kafka依赖于ZK实现的controller选举机制,也就是说,kafka的所有broker节点会监听ZK中的一个controller临时节点,如果这个节点没有创建,那么broker就会申请创建,一旦创建成功,那么创建成功的broker就会当选为集群的管理者controller,一旦失去了和ZK的通信,那么临时节点就会消失,此时就会再次进行controller的选举,选举的规则是完全一样的,一旦新的controller选举,那么controller纪元会被更新。

4. 分区副本AR, ISR, OSR的含义?

这里的AR可以理解为分区的所有副本集合。而ISR表示的就是正在同步数据的副本列表,列表的第一个就是分区的Leader副本,其他的副本就是Follower副本。OSR就是没有处于同步数据的副本列表。一旦副本拉取数据满足了特点的条件,那么会从OSR中移除并增加到ISR中。同样,如果副本没有拉取数据满足了特定的条件,就会从ISR中移除,放入到OSR中。这就是所谓的ISR列表的收缩和扩张。kafka使用这种ISR的方式有效的权衡了数据可靠性和性能之间的关系

5. Producer生产消息的流程?

image-20241020212448670

  1. 首先来一条消息后,生产者源码里面会对消息进行封装成 ProducerRecord对象。
  2. 封装成对象后会对该对象进行序列化[涉及网络传输], 调用Serializer组件进行序列化, 序列化后进行发送。
  3. 在发送前要确定一件事, 到底要把这条消息发送到哪个主题的哪个分区, 这个时候就需要通过 Partitioner 分区器 从 Kafka Broker集群中获取集群元数据, 获取到元数据后就可以进行发送了。
  4. 在0.8版本之前, 这个时候来了一条消息就会封装成一个请求发送到Broker, 这种情况下, 性能是非常差的, 在0.8版本之后, 进行简单的改进, 性能得到了指数级上升, 即来了一条消息后不会立马发送出去, 而是先写入到一个缓存(RecordAccumulator)队列中,封装成一个个批次(RecordBatch)。
  5. 这个时候会有一个sender线程会将多个批次封装成一个请求(Request), 然后进行发送, 这样会减少很多请求,提高吞吐量。**这个时候有个问题, 一条消息过来后没有立即发送出去,而是封装成了批次, 这样会不会有延迟的问题, 默认的batch.size是16K, 写满会立即发送, 如果写不满, 也会在规定的时间进行发送(linger.ms = 500ms)**。
  6. 发送的时候 每个Request请求对应多路复用器(Selector)中的每个kafka channel 然后将数据发送给Broker集群。
  7. 在封装Batch批次和Request请求的过程中, 还涉及一个重要的设计理念即内存池方案。

6. Producer的ack应答策略?

ACK应答机制其实就是生产者发送数据后kafka接收确认方式。Kafka确认的方式有3种:

  • 第一种是当生产者数据发送到网络客户端的缓冲区后,Kafka就认为数据收到了,那么就会进行响应,也就是应答。但是这种方式,数据可靠性是非常低的,因为不能保证数据一定会写入日志文件。但是发送效率影响不大。

  • 第二种是当主题分区的Leader副本将数据写入日志后,Kafka才认为数据收到了,然后再对生产者进行响应。这种方式,发送数据的效率会降低,但是可靠性会高一些。而可靠性最高的就是第三种方式,

  • 第三种方式就是主题分区的ISR副本列表种所有的副本都已经将数据写入日志后。Kafka才认为数据收到了,然后再对生产者进行响应。这种方式,发送数据的效率会非常低。生产者对象可以根据生产环境和业务要求对应答机制进行配置。

三种方式分别对应0,1和-1(all)。另外,生产者数据幂等性操作要求ACK应答处理机制必须为-1,而ACK的参数默认值也是-1

7. producer消息重复或消息丢失的原因?

Producer消息重复和消息丢失的原因,主要就是kafka为了提高数据可靠性所提供的重试机制,如果禁用重试机制,那么一旦数据发送失败,数据就丢失了。而数据重复,恰恰是因为开启重试机制后,如果因为网络阻塞或不稳定,导致数据重新发送。那么数据就有可能是重复的。所以kafka提供了幂等性操作解决数据重复,并且幂等性操作要求必须开启重试功能和ACK取值为-1,这样,数据就不会丢失了。

kafka提供的幂等性操作只能保证同一个生产者会话中同一个分区中的数据不会重复,一旦数据发送过程中,生产者对象重启,那么幂等性操作就会失效。那么此时就需要使用Kafka的事务功能来解决跨会话的幂等性操作。但是跨分区的幂等性操作是无法实现的。

8. Follower拉取Leader消息是如何实现的?

9. Consumer拉取消息是如何实现的?

10. Consumer消息重复或消息丢失的原因?

这里主要说的是消费者提交偏移量的问题。消费者为了防止意外情况下,重启后不知道从哪里消费,所以会每5s时间自动保存偏移量。但是这种自动保存偏移量的操作是基于时间的,一旦未达到时间,消费者重启了,那么消费者就可能重复消费数据。

Kafka提供自动保存偏移量的功能的同时,也提供了手动保存偏移量的2种方式,一个是同步提交,一个是异步提交。本质上都是提交一批数据的最后一个偏移量的值,但是可能会出现,偏移量提交完毕,但是拉取的数据未处理完毕,消费者重启了。那么此时有的数据就消费不到了,也就是所谓的数据丢失。

11. Kafka数据如何保证有序?

这里的有序我们要考虑的点比较多,但是总结起来就是生产有序,存储有序,消费有序。

所谓的生产有序就是生产者对象需要给数据增加序列号用于标记数据的顺序,然后再服务端进行缓存数据的比对,一旦发现数据是乱序的,那么就需要让生产者客户端进行数据的排序,然后重新发送数据,保证数据的有序。不过这里的缓存数据的比对,最多只能有5条数据比对,所以生产者客户端需要配置参数,将在途请求缓冲区的请求队列数据设置为5,否则数据依然可能乱序。因为服务端的缓存数据是以分区为单位的,所以这就要求生产者客户端需要将数据发送到一个分区中,如果数据发送到多个分区,是无法保证顺序的。这就是生产有序的意思。那存储有序指的是kafka的服务端获取数据后会将数据顺序写入日志文件,这样就保证了存储有序,当然也只能是保证一个分区的数据有序。接下来就是消费有序。所谓的消费有序其实就是kafka在存储数据时会给数据增加一个访问的偏移量值,那消费者只能按照偏移量的方式顺序访问,并且一个分区的数据只能被消费者组中的一个消费者消费,那么按照偏移量方式的读取就不会出现乱序的情况。所以综合以上的描述。Kafka就能够实现数据的有序。


本站由 卡卡龙 使用 Stellar 1.29.1主题创建

本站访问量 次. 本文阅读量 次.