1. Kafka 的 ISR 是什么概念?
答案:ISR(In-Sync Replicas,同步副本集)是 Kafka 中与分区副本相关的核心概念。它指的是与 Leader 副本保持同步状态的副本集合(包括 Leader 自身)。判断一个 Follower 副本是否在 ISR 中,主要依据其是否能在配置的 replica.lag.time.max.ms(默认 30 秒)内跟上 Leader 的进度(即同步消息的 offset 差距在允许范围内)。ISR 是 Kafka 保证数据可靠性的关键——当生产者配置 acks=all 时,消息需被 ISR 中所有副本确认同步后,才算发送成功;且 Leader 故障时,新 Leader 只会从 ISR 中选举,确保数据不丢失。
2. Kafka 集群在 CAP 理论中属于 AP 还是 CP?
答案:Kafka 在 CAP 理论中更倾向于 AP(可用性 + 分区容错性),但通过配置可向 CP 倾斜。
- 正常情况下,Kafka 优先保证可用性和分区容错性:集群节点故障时,分区 Leader 会快速从 ISR 中重新选举,避免服务中断(可用性),同时允许节点间网络分区时继续提供服务(分区容错性)。
- 若配置
min.insync.replicas(最小同步副本数)大于 1 且acks=all,则会增强一致性(CP 倾向):此时消息需被更多副本确认,牺牲部分可用性(如 ISR 副本不足时无法写入消息)以保证数据一致性。
3. Kafka 一个分区可以被不同消费组的用户同时订阅吗?
答案:可以。Kafka 中,一个分区的数据可以被多个不同的消费组同时订阅和消费,且各消费组的消费进度(offset)相互独立,互不影响。例如,消费组 A 和消费组 B 可同时订阅同一分区,A 消费到 offset=100 时,B 可能刚消费到 offset=50,两者的进度各自维护。
4. 若 A 消费组已消费某分区的 10 条消息,B 消费组之后才订阅该分区,B 能消费到 A 之前消费的消息吗?
答案:能。Kafka 中消费组的消费进度是独立存储的(通过 __consumer_offsets 主题保存),新订阅的消费组 B 不会受 A 消费组的影响。B 可以通过配置 auto.offset.reset 参数(如 earliest)回溯消费 A 已消费过的消息(从分区起始 offset 开始),或从最新消息开始消费(latest)。
5. Kafka 消息默认保留多久?
答案:Kafka 消息默认保留时间为 7 天(168 小时),该配置由 log.retention.hours 控制(默认值 168)。此外,消息保留还可能受磁盘空间限制(log.retention.bytes,默认无限制),当分区日志大小超过该值时,旧消息会被删除。用户可根据需求在 broker 或主题级别修改保留策略(如缩短保留时间以节省磁盘,或延长时间支持历史数据回溯)。
6. Kafka 中 earliest 和 latest 所谓的“最新消息”,是指没有被其他消费组消费过的吗?
答案:不是。earliest 和 latest 是新消费组(无历史 offset 记录时)的 offset 重置策略,其判断依据是 分区的物理消息 offset,与其他消费组是否消费过无关:
-
earliest:从分区最早的消息(offset=0 或起始位置)开始消费; -
latest:从分区当前最新的消息(最大 offset 位置)开始消费,但是分区里面可能存在多条没有被消费的数据。
7. 若消息已被其他消费组消费过,但仍是当前最大 offset(最新消息),配置 latest 的新消费组能消费到这条消息吗?
答案:能。latest 指向的是分区当前的最大 offset(最新写入的消息),无论该消息是否被其他消费组消费过,只要它是当前最大 offset,新消费组配置 latest 时就会从这条消息开始消费(若之后没有新消息写入,会直接消费这条)。例如:分区最新消息 offset=100,已被消费组 A 消费,新消费组 B 配置 latest 后,会从 offset=100 开始消费这条消息。
8. Kafka 中 latest 指向的“最新消息”是否只有一条?
答案:不是。latest 本质上是一个“位置标记”(指向分区当前最大 offset),而非单条消息。当新消费组以 latest 启动时,它会从这个位置开始消费后续所有新写入的消息,而非仅消费“一条最新消息”。例如:当前最大 offset=100,新消费组启动后,若有新消息写入(offset=101、102…),都会被该消费组依次消费。
9. Kafka 的 acks 机制是什么流程?
答案:acks 是 Kafka 生产者的重要配置,用于控制消息发送的确认机制,决定生产者何时认为消息“发送成功”,流程如下:
-
acks=0:生产者发送消息后立即认为成功,不等待任何确认(性能最高,可靠性最低,可能丢失消息)。 -
acks=1:仅等待分区 Leader 副本写入消息后确认(默认值)。若 Leader 写入后未同步给 Follower 就崩溃,消息可能丢失(平衡性能与可靠性)。 -
acks=all(或-1):等待 ISR 中所有副本(包括 Leader 和 Follower)都写入消息后确认(可靠性最高,性能最差)。只要 ISR 中有至少一个副本存活,消息就不会丢失。
10. Kafka 的副本同步机制是怎样的?
答案:Kafka 采用“Leader 主导 + Follower 拉取”的副本同步机制,核心流程如下:
- 副本角色:每个分区有一个 Leader 副本(处理读写请求)和多个 Follower 副本(仅同步 Leader 数据,不直接服务客户端)。
- 同步触发:Follower 定期向 Leader 发送“拉取请求”(包含自身已同步的最大 offset),主动请求同步数据。
- 数据传输:Leader 收到请求后,将 Follower 缺失的消息(从 Follower 的 offset+1 到 Leader 最新 offset)批量返回给 Follower。
-
状态维护:Follower 接收消息并写入本地日志,更新自身 offset;Leader 跟踪所有 Follower 的同步进度,将保持同步(在
replica.lag.time.max.ms内跟上)的 Follower 纳入 ISR。 - 故障处理:若 Leader 故障,从 ISR 中选举新 Leader;若 Follower 同步延迟超期,被移出 ISR(成为 OSR),但仍会继续尝试同步。
11. 被移出 ISR 的 Follower 已不在同步副本集,为何还能重新追上 Leader 进度并加入 ISR?
答案:被移出 ISR 的 Follower(OSR)并未停止同步行为,而是“暂时失去同步资格”,具体原因如下:
- 持续同步:OSR 仍会定期向 Leader 发送拉取请求,携带自身当前 offset,请求同步缺失的消息(同步机制未中断)。
- 追上进度:当导致延迟的问题(如网络恢复、负载降低)解决后,Follower 会通过批量拉取消息逐步缩小与 Leader 的 offset 差距,直至持平。
-
重新加入条件:若 Follower 能持续与 Leader 同步(offset 差距在允许范围内)且稳定时间超过
replica.lag.time.max.ms,Leader 会将其重新纳入 ISR。
这种设计保证了副本集的可恢复性,避免因临时故障永久剔除副本。
12. 被移出 ISR 的 Follower 会继续同步数据吗?是否还参与 acks 确认?
答案:被移出 ISR 的 Follower 状态为“有同步行为,但无确认资格”:
- 继续同步:OSR 会持续从 Leader 拉取数据,更新自身 offset(否则无法重新加入 ISR),目的是维持副本的潜在可用性。
-
不参与
acks确认:当生产者配置acks=all时,仅 ISR 中的副本需确认同步,OSR 即使已同步消息也不计入确认条件(避免其同步能力不足拖累性能)。 -
回归后恢复资格:重新加入 ISR 后,该 Follower 会再次参与
acks=all的确认流程,需同步成功后生产者才会收到确认。
13. kafka的高位水位是什么概念?
答案:
Kafka 中的 高位水位(High Watermark,简称 HW) 是用于标记分区中“已完成同步的消息边界”的核心机制,确保消费者只能消费到所有副本都已同步的消息,避免数据不一致。
具体说明:
-
定义
高位水位是一个偏移量(offset),代表分区中所有副本(包括 Leader 和 ISR 中的 Follower)都已成功同步的消息的最大位置。对于消费者而言,只能消费到 HW 以下(offset 小于 HW)的消息,HW 及以上的消息视为“未完成同步”,暂不可见。 -
作用
- 保证数据一致性:确保消费者不会读取到“仅 Leader 已写入但 Follower 未同步”的消息(若 Leader 此时崩溃,这些消息可能丢失)。
- 隔离未同步数据:Leader 中可能存在已写入但尚未同步到 Follower 的消息(称为“不稳定消息”),HW 以下的消息则是“稳定消息”(所有 ISR 副本均已同步)。
-
更新机制
- Leader 副本会维护 HW,初始值为 0。
- 当 Follower 向 Leader 同步消息并成功写入本地日志后,会向 Leader 反馈自己的最新 offset。
- Leader 收集所有 ISR 副本的最新 offset,取其中的最小值作为新的 HW(确保所有副本都已同步到该位置)。
-
与消息可见性的关系
- 假设 Leader 中已有消息 offset 0~10,ISR 中的 Follower 最新同步到 offset 8,则 HW 为 8。
- 消费者只能消费 offset 0~7 的消息(HW 以下),offset 8~10 的消息暂不可见(需等待 Follower 同步到 10 后,HW 提升至 10,这些消息才会开放消费)。
-
与 LEO 的区别
- LEO(Log End Offset):每个副本(包括 Leader 和 Follower)自身的日志末端偏移量,代表该副本已写入的最新消息位置(可能包含未同步的不稳定消息)。
- HW:所有 ISR 副本的 LEO 的最小值,是全局可见的稳定消息边界。
总结:
高位水位(HW)是 Kafka 保障数据可靠性的关键机制,通过定义“所有副本已同步的消息边界”,确保消费者只能访问到稳定可靠的数据,避免因副本同步延迟或 Leader 故障导致的消息丢失或不一致。
14.消费者每一次消费成功之后,都会变更分区的 offset 吗?
答案:
不一定。消费者消费成功后是否变更分区的offset,取决于其提交方式和配置策略,具体可分为以下情况:
-
自动提交(默认配置)
若消费者开启了自动提交(enable.auto.commit=true),则会按照设定的时间间隔(auto.commit.interval.ms,默认5秒)批量提交offset,而非每消费一次就立即变更。- 例如:消费者在10秒内连续消费了10条消息,可能仅在第5秒和第10秒各提交一次offset,而非每条消息消费后都提交。
-
手动提交
若关闭自动提交(enable.auto.commit=false),则需通过代码手动提交offset(如commitSync()或commitAsync())。此时:- 若每次消费成功后立即手动提交,则offset会随每次消费更新;
- 若批量消费后统一提交(如消费10条后提交一次),则offset仅在批量提交时更新,中间的单次消费不会实时变更。
-
特殊场景
- 若消费过程中发生异常(如消费者崩溃),且未提交offset,则下次重启后会从上次提交的offset继续消费,相当于offset未变更;
- 部分业务可能故意延迟提交offset(如确保消息被业务处理完成后再提交),此时消费成功与offset变更存在时间差。
综上,消费成功与offset变更并非严格一一对应,而是由提交策略决定是否实时或批量更新。











网友评论