1 kafka的ACK机制
Kafka 的 ACK(Acknowledgement)机制是指生产者在将消息发送到 Kafka 集群时,需要等待来自 Broker 的确认响应,以确保消息已经成功写入 Kafka。
Kafka 的 ACK 有三种模式:
-
acks=0:不需要等待来自 Broker 的确认即可将消息视为已写入 Kafka,这种模式可用于不关心数据可靠性的场景。
-
acks=1:只需要等待消息被写入到 Kafka 的 leader 节点并得到确认即可,此模式下生产者会收到来自 Broker 的确认响应。如果 leader 节点写入失败,则消息不会被写入到 Kafka,并且会重新尝试发送。
-
acks=all/-1:需要等待所有副本都成功写入才可视为写入成功,此模式下会等待所有副本节点都写入后,才会向生产者发出确认响应。
2 kafka生产者写入partition的规则
-
如果 Producer 明确指定写入的 partition,消息将会被写入到指定 partition 中。
-
如果 Producer 没有明确指定 partition,但消息具有键值,那么 Kafka 会根据消息的键值对 partition 数量取模,从而得出写入的 partition。
-
如果 Producer 既没有指定 partition,也没有消息键值,则 Kafka 会采用 round-robin 的方式,轮流将消息写入每个 partition。
3 kafka的isr队列以及作用
在 Kafka 中,ISR(In-Sync Replica)队列是指某个 partition 所有与 leader 副本保持同步的副本集合。
ISR 队列的作用主要有以下几点:
-
ISR 队列用于保证数据可靠性:当发送消息到 Kafka 时,Producer 将消息发送到 partition 的 leader 副本,并等待 ISR 队列中的 replica 同步完成后才会向 Producer 返回 ack 确认。这样可以确保数据被复制到足够数量的 replica 中,从而提高数据的可靠性和稳定性。
-
ISR 队列用于防止数据丢失:当某个 replica 落后于 leader 副本时,Kafka 会将其移出 ISR 队列,并暂停向其推送数据,以避免数据丢失。如果该 replica 追上了 leader,并与其保持同步,则会重新加入 ISR 队列并继续接收数据。
-
ISR 队列用于提高读取性能:Kafka 读取数据时,优先从 ISR 队列中的 replica 中读取数据。由于 ISR 队列中的 replica 已经同步了最新的数据,因此读取过程中可以避免长时间的等待和大量的网络传输,从而提高读取性能和效率。
4 kafka的选举机制
在 Kafka 集群中,每个 partition 都有一个 leader 和多个 follower。leader 负责处理读写请求,follower 负责复制 leader 的数据。当 leader 发生故障时,需要进行 leader 选举,以选择一个新的 leader 并继续提供服务。
Kafka 中的 leader 选举机制是基于 ZooKeeper 实现的,其大致步骤如下:
-
当某个 partition 的 leader 发生故障时,集群中的每个副本都会尝试向 ZooKeeper 申请成为该 partition 的新 leader。
-
ZooKeeper 收到申请后,在一个称为“选举目录”的节点上创建一个 EPHEMERAL 类型的节点,表示该副本申请成为新的 leader,并在该节点中记录其 ID。
-
如果该节点被成功创建,则该副本成为该 partition 的临时 leader。它会将自己的元数据信息写入 ZooKeeper 中,然后开始接收和处理读写请求。
-
其他副本会从 ZooKeeper 中读取该 partition 的元数据信息,并与该临时 leader 进行通信同步数据。
-
当原 leader 恢复时,它会发现自己不再是该 partition 的 leader,此时它会变成该 partition 的 follower,并开始从新 leader 处复制数据。
-
如果在选举过程中存在多个副本同时申请成为 leader,ZooKeeper 会根据节点的编号选择一个副本作为该 partition 的新 leader。