🫱🏽 kafka分区策略
- 默认分区策略(DefaultPartitioner): 如果消息没有指定 key,或者指定的 key 为 null,那么默认分区策略会采用轮询(round-robin)的方式将消息均匀地分配到所有可用分区。
- 基于 key 的分区策略(PartitionByKey): 如果消息指定了 key,那么基于 key 的分区策略会根据 key 的哈希值将消息分配到对应的分区。这确保具有相同 key 的消息总是被分配到同一个分区,以保证消息的顺序性。
- 自定义分区策略: 用户可以根据自己的需求实现自定义的分区策略。这可以通过实现 Kafka 提供的
Partitioner
接口来完成。
🫱🏽 kafka后台同步策略
后台同步任务是 Kafka 内部自动管理的,不需要人为干预。Kafka 设计了一些后台任务来确保副本之间的同步和数据的一致性,以提高整个系统的可用性和可靠性。
这些后台同步任务包括:
- Leader 的心跳检测: Kafka 集群中的每个分区都有一个领导者(Leader),领导者会定期发送心跳消息给追随者(Followers)。这有助于检测领导者的健康状态。
- 追随者的数据拉取: 追随者会定期从领导者拉取缺失的数据,以保持与领导者的同步。这有助于处理因追随者滞后或宕机而导致的数据不一致。
- Leader 的日志清理: 领导者会定期清理旧的日志段,删除过时的消息。这确保了存储在磁盘上的数据不会无限增长,也有助于提高性能。
消息追加到分区的日志文件,这确保了分区的写入顺序
消息的复制和同步:
消息异步地复制到追随者(Followers)
步骤 | 详细过程 | 举例(假设分区有3个追随者,需要2个确认) |
---|---|---|
初始状态: | 一个分区有一个领导者和多个追随者。领导者和追随者的副本都在 ISR 中,表示它们与领导者同步。 | |
生产者写入消息: | 生产者产生一条新消息并发送给领导者。领导者接收到消息后,将消息追加到分区的日志文件。 | 生产者发送消息A,领导者将A追加到日志。 |
消息异步复制到追随者: | 领导者开始异步地将写入的消息复制到追随者。追随者接收到领导者的复制请求,将消息追加到它们的日志文件中。 | 追随者1、追随者2接收A并将A追加到各自日志。 |
等待 ISR 中的确认: | 尽管消息复制是异步进行的,领导者必须等待 ISR 中的一定数量的追随者确认已成功复制。 | 等待追随者1、追随者2确认。两者是异步的。 |
如果 ISR 中的足够数量的追随者确认成功复制,领导者将响应给生产者,表示消息已成功写入。 | 追随者1、追随者2确认,领导者响应。 | |
消息的持久性和有序性: | 由于消息已成功写入 ISR 中的足够数量的追随者,可以确保消息的持久性。 | 消息A被持久化,即使领导者宕机,ISR 中的副本可以被选为新的领导者,从而保证消息的持久性。 |
由于等待 ISR 中的追随者确认,保证了消息的有序性。领导者会按照消息写入的顺序等待确认,以确保整个分区的消息顺序性。 | 领导者需要等待一定数量的追随者确认后才能继续处理下一条消息。这确保了消息在分区内的有序存储。 |
追随者的管理
在线(心跳表现 | ISR中)
宕机(心跳表现 | ISR中)
滞后(心跳表现 | ISR中)
滞后主要指的是追随者在处理消息时相对于领导者的位置较远,即它的日志文件中的消息相对较旧。这是通过追随者的日志文件中的偏移量(offset)来衡量的。
读操作的响应
故障转移
日志清理