监控 Kafka 集群的可靠性

本文档介绍了如何监控 Managed Service for Apache Kafka 集群,以确保 Kafka 工作负载的可靠性。

概览

可靠性是指系统在一段时间内正确且一致地执行操作的能力。对于基于 Kafka 的工作负载,可靠性包括 Kafka 集群本身以及生成和使用消息的客户端应用。

Managed Service for Apache Kafka 旨在容忍许多常见故障并从中恢复。例如,该服务会将副本放置在不同的可用区中以实现容错,并自动重启发生故障的代理。 但是,影响可靠性的其他因素不在该服务的直接控制范围内,例如:

  • 客户端配置
  • 集群上的负载,包括平均负载和峰值
  • 分区和副本的数量
  • 主题配置,例如 消息保留

为了实现可靠的操作,请务必监控集群的这些运行参数,并将其保持在建议的范围内。以下部分介绍了一些对可靠性至关重要的关键指标。

集群容量

为避免集群过载,请监控以下信号。创建 提醒,以便在这些信号长时间超出 建议范围时通知您。

  • CPU 利用率 。尽量将所有代理的 CPU 利用率保持在 80% 以下。

  • 代理磁盘利用率:确保代理磁盘利用率保持在 80% 以下。

  • 分区数 。尽量将每个代理的分区数保持在 4000 个以下,并将每个集群的分区数保持在 10 万个以下。

如果集群容量不足,请考虑以下缓解措施:

  • 增加集群的 vCPU 数量。如需了解详情,请参阅 更新 Kafka 集群

  • 扩容集群以添加更多代理。如需了解该 服务如何预配代理,请参阅 代理预配

下表显示了这些指标的 Prometheus 查询语言 (PromQL) 查询 ,您可以将其添加到自定义 Cloud Monitoring 信息中心

信号PromQL 查询
CPU 利用率
rate(
  {
    "managedkafka.googleapis.com/cpu/core_usage_time",
    monitored_resource="managedkafka.googleapis.com/Cluster"
  }[${__interval}]
)
/ min_over_time(
  {
    "managedkafka.googleapis.com/cpu/limit",
    monitored_resource="managedkafka.googleapis.com/Cluster"
  }[${__interval}]
)
代理磁盘利用率
max_over_time(
  {
    "managedkafka.googleapis.com/disk/used_bytes",
    monitored_resource="managedkafka.googleapis.com/Cluster"
  }[${__interval}]
)
/ min_over_time(
  {
    "managedkafka.googleapis.com/disk/limit",
    monitored_resource="managedkafka.googleapis.com/Cluster"
  }[${__interval}]
)
每个分区的段大小
# Assumes that segment files are 225 MiB. Check your cluster configuration.
2*225*(1024*1024) * max_over_time(
  {
    "managedkafka.googleapis.com/partitions",
    monitored_resource="managedkafka.googleapis.com/Cluster"
  }[${__interval}]
)
/ min_over_time(
  {
    "managedkafka.googleapis.com/disk/limit",
    monitored_resource="managedkafka.googleapis.com/Cluster"
  }[${__interval}]
)
每个代理的分区数
max by (resource_container, location, cluster_id, broker_index) (
  max_over_time(
    {
      "managedkafka.googleapis.com/partitions",
      monitored_resource="managedkafka.googleapis.com/Cluster"
    }[${__interval}]
  )
)
每个集群的分区数
max by (resource_container, location, cluster_id) (
  max_over_time(
    {
      "managedkafka.googleapis.com/partitions",
      monitored_resource="managedkafka.googleapis.com/Cluster"
    }[${__interval}]
  )
)

分区不平衡

负载不均可能会导致 Kafka 集群无法正常处理客户端请求。 分配给单个代理的分区数应保持在每个代理的平均分区数的 10% 左右。查找此指标中的离群值。

如需保持分区平衡,请考虑在集群扩容时启用 自动重新平衡

下表显示了可用于监控分区不平衡的 PromQL 查询。

信号PromQL 查询
每个代理的分区数
sum by (resource_container, location, cluster_id, broker_index) (
  avg_over_time(
    {
      "managedkafka.googleapis.com/partitions",
      monitored_resource="managedkafka.googleapis.com/Cluster"
    }[${__interval}]
  )
)
分区不平衡
sum by (resource_container, location, cluster_id, broker_index) (
  avg_over_time(
    {
      "managedkafka.googleapis.com/partitions",
      monitored_resource="managedkafka.googleapis.com/Cluster"
    }[${__interval}]
  )
)
/ on (resource_container, location, cluster_id)
  group_left avg by (resource_container, location, cluster_id) (
  avg_over_time(
    {
      "managedkafka.googleapis.com/partitions",
      monitored_resource="managedkafka.googleapis.com/Cluster"
    }[${__interval}]
  )
) - 1

分区复制

数据复制对于确保工作负载具有容错能力至关重要。 在运行正常的集群中,主题中的每个分区都具有完整数量的 副本,具体取决于主题的配置 复制因子

使用以下信号监控分区复制:

  • 同步副本 (ISR) 数低于下限 。如果某个分区的同步 ISR 数少于配置的下限 (min.insync.replicas), 则存在严重的数据丢失和可用性风险。通常,这种情况是由一个或多个代理的容量不足或基础架构故障造成的。

  • 复制的分区不足 。当同步副本数低于复制因子时,分区复制不足。如果某个分区在 10 分钟内仍复制不足,则可能是代理、存储容量或其他方面存在问题。

    在滚动重启期间,代理会在重启时变得不可用,从而导致暂时复制不足。这种情况是正常的,无需干预。

下表显示了可用于监控复制的 PromQL 查询。

信号PromQL 查询
ISR 数低于下限
max by (
  resource_container,
  location,
  cluster_id
) (
  max_over_time(
    {
      "managedkafka.googleapis.com/broker/under_min_isr_partitions",
      monitored_resource="managedkafka.googleapis.com/Cluster"
    }[${__interval}]
  )
)
复制不足
max by (
  resource_container,
  location,
  cluster_id
) (
  min_over_time(
    {
      "managedkafka.googleapis.com/broker/under_replicated_partitions",
      monitored_resource="managedkafka.googleapis.com/Cluster"
    }[10m:${__interval}]
  )
)

后续步骤