Haru Utils

STREAM BACKLOG

Kafka consumer lag·rebalance 장애

consumer group의 CURRENT-OFFSET·LOG-END-OFFSET·LAG·active member와 partition 편중, broker·application 처리율을 구분하고 offset reset의 중복·유실 위험을 차단하며 복구합니다.
Kafka consumer lagkafka-consumer-groupsconsumer group rebalanceCURRENT-OFFSET LOG-END-OFFSEToffset reset dry runKafka partition lag
환경Apache Kafka 4.3 CLI · 인증 설정 파일 0600 · Java 또는 기타 consumer client
분류서비스
검토일2026-09-04
진행5단계 · 조회 우선

SAFE OPERATING BOUNDARY

중단·복구 기준부터 확인하세요

STOP CONDITIONS

여기서는 멈추세요

  • bootstrap cluster·consumer group·topic·command config와 현재 운영 소유자를 확정하지 못했다면 변경하지 않습니다.
  • consumer group이 active이거나 current offset export·dry-run·중복·유실 승인 중 하나라도 없으면 offset reset을 실행하지 않습니다.
  • message payload·SASL secret·개인정보가 로그·명령·export에 포함되면 수집을 중단하고 최소 범위·0600·마스킹을 적용합니다.
ROLLBACK

복구 기준

consumer code·설정·instance 변경은 이전 정상 release로 되돌립니다. offset 변경은 0600으로 보관한 current-offsets.csv를 대상으로 group을 완전히 멈추고 dry-run 결과와 중복 처리 범위를 다시 승인한 뒤에만 복원합니다. 이미 처리한 외부 side effect와 건너뛴 message는 offset만 되돌려 복원되지 않으므로 idempotency key·재처리·업무 보정 절차가 필요합니다.

ESCALATION PACK

담당자에게 전달할 자료

  • partition별 CURRENT-OFFSET·LOG-END-OFFSET·LAG 시계열과 group state·member assignment
  • topic partition·leader·ISR, consumer version·config diff와 제한된 rebalance·commit 오류
  • 처리율·poll latency·GC·downstream latency, offset dry-run/export checksum과 변경 전후 업무 건수
2026년 9월 4일 기준 공식 upstream 문서와 현재 지원 명령을 대조했습니다. 먼저 최소 범위 읽기 전용 조회로 사실을 확인하고, 변경은 영향·백업·복구 경로와 담당자 승인을 확보한 대상에만 적용합니다. <...> 자리표시자는 승인된 리터럴 값으로 직접 치환하며 외부 입력으로 shell 명령을 조립하거나 eval하지 않습니다.

BEFORE YOU START

이런 증상에서 시작합니다

  • consumer group의 LAG가 지속 증가하고 처리 지연이 커짐
  • consumer member가 반복적으로 바뀌고 rebalance 로그가 증가함
  • 일부 partition만 lag가 크고 나머지는 0에 가까움
  • offset out of range 또는 committed offset 없음 오류가 발생함

CHECK THE BRANCH

놓치기 쉬운 원인 분기

01

LOG-END-OFFSET 증가가 소비 처리율보다 빠른 경우

producer 유입 급증과 consumer의 정상 처리 용량 차이입니다. partition 수·member 수·처리 비용·downstream 한계를 함께 계산하고 무조건 instance만 늘리지 않습니다.

02

member·assignment가 반복해서 바뀌는 경우

처리 시간이 max.poll.interval.ms를 넘거나 heartbeat·network·GC pause·배포 불안정으로 rebalance가 반복될 수 있습니다. timeout만 늘려 처리 정지를 숨기지 않습니다.

03

특정 partition만 lag가 큰 경우

hot key·partition skew, 해당 leader broker·disk·network 문제 또는 poison message를 확인합니다. consumer 수가 partition 수를 넘으면 추가 instance는 처리량을 늘리지 못합니다.

04

offset reset을 검토하는 경우

group을 완전히 비활성화하고 현재 offset을 export한 뒤 dry-run 결과와 업무 중복·유실 범위를 승인해야 합니다. latest 이동은 미처리 메시지를 건너뛸 수 있습니다.

FOLLOW THE FLOW

순서대로 확인하기

1
조회시스템을 변경하지 않는 확인 단계

group lag·partition·active member 확인

인증정보는 0600 command config 파일로 전달하고 명령행에 password를 넣지 않습니다. 장애 시각의 offset과 active member를 같은 시점에 기록합니다.

