监控 Kafka 集群的可靠性

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

概览

可靠性是指系统在一段时间内正确、持续运行的能力。对于基于 Kafka 的工作负载,可靠性不仅包括 Kafka 集群本身,还包括生成和使用消息的客户端应用。

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

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

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

集群容量

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

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

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

  • 分区数。尽量使每个代理的分区数少于 4,000 个,每个集群的分区数少于 100,000 个。

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

  • 增加集群的 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}]
)
broker 磁盘利用率
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),则存在严重的数据丢失和可用性风险。通常,这种情况是由一个或多个代理的容量不足或基础设施故障引起的。

  • 复制不足的分区。当同步副本的数量低于复制因子时,分区就会出现副本不足的情况。如果某个分区在数十分钟内一直处于复制不足的状态,则可能存在代理、存储容量或其他方面的问题。

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

下表显示了可用于监控复制的 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}]
  )
)

后续步骤