文档抄袭者

153 阅读3分钟

在 Apache Kafka 中,“高水位”(High Watermark,简称 HWM)是一个关键概念,它涉及到消息的持久性和可读性。以下是对 Kafka 高水位的详细解释:

什么是高水位(High Watermark)?

高水位(High Watermark)是 Kafka 中的一个概念,用来表示一个分区中所有副本的同步进度。具体来说,高水位指的是在 Kafka 分区中,所有同步副本(In-Sync Replicas, ISR)都确认接收到并持久化的最高消息位点。

高水位的作用

  1. 消息的可见性

    • 可读性:生产者将消息写入 Kafka 分区的 Leader 副本。高水位表示所有同步副本都已经接收了这些消息。消费者只能读取到高水位以下的消息。也就是说,只有在高水位以下的消息才是被所有同步副本持久化的,因此是可靠的。
    • 保证一致性:高水位确保了所有同步副本都具备了一致的数据视图。只有当高水位被更新,消费者才会看到新的消息。
  2. 数据丢失的保护

    • 副本同步:高水位保证了即使 Leader 副本发生故障,新的 Leader 副本也能从 ISR 中选择,以避免数据丢失。因为高水位代表了所有同步副本持久化的数据,Leader 失败后可以从 ISR 中恢复数据。

高水位的更新机制

  1. 生产者写入

    • 当生产者向分区的 Leader 副本写入消息时,Leader 副本会将这些消息记录到日志中并将其发送到 ISR 中的所有 Follower 副本。
    • Leader 副本会定期将高水位更新到当前已成功写入的最新消息位置。
  2. 副本同步

    • 各个 Follower 副本从 Leader 副本同步消息。当 Follower 副本接收到消息并持久化后,它会向 Leader 副本发送确认消息。
    • Leader 副本在收到所有同步副本的确认后,会更新高水位。
  3. 高水位的影响因素

    • ISR 列表:只有在 ISR 列表中的副本会影响高水位的更新。如果某个副本掉出 ISR,它不会影响高水位。
    • 网络延迟和性能:如果 Follower 副本的网络延迟较大或性能不佳,它可能无法及时追赶上 Leader 副本,影响高水位的更新。

高水位的配置参数

在 Kafka 中,有几个参数与高水位有关:

  1. replica.lag.time.max.ms

    • 这个参数定义了副本滞后被认为过期的时间。如果某个副本滞后时间超过了这个值,它可能会从 ISR 列表中被移除。
  2. min.insync.replicas

    • 这个参数定义了一个分区中至少需要有多少个副本(包括 Leader)处于同步状态,以确保消息写入操作被认为是成功的。如果同步副本数量低于这个值,生产者的写入操作会失败。

监控高水位

可以使用 Kafka 提供的工具和命令来监控高水位,如 kafka-run-class.sh kafka.tools.GetOffsetShell,以及在 Kafka 监控工具中查看分区的高水位和当前最新偏移量。

总结

高水位(High Watermark)是 Kafka 中用于表示分区中所有同步副本的最新消息进度的一个关键概念。它确保了消息的一致性和持久性,使得即使在副本失败的情况下,数据也不会丢失。高水位通过与副本同步机制密切配合,保证了 Kafka 消息系统的高可用性和可靠性。