credential 파일 권한
stat -Lc '%a %U:%G %n' <KAFKA_COMMAND_CONFIG>
offset·lag
<KAFKA_HOME>/bin/kafka-consumer-groups.sh --bootstrap-server <BOOTSTRAP_SERVERS> --command-config <KAFKA_COMMAND_CONFIG> --describe --group <CONSUMER_GROUP>
group state
<KAFKA_HOME>/bin/kafka-consumer-groups.sh --bootstrap-server <BOOTSTRAP_SERVERS> --command-config <KAFKA_COMMAND_CONFIG> --describe --group <CONSUMER_GROUP> --state
member assignment
<KAFKA_HOME>/bin/kafka-consumer-groups.sh --bootstrap-server <BOOTSTRAP_SERVERS> --command-config <KAFKA_COMMAND_CONFIG> --describe --group <CONSUMER_GROUP> --members --verbose
결과 읽기

LAG는 partition별 LOG-END-OFFSET과 CURRENT-OFFSET 차이이며 단일 순간값보다 증가율이 중요합니다. member 수·assignment·state와 함께 봅니다.

다음 판단

lag가 집중된 topic·partition의 leader와 topic 구성을 확인합니다.

2
조회시스템을 변경하지 않는 확인 단계

topic partition·leader·broker 상태 확인

topic partition 수, leader·ISR와 hot partition을 비교합니다. 전체 cluster metadata를 외부로 공유하지 않습니다.

topic 상세
<KAFKA_HOME>/bin/kafka-topics.sh --bootstrap-server <BOOTSTRAP_SERVERS> --command-config <KAFKA_COMMAND_CONFIG> --describe --topic <TOPIC>
consumer offset 재측정
<KAFKA_HOME>/bin/kafka-consumer-groups.sh --bootstrap-server <BOOTSTRAP_SERVERS> --command-config <KAFKA_COMMAND_CONFIG> --describe --group <CONSUMER_GROUP> --offsets
broker API 연결
<KAFKA_HOME>/bin/kafka-broker-api-versions.sh --bootstrap-server <BOOTSTRAP_SERVERS> --command-config <KAFKA_COMMAND_CONFIG>
결과 읽기

leader·ISR 이상과 같은 partition lag가 일치하면 broker·replication 문제를 먼저 해결합니다. 모든 partition lag가 비슷하면 consumer 처리 용량·downstream을 우선 봅니다.

다음 판단

consumer 로그·GC·처리 시간·downstream latency를 확인합니다.

3
조회시스템을 변경하지 않는 확인 단계

consumer 처리율·rebalance·downstream 원인 확인

애플리케이션 로그와 metrics에서 poll, processing, commit, rebalance, error와 downstream 지연을 확인합니다. message payload는 수집하지 않습니다.

consumer service 상태
systemctl status <CONSUMER_SERVICE>.service --no-pager -l
systemctl show <CONSUMER_SERVICE>.service -p MainPID -p NRestarts -p MemoryCurrent -p MemoryPeak
오류·rebalance 로그
journalctl -u <CONSUMER_SERVICE>.service --since '<INCIDENT_START>' --until '<INCIDENT_END>' --no-pager | grep -Ei -C 4 'rebalance|max.poll|commit|offset|timeout|exception|error'
message key·value, token, 고객 데이터는 보존·공유하지 않습니다.
host pressure
free -h
cat /proc/pressure/cpu
cat /proc/pressure/memory
cat /proc/pressure/io
downstream health
curl -fsS --connect-timeout 3 <APPROVED_DOWNSTREAM_HEALTH_URL>
인증정보를 URL에 넣지 않고 제한된 health endpoint만 사용합니다.
결과 읽기

poll loop 정지·GC pause·처리 시간 증가·commit 실패·downstream 포화를 lag 증가 시각과 비교합니다. rebalance 횟수만으로 원인을 단정하지 않습니다.

다음 판단

consumer 설정과 partition·instance·업무 idempotency 경계를 검토합니다.

4
주의서버 부하나 권한을 고려할 단계

설정·배포·offset 변경 전 안전성 검토

group.id, subscription, assignor, poll·session timeout, auto commit, instance 수를 source control에서 검토합니다. offset reset은 group 비활성·export·dry-run·업무 승인 없이는 금지합니다.

