kafka 如何保证消息不丢失的
Kafka 采用了多种机制来保证消息不丢失,主要包括以下几个方面:
-
数据复制机制:Kafka 使用副本机制来保证数据的冗余备份,每个分区可以设置多个副本,每个副本都会复制主副本的数据,当主副本发生故障时,可以自动将副本升级为主副本,从而避免数据丢失
-
持久化机制:Kafka 采用持久化机制来保证数据不丢失。它将所有消息都写入磁盘中的日志文件,这些日志文件被称为“分区日志”,即使系统崩溃,分区日志中的消息也不会丢失
-
批量发送机制:Kafka 采用批量发送机制来提高数据的吞吐量,并减少网络开销。它会将多个消息打包成一个批次进行发送,这样可以减少网络传输的次数,从而降低消息丢失的概率
-
ISR 机制:ISR(In-Sync Replicas)是指同步副本集合,它用来确保分区副本之间的数据一致性,(1)只有 ISR 中的副本才会被认为是可用的副本,如果主副本所在的副本不在 ISR 中,那么就会认为该分区不可用,(2)只有在所有 ISR 中的副本都确认了消息后,消息才被认为已经成功提交到主分区中,这样可以保证消息不会在提交前丢失
-
保证生产者的确认机制:Kafka 提供了多种生产者的确认机制,包括同步确认和异步确认。在同步确认模式下,生产者会等待 Broker 对消息的确认后才会发送下一条消息,这样可以确保消息已经被成功接收。在异步确认模式下,生产者可以在消息发送后立即返回,并在 Broker确认消息后执行回调函数
简述 Kafka 的 ack 机制
Kafka 的 ack 机制,指的是 producer 的消息发送确认机制,这直接影响到 Kafka 集群的吞吐量和消息可靠性。而吞吐量和可靠性就像硬币的两面,两者不可兼得,只能平衡
———————————————————————————————————————
ack 有3个可选值,分别是1,0,-1
ack=1,简单来说就是,producer 只要收到一个分区副本成功写入的通知就认为推送消息成功了,这里有一个地方需要注意,这个副本必须是 leader 副本,只有 leader 副本成功写入了,producer 才会认为消息发送成功
ack=0,简单来说就是,producer 发送一次就不再发送了,不管是否发送成功
ack=-1,简单来说就是,producer 只有收到分区内所有副本的成功写入的通知才认为推送消息成功了
———————————————————————————————————————
ack=1的情况下,producer 只要收到分区 leader 成功写入的通知就会认为消息发送成功了。如果 leader 成功写入后,还没来得及把数据同步到 follower 节点就挂了,这时候消息就丢失了
- 保证消费者的确认机制:Kafka 提供了消费者的确认机制,消费者可以在消费完消息后向 Broker发送确认消息,这样可以确保消息已经被成功消费
综上所述,Kafka 通过多种机制来保证数据不丢失,包括数据复制机制、持久化机制、批量发送机制和 ISR 机制,这些机制的协同作用可以保证 Kafka 的高可靠性和稳定性
broker Partition 和副本什么关系
在 Kafka 中,一个 topic 可以被分为多个 partition,每个 partition 是一个有序、不可变的数据序列,每个 partition 可以拥有多个副本(replica),其中一个副本被称为 leader 副本,其他副本被称为 follower 副本
Broker 是 Kafka 集群中的一个节点,它可以管理多个 topic 的多个 partition,一个 partition 可以被分配到多个 broker 上,每个 broker 可以拥有多个 partition 的副本,一个 partition 的 leader 副本所在的 broker 被称为该 partition 的首领副本(broker),其他副本所在的 broker 被称为该 partition 的追随副本(broker)
因此,broker 和 partition 是 Kafka 集群中的两个不同的概念,而副本则是一个 partition 的属性,一个 broker 可以管理多个 partition,每个 partition 可以有多个副本,其中一个是 leader 副本,其他是 follower 副本