이 문서에서는 Managed Service for Apache Kafka 클러스터를 모니터링하여 Kafka 워크로드의 안정성을 보장하는 방법을 설명합니다.
개요
안정성 은 시스템이 시간이 지남에 따라 올바르고 일관되게 실행되는 기능입니다. Kafka 기반 워크로드의 경우 안정성은 Kafka 클러스터 자체와 메시지를 생성하고 사용하는 클라이언트 애플리케이션을 모두 포함합니다.
Managed Service for Apache Kafka는 여러 일반적인 장애를 허용하고 복구하도록 설계되었습니다. 예를 들어 서비스는 내결함성을 위해 복제본을 서로 다른 영역에 배치하고 실패한 브로커를 자동으로 다시 시작합니다. 그러나 안정성에 영향을 미치는 다른 요인은 다음과 같이 서비스의 직접적인 제어 범위를 벗어납니다.
- 클라이언트 구성
- 평균 부하 및 급증을 포함한 클러스터의 부하
- 파티션 및 복제본 수
- 메시지 보관과 같은 주제 구성
안정적인 작업을 달성하려면 이러한 운영 매개변수에 대해 클러스터를 모니터링하고 권장 범위 내로 유지하는 것이 중요합니다. 다음 섹션에서는 안정성에 중요한 몇 가지 주요 측정항목을 설명합니다.
클러스터 용량
클러스터에 과부하가 걸리지 않도록 하려면 다음 신호를 모니터링하세요. 권장 범위를 벗어나는 경우 알림을 생성하여 알림을 받으세요.
CPU 사용률. 모든 브로커에서 CPU 사용률을 80% 미만으로 유지하세요.
브로커 디스크 사용률: 브로커 디스크 사용률이 80% 미만으로 유지되는지 확인합니다.
파티션 수. 브로커당 4,000개 미만의 파티션과 클러스터당 100,000개 미만의 파티션을 유지하세요.
클러스터의 용량이 부족한 경우 다음 완화 방법을 고려하세요.
클러스터의 vCPU 수를 늘립니다. 자세한 내용은 Kafka 클러스터 업데이트를 참조하세요.
클러스터를 확장하여 브로커를 더 추가합니다. 서비스에서 브로커를 프로비저닝하는 방법에 대한 자세한 내용은 브로커 프로비저닝을 참조하세요.
다음 표에서는 커스텀 Cloud Monitoring 대시보드에 추가할 수 있는 이러한 측정항목의 Prometheus 쿼리 언어 (PromQL) 쿼리 를 보여줍니다.
| 신호 | 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) 미만. 파티션에 구성된 최소값 (
min.insync.replicas)보다 동기화 ISR이 적으면 데이터 손실 및 가용성 위험이 심각합니다. 일반적으로 이 상황은 하나 이상의 브로커의 용량이 부족하거나 인프라 장애로 인해 발생합니다.복제된 파티션 부족. 동기화 복제본 수가 복제 계수 아래로 떨어지면 파티션이 복제되지 않습니다. 파티션이 수십 분 동안 복제되지 않은 상태로 유지되면 브로커, 스토리지 용량 또는 다른 문제가 있을 수 있습니다.
롤링 재시작 중에 브로커가 다시 시작되면서 일시적으로 복제되지 않게 됩니다. 이 상황은 예상되며 개입이 필요하지 않습니다.
다음 표에서는 복제를 모니터링하는 데 사용할 수 있는 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}] ) ) |