배포 config diff
git -C <CONSUMER_REPOSITORY> diff <LAST_GOOD_REVISION> -- <CONSUMER_CONFIG_PATH>
현재 offset export 계획
install -d -m 0700 <APPROVED_BACKUP_DIR>
umask 077
<KAFKA_HOME>/bin/kafka-consumer-groups.sh --bootstrap-server <BOOTSTRAP_SERVERS> --command-config <KAFKA_COMMAND_CONFIG> --reset-offsets --group <CONSUMER_GROUP> --all-topics --to-current --export > <APPROVED_BACKUP_DIR>/current-offsets.csv
chmod 0600 <APPROVED_BACKUP_DIR>/current-offsets.csv
default는 offset 변경이 아닌 계획 표시·export입니다. group·topic 이름도 내부 식별정보이므로 파일 접근을 제한합니다.
검토된 reset 계획 dry-run
<KAFKA_HOME>/bin/kafka-consumer-groups.sh --bootstrap-server <BOOTSTRAP_SERVERS> --command-config <KAFKA_COMMAND_CONFIG> --reset-offsets --group <CONSUMER_GROUP> --from-file <REVIEWED_OFFSET_PLAN.csv> --dry-run
consumer instances가 모두 inactive이고 중복 처리·유실 범위를 업무 담당자가 승인한 예외 상황에서만 검토합니다.
결과 읽기

consumer scaling은 partition 수와 downstream 여유까지만 효과가 있습니다. offset 이동은 처리량 문제가 아니라 위치 변경이며 데이터 중복·유실을 일으킬 수 있습니다.

다음 판단

코드·용량·downstream 복구 또는 승인된 offset 계획 중 원인에 맞는 하나를 선택합니다.

5
변경데이터·서비스 상태가 달라질 수 있는 단계

승인된 consumer 복구 또는 offset 적용 후 검증

일반 장애는 검증된 consumer release·instance 수·설정을 배포합니다. offset reset은 group inactive, 0600 export, dry-run, 업무 보정 계획을 모두 충족한 별도 분기에서만 실행합니다.

변경 단계입니다. 실행 전 대상 이름과 경로, 서비스 중단 영향, 복구 방법을 다시 확인하세요.
A. 검증된 consumer release 재시작
sudo systemctl restart <CONSUMER_SERVICE>.service
systemctl status <CONSUMER_SERVICE>.service --no-pager -l
코드·설정·downstream 원인을 수정하고 message 처리가 idempotent인지 확인한 뒤 실행합니다.
B. 승인된 offset plan 실행
<KAFKA_HOME>/bin/kafka-consumer-groups.sh --bootstrap-server <BOOTSTRAP_SERVERS> --command-config <KAFKA_COMMAND_CONFIG> --reset-offsets --group <CONSUMER_GROUP> --from-file <REVIEWED_OFFSET_PLAN.csv> --execute
consumer group이 완전히 inactive이고 정확한 CSV·중복·유실 범위·업무 보정·복구 current-offsets.csv를 승인한 경우에만 실행합니다. --to-latest를 편의상 사용하지 않습니다.
lag·member 재검증
<KAFKA_HOME>/bin/kafka-consumer-groups.sh --bootstrap-server <BOOTSTRAP_SERVERS> --command-config <KAFKA_COMMAND_CONFIG> --describe --group <CONSUMER_GROUP>
<KAFKA_HOME>/bin/kafka-consumer-groups.sh --bootstrap-server <BOOTSTRAP_SERVERS> --command-config <KAFKA_COMMAND_CONFIG> --describe --group <CONSUMER_GROUP> --members --verbose
서비스·업무 검증
systemctl show <CONSUMER_SERVICE>.service -p NRestarts -p ExecMainStatus
curl -fsS <APPROVED_CONSUMER_HEALTH_URL>
결과 읽기

lag 증가율이 음수로 전환되고 rebalance·commit error가 안정화되며 downstream과 업무 처리 정확성이 유지돼야 합니다. 단순 lag 0만으로 성공을 판단하지 않습니다.

다음 판단

코드·설정은 이전 release로 되돌립니다. offset은 0600 current-offsets.csv를 from-file로 dry-run하고 group inactive·업무 승인 뒤에만 복원하며, 이미 처리·건너뛴 message는 자동으로 원복되지 않으므로 idempotency와 보정 작업을 적용합니다.

PRIMARY REFERENCES

공식 문서

배포판과 버전에 따라 옵션·로그 위치가 다를 수 있습니다. 실행 전 서버의 --help와 로컬 매뉴얼을 함께 확인하세요.

도구 빠른 검색

최근 사용한 도구를 다시 열거나, 이름과 기능으로 검색하세요.

검색어와 도구의 입력·결과는 저장하지 않습니다.

↑↓ 이동 · Enter 열기 · Esc 닫기