빠른참조 · CLI
CLI 치트시트
도구 이름이 아니라 하고 싶은 일로 찾도록 구성했습니다.
아래 검색창에 "lag", "오프셋", "리더" 같은 말을 넣으면 해당 행만 남습니다.
모든 명령은 --bootstrap-server 기준이며, 이 페이지의 명령은
Apache Kafka 4.3.1 공식 문서와 bin/ 스크립트로 확인했습니다.
이 페이지 쓰는 법
시작 전 — 배포 파일명 읽는 법
curl -O https://archive.apache.org/dist/kafka/4.3.1/kafka_2.13-4.3.1.tgz
tar -xzf kafka_2.13-4.3.1.tgz
cd kafka_2.13-4.3.1
# 이후 이 페이지의 모든 명령은 이 디렉터리에서 bin/ 아래를 호출합니다
bin/kafka-topics.sh --version
목적별 명령 표
$BS는 localhost:9092(브로커),
$BC는 localhost:9093(컨트롤러)로 읽으세요.
전체 명령은 각 분류 아래의 복붙용 블록에 있습니다.
| 분류 | 하고 싶은 것 | 명령 | 메모 |
|---|---|---|---|
| 클러스터 준비 | 클러스터 UUID 생성 | kafka-storage.sh random-uuid | KRaft 부트스트랩의 첫 단계 |
| 클러스터 준비 | 단일 노드 로그 디렉터리 포맷 | kafka-storage.sh format --standalone -t $ID -c … | --standalone은 1노드 쿼럼 |
| 클러스터 준비 | 다중 노드 로그 디렉터리 포맷 | kafka-storage.sh format -t $ID -c … | 노드마다 같은 -t 값을 써야 합니다 |
| 클러스터 준비 | 포맷 시 초기 SCRAM 사용자 심기 | kafka-storage.sh format … --add-scram … | 브로커 간 인증용 자격 증명은 기동 전에 필요 |
| 클러스터 준비 | 브로커·컨트롤러 기동 | kafka-server-start.sh config/server.properties | process.roles가 역할을 결정 |
| 클러스터 준비 | 클러스터 ID·노드 확인 | kafka-cluster.sh cluster-id --bootstrap-server $BS | |
| 클러스터 준비 | 죽은 브로커 등록 해제 | kafka-cluster.sh unregister --bootstrap-server $BS --id 1 | 영구 제거된 노드를 메타데이터에서 지움 |
| 메타데이터 · 쿼럼 | 컨트롤러 쿼럼 상태 보기 | kafka-metadata-quorum.sh --bootstrap-server $BS describe --status | 리더 ID·epoch·LEO 확인 |
| 메타데이터 · 쿼럼 | 쿼럼 복제 진행 보기 | kafka-metadata-quorum.sh … describe --replication | 컨트롤러 추가 전 따라잡았는지 확인 |
| 메타데이터 · 쿼럼 | 컨트롤러 추가 | kafka-metadata-quorum.sh … add-controller | 동적 쿼럼에서만 가능 |
| 메타데이터 · 쿼럼 | 컨트롤러 제거 | kafka-metadata-quorum.sh … remove-controller --controller-id $ID --controller-directory-id $DIR | 종료 전에 먼저 제거하세요 |
| 메타데이터 · 쿼럼 | 클러스터 feature 확인 | kafka-features.sh --bootstrap-server $BS describe | metadata.version 등 |
| 메타데이터 · 쿼럼 | 메타데이터 버전 올리기 | kafka-features.sh … upgrade --release-version 4.3 | 업그레이드의 마지막 단계 |
| 메타데이터 · 쿼럼 | 메타데이터 로그 내용 보기 | kafka-dump-log.sh --cluster-metadata-decoder --files … | 컨트롤러 이슈 조사용 |
| 메타데이터 · 쿼럼 | 메타데이터 스냅샷 탐색 | kafka-metadata-shell.sh --snapshot …checkpoint | 대화형 셸 |
| 토픽 | 토픽 목록 | kafka-topics.sh --bootstrap-server $BS --list | |
| 토픽 | 토픽 생성 | kafka-topics.sh … --create --topic T --partitions 6 --replication-factor 3 | 운영 토픽은 반드시 명시 생성 |
| 토픽 | 생성 시 토픽 설정 지정 | kafka-topics.sh … --create … --config retention.ms=86400000 | --config는 반복 가능 |
| 토픽 | 토픽 상세 보기 (리더·ISR) | kafka-topics.sh … --describe --topic T | 장애 조사의 출발점 |
| 토픽 | 기본값과 다른 설정을 가진 토픽만 | kafka-topics.sh … --describe --topics-with-overrides | |
| 토픽 | under-replicated 파티션만 | kafka-topics.sh … --describe --under-replicated-partitions | URP 알림 대응 1번 |
| 토픽 | min.insync.replicas 미달 파티션만 | kafka-topics.sh … --describe --under-min-isr-partitions | 쓰기가 막히는 파티션 |
| 토픽 | ISR이 딱 최소치인 파티션만 | kafka-topics.sh … --describe --at-min-isr-partitions | 한 대만 더 잃으면 멈춥니다 |
| 토픽 | 리더 없는(offline) 파티션만 | kafka-topics.sh … --describe --unavailable-partitions | OfflinePartitionsCount와 짝 |
| 토픽 | 파티션 수 늘리기 | kafka-topics.sh … --alter --topic T --partitions 12 | 줄일 수 없습니다. 키 분배가 바뀝니다 |
| 토픽 | 토픽 삭제 | kafka-topics.sh … --delete --topic T | delete.topic.enable이 true여야 함 |
| 토픽 | 내부 토픽 제외하고 목록 | kafka-topics.sh … --list --exclude-internal | __consumer_offsets 등 제외 |
| 토픽 | 토픽 ID로 조회 | kafka-topics.sh … --describe --topic-id $UUID | 재생성된 동명 토픽 구분에 유용 |
| 생산 · 소비 | 콘솔에서 메시지 보내기 | kafka-console-producer.sh --bootstrap-server $BS --topic T | |
| 생산 · 소비 | 키와 함께 보내기 | kafka-console-producer.sh … --property parse.key=true --property key.separator=: | 파티셔닝 테스트용 |
| 생산 · 소비 | 처음부터 읽기 | kafka-console-consumer.sh … --topic T --from-beginning | |
| 생산 · 소비 | 키·오프셋·파티션까지 출력 | kafka-console-consumer.sh … --property print.key=true --property print.offset=true | |
| 생산 · 소비 | N건만 읽고 종료 | kafka-console-consumer.sh … --max-messages 10 | 스크립트에서 유용 |
| 생산 · 소비 | 특정 파티션·오프셋부터 읽기 | kafka-console-consumer.sh … --partition 3 --offset 1000 | 그룹을 쓰지 않는 assign 모드 |
| 생산 · 소비 | 커밋된 것만 읽기 | kafka-console-consumer.sh … --isolation-level read_committed | 트랜잭션 검증 |
| 생산 · 소비 | Share Group으로 소비 (4.2+) | kafka-console-share-consumer.sh --bootstrap-server $BS --topic T | 레코드 단위 ack · 파티션 배타 할당 없음 |
| 컨슈머 그룹 · lag | 그룹 목록 | kafka-consumer-groups.sh --bootstrap-server $BS --list | |
| 컨슈머 그룹 · lag | lag 확인 | kafka-consumer-groups.sh … --describe --group G | LAG 열이 목적. 가장 많이 쓰는 명령 |
| 컨슈머 그룹 · lag | 그룹 멤버·할당 파티션 보기 | kafka-consumer-groups.sh … --describe --group G --members --verbose | 리밸런스 조사 |
| 컨슈머 그룹 · lag | 그룹 상태만 보기 | kafka-consumer-groups.sh … --describe --group G --state | Stable / PreparingRebalance 등 |
| 컨슈머 그룹 · lag | 오프셋을 최신으로 리셋 | kafka-consumer-groups.sh … --reset-offsets --group G --topic T --to-latest --execute | 그룹이 비어 있어야 합니다 |
| 컨슈머 그룹 · lag | 오프셋을 맨 처음으로 리셋 | … --reset-offsets … --to-earliest --execute | 전체 재처리 |
| 컨슈머 그룹 · lag | 특정 시각으로 리셋 | … --reset-offsets … --to-datetime 2026-07-01T00:00:00.000 | ISO-8601. 타임존 주의 |
| 컨슈머 그룹 · lag | 상대 이동으로 리셋 | … --reset-offsets … --shift-by -1000 | 음수는 되돌리기 |
| 컨슈머 그룹 · lag | 기간만큼 되돌리기 | … --reset-offsets … --by-duration PT1H | ISO-8601 duration |
| 컨슈머 그룹 · lag | 절대 오프셋으로 리셋 | … --reset-offsets … --to-offset 5000 | |
| 컨슈머 그룹 · lag | 리셋 결과 미리보기 | … --reset-offsets … --dry-run | --execute 없이 실행하면 dry-run |
| 컨슈머 그룹 · lag | 모든 토픽 대상 리셋 | … --reset-offsets --group G --all-topics --to-earliest --execute | |
| 컨슈머 그룹 · lag | 그룹 삭제 | kafka-consumer-groups.sh … --delete --group G | 활성 멤버가 없어야 함 |
| 컨슈머 그룹 · lag | 토픽 오프셋만 삭제 | kafka-consumer-groups.sh … --delete-offsets --group G --topic T | 그룹은 남기고 오프셋만 |
| 컨슈머 그룹 · lag | 모든 종류의 그룹 목록 (4.2+) | kafka-groups.sh --bootstrap-server $BS --list | consumer · share · streams 통합 |
| 컨슈머 그룹 · lag | Share Group lag (4.2+) | kafka-share-groups.sh --bootstrap-server $BS --describe --group G | |
| 컨슈머 그룹 · lag | Share Group 오프셋 리셋 (4.2+) | kafka-share-groups.sh … --reset-offsets --group G --topic T --to-latest --execute | |
| 컨슈머 그룹 · lag | Streams 그룹 조회 | kafka-streams-groups.sh --bootstrap-server $BS --list | Streams 애플리케이션 전용 |
| 컨슈머 그룹 · lag | Streams 앱 상태·오프셋 초기화 | kafka-streams-application-reset.sh --bootstrap-server $BS --application-id A | 로컬 state.dir도 지워야 완전 초기화 |
| 오프셋 조회 | 파티션별 최신 오프셋(LEO) | kafka-get-offsets.sh --bootstrap-server $BS --topic T --time latest | lag을 손으로 계산할 때 |
| 오프셋 조회 | 파티션별 최초 오프셋 | kafka-get-offsets.sh … --time earliest | 리텐션 삭제 경계 |
| 오프셋 조회 | 특정 시각 기준 오프셋 | kafka-get-offsets.sh … --time 1767225600000 | epoch ms |
| 오프셋 조회 | 특정 파티션만 | kafka-get-offsets.sh … --topic-partitions T:0,T:3 | |
| 오프셋 조회 | 오프셋 이하 레코드 삭제 | kafka-delete-records.sh --bootstrap-server $BS --offset-json-file f.json | 리텐션과 무관하게 즉시 삭제 |
| 설정 | 토픽 설정 조회 | kafka-configs.sh --bootstrap-server $BS --describe --entity-type topics --entity-name T | |
| 설정 | 토픽 설정 변경 | kafka-configs.sh … --alter --entity-type topics --entity-name T --add-config retention.ms=3600000 | 무중단 |
| 설정 | 토픽 설정 삭제(기본값 복귀) | kafka-configs.sh … --alter --entity-type topics --entity-name T --delete-config retention.ms | |
| 설정 | 브로커 동적 설정 조회 | kafka-configs.sh … --describe --entity-type brokers --entity-name 1 | |
| 설정 | 브로커 동적 설정 변경 | kafka-configs.sh … --alter --entity-type brokers --entity-name 1 --add-config num.io.threads=16 | cluster-wide·per-broker만 가능 |
| 설정 | 클러스터 전체 기본값 변경 | kafka-configs.sh … --alter --entity-type brokers --entity-default --add-config … | |
| 설정 | 브로커 로그 레벨 변경 | kafka-configs.sh … --alter --entity-type broker-loggers --entity-name 1 --add-config kafka.server=DEBUG | 재시작 없이 즉시 적용 |
| 설정 | 클라이언트 쿼터 설정 | kafka-configs.sh … --alter --entity-type clients --entity-name C --add-config 'producer_byte_rate=1024' | 사용자·클라이언트 조합도 가능 |
| 설정 | 컨트롤러 엔드포인트로 설정 조작 | kafka-configs.sh --bootstrap-controller $BC … | 브로커가 전부 죽었을 때 유용 |
| 설정 | 클라이언트 메트릭 구독 설정 | kafka-client-metrics.sh --bootstrap-server $BS --alter --name m --metrics … --interval … | KIP-714 |
| 복제 · 리더 | 재할당 계획 생성 | kafka-reassign-partitions.sh … --topics-to-move-json-file t.json --broker-list "5,6" --generate | 현재/제안 JSON을 함께 출력 |
| 복제 · 리더 | 재할당 실행 (대역폭 제한 포함) | kafka-reassign-partitions.sh … --reassignment-json-file r.json --execute --throttle 50000000 | throttle 없이 돌리면 클러스터가 흔들립니다 |
| 복제 · 리더 | 재할당 진행 확인 | kafka-reassign-partitions.sh … --reassignment-json-file r.json --verify | 완료 후 throttle 설정을 제거합니다 |
| 복제 · 리더 | 선호 리더로 되돌리기 | kafka-leader-election.sh … --election-type preferred --all-topic-partitions | 재시작 후 리더 편중 해소 |
| 복제 · 리더 | unclean 선거 강제 | kafka-leader-election.sh … --election-type unclean --topic T --partition 0 | 유실을 감수하는 최후 수단 |
| 복제 · 리더 | 로그 디렉터리 사용량 보기 | kafka-log-dirs.sh --bootstrap-server $BS --describe | 디스크 풀 조사. JSON 출력 |
| 복제 · 리더 | 특정 브로커·토픽만 보기 | kafka-log-dirs.sh … --describe --broker-list 1,2 --topic-list T | |
| 복제 · 리더 | 브로커가 지원하는 API 버전 | kafka-broker-api-versions.sh --bootstrap-server $BS | 혼합 버전 클러스터 진단 |
| 보안 | ACL 목록 | kafka-acls.sh --bootstrap-server $BS --list | |
| 보안 | 프로듀서 ACL 한 번에 부여 | kafka-acls.sh … --add --allow-principal User:Bob --producer --topic T | WRITE·DESCRIBE·CREATE를 함께 부여 |
| 보안 | 컨슈머 ACL 한 번에 부여 | kafka-acls.sh … --add --allow-principal User:Bob --consumer --topic T --group G | 토픽 READ·DESCRIBE + 그룹 READ |
| 보안 | 접두어 기반 ACL | kafka-acls.sh … --add … --topic "order-" --resource-pattern-type prefixed | 토픽이 늘어나도 재부여 불필요 |
| 보안 | SCRAM 사용자 생성 | kafka-configs.sh … --alter --entity-type users --entity-name alice --add-config 'SCRAM-SHA-256=[password=…]' | 기동 후 동적 생성 |
| 보안 | 위임 토큰 생성 | kafka-delegation-tokens.sh … --create --max-life-time-period -1 --renewer-principal User:u1 | SASL 채널에서만 가능 |
| 진단 | 세그먼트 파일 내용 보기 | kafka-dump-log.sh --files 00000000000000000000.log --print-data-log | 배치·타임스탬프·압축 확인 |
| 진단 | 인덱스 정합성 검사 | kafka-dump-log.sh --files ….index --index-sanity-check | |
| 진단 | __consumer_offsets 해독 | kafka-dump-log.sh --offsets-decoder --files … | 커밋 레코드 직접 확인 |
| 진단 | 트랜잭션 로그 해독 | kafka-dump-log.sh --transaction-log-decoder --files … | |
| 진단 | 진행 중 트랜잭션 목록 | kafka-transactions.sh --bootstrap-server $BS list | |
| 진단 | 멈춘(hanging) 트랜잭션 찾기 | kafka-transactions.sh … find-hanging --topic T | LSO가 멈춰 read_committed가 막힐 때 |
| 진단 | 트랜잭션 강제 중단 | kafka-transactions.sh … abort --topic T --partition 0 --start-offset N | 최후 수단 |
| 진단 | 프로듀서 상태 보기 | kafka-transactions.sh … describe-producers --topic T --partition 0 | PID·시퀀스·epoch |
| 성능 측정 | 프로듀서 처리량 측정 | kafka-producer-perf-test.sh --bootstrap-server $BS --topic T --num-records 100000 --record-size 1024 --throughput -1 | 설정 변경 전후 비교의 기준 |
| 성능 측정 | 컨슈머 처리량 측정 | kafka-consumer-perf-test.sh --bootstrap-server $BS --topic T --num-records 100000 | --messages는 deprecated |
| 성능 측정 | Share Consumer 처리량 측정 | kafka-share-consumer-perf-test.sh --bootstrap-server $BS --topic T --num-records 100000 | 4.2+. --messages는 deprecated |
자주 쓰는 원라이너 20개
장애 대응 중 그대로 붙여 쓸 수 있는 형태입니다.
BS=localhost:9092를 먼저 export해 두면 편합니다.
export BS=localhost:9092
# 1. 지금 문제가 있는 파티션이 있는가 (URP)
bin/kafka-topics.sh --bootstrap-server $BS --describe --under-replicated-partitions
# 2. 쓰기가 막힌 파티션이 있는가 (ISR < min.insync.replicas)
bin/kafka-topics.sh --bootstrap-server $BS --describe --under-min-isr-partitions
# 3. 리더가 아예 없는 파티션이 있는가 (offline)
bin/kafka-topics.sh --bootstrap-server $BS --describe --unavailable-partitions
# 4. 컨트롤러 쿼럼은 살아 있는가
bin/kafka-metadata-quorum.sh --bootstrap-server $BS describe --status
# 5. 브로커별 디스크 사용량 (JSON)
bin/kafka-log-dirs.sh --bootstrap-server $BS --describe
# 6. 특정 그룹의 lag
bin/kafka-consumer-groups.sh --bootstrap-server $BS --describe --group my-group
# 7. lag이 큰 파티션만 정렬해서 보기 (LAG 열이 5번째)
bin/kafka-consumer-groups.sh --bootstrap-server $BS --describe --group my-group \
| awk 'NR>1 && $6 != "-" { print $6, $1, $2, $3 }' | sort -rn | head -20
# 8. 전체 그룹의 lag 합계를 그룹별로
for g in $(bin/kafka-consumer-groups.sh --bootstrap-server $BS --list); do
total=$(bin/kafka-consumer-groups.sh --bootstrap-server $BS --describe --group "$g" \
| awk 'NR>1 && $6 ~ /^[0-9]+$/ { s += $6 } END { print s+0 }')
echo "$total $g"
done | sort -rn
# 9. 누가 어느 파티션을 들고 있는가 (리밸런스 조사)
bin/kafka-consumer-groups.sh --bootstrap-server $BS --describe --group my-group --members --verbose
# 10. 그룹 상태만 (Stable / PreparingRebalance / CompletingRebalance / Empty)
bin/kafka-consumer-groups.sh --bootstrap-server $BS --describe --group my-group --state
# 11. 리셋을 먼저 미리보기 (--execute 를 빼면 dry-run)
bin/kafka-consumer-groups.sh --bootstrap-server $BS --reset-offsets \
--group my-group --topic orders --to-latest
# 12. 최신으로 리셋 — lag을 즉시 0으로 (미처리 데이터를 버립니다)
bin/kafka-consumer-groups.sh --bootstrap-server $BS --reset-offsets \
--group my-group --topic orders --to-latest --execute
# 13. 1시간 전으로 되돌려 재처리
bin/kafka-consumer-groups.sh --bootstrap-server $BS --reset-offsets \
--group my-group --all-topics --by-duration PT1H --execute
# 14. 파티션별 최신 오프셋(LEO)과 최초 오프셋
bin/kafka-get-offsets.sh --bootstrap-server $BS --topic orders --time latest
bin/kafka-get-offsets.sh --bootstrap-server $BS --topic orders --time earliest
# 15. 특정 시각(epoch ms) 기준 오프셋 — 재처리 시작점 찾기
bin/kafka-get-offsets.sh --bootstrap-server $BS --topic orders --time 1767225600000
# 16. 리텐션을 1시간으로 줄여 디스크 확보 (원래 값은 반드시 기록해 두세요)
bin/kafka-configs.sh --bootstrap-server $BS --alter \
--entity-type topics --entity-name bloated-topic --add-config retention.ms=3600000
# 17. 되돌리기 — 토픽 오버라이드 제거
bin/kafka-configs.sh --bootstrap-server $BS --alter \
--entity-type topics --entity-name bloated-topic --delete-config retention.ms
# 18. 리더 편중 해소 (재시작 직후에 자주 필요)
bin/kafka-leader-election.sh --bootstrap-server $BS \
--election-type preferred --all-topic-partitions
# 19. 특정 클래스만 DEBUG로 (재시작 없이, 브로커 1번)
bin/kafka-configs.sh --bootstrap-server $BS --alter \
--entity-type broker-loggers --entity-name 1 \
--add-config org.apache.kafka.clients.consumer=DEBUG
# 20. read_committed가 멈췄을 때 — 멈춘 트랜잭션 찾기
bin/kafka-transactions.sh --bootstrap-server $BS find-hanging --topic orders
--bootstrap-server vs --bootstrap-controller
KRaft에서는 엔드포인트가 두 종류입니다. 대부분의 명령은 브로커로 보내면 되고, 브로커가 전부 죽었거나 컨트롤러 자체를 다뤄야 할 때 컨트롤러 엔드포인트를 씁니다. 두 옵션을 동시에 쓸 수는 없습니다.
| 옵션 | 대상 | 언제 쓰는가 |
|---|---|---|
--bootstrap-server |
브로커 리스너 (보통 9092) | 기본. 토픽·그룹·설정·ACL 등 거의 모든 작업 |
--bootstrap-controller |
컨트롤러 리스너 (보통 9093) | 컨트롤러 추가·제거, feature 조작, 브로커가 모두 다운된 상태에서의 설정 조회 |
--command-config |
Admin 클라이언트 프로퍼티 파일 | SASL·SSL이 켜진 클러스터에서는 거의 항상 필요합니다 |
# SASL_SSL + SCRAM-SHA-512 예시
security.protocol=SASL_SSL
sasl.mechanism=SCRAM-SHA-512
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \
username="admin" \
password="admin-secret";
ssl.truststore.location=/var/private/ssl/client.truststore.jks
ssl.truststore.password=changeit
bin/kafka-topics.sh --bootstrap-server broker1:9093 \
--command-config client.properties --list
인증 실패 시 로그를 읽는 방법과 리스너 조합 패턴은 보안 치트시트에 정리했습니다.
KRaft 클러스터 부트스트랩 전체 순서
# 1. 클러스터 UUID 생성 (한 번만)
KAFKA_CLUSTER_ID="$(bin/kafka-storage.sh random-uuid)"
echo "$KAFKA_CLUSTER_ID"
# 2. 로그 디렉터리 포맷 — KRaft에서 반드시 필요한 단계
bin/kafka-storage.sh format --standalone -t "$KAFKA_CLUSTER_ID" -c config/server.properties
# 3. 기동
bin/kafka-server-start.sh config/server.properties
# 4. 확인
bin/kafka-metadata-quorum.sh --bootstrap-server localhost:9092 describe --status
-t 값 사용)# 모든 노드가 동일한 클러스터 ID로 포맷되어야 합니다.
# ID가 다르면 INCONSISTENT_CLUSTER_ID 로 조인이 거부됩니다.
bin/kafka-storage.sh format -t "$KAFKA_CLUSTER_ID" -c config/server.properties
# SASL/SCRAM 을 쓸 경우 브로커 간 인증 자격 증명을 포맷 시점에 심습니다
bin/kafka-storage.sh format -t "$KAFKA_CLUSTER_ID" -c config/server.properties \
--add-scram 'SCRAM-SHA-256=[name="admin",password="admin-secret"]'
# 1) 새 컨트롤러를 포맷·기동한 뒤 복제가 따라잡았는지 확인
bin/kafka-metadata-quorum.sh --bootstrap-server localhost:9092 describe --replication
# 2) 쿼럼에 추가 (컨트롤러 자신의 설정 파일을 --command-config 로 넘깁니다)
bin/kafka-metadata-quorum.sh --command-config config/controller.properties \
--bootstrap-server localhost:9092 add-controller
# 3) 제거는 종료 "전에" — 순서를 바꾸면 쿼럼이 흔들립니다
bin/kafka-metadata-quorum.sh --bootstrap-server localhost:9092 \
remove-controller --controller-id 3 --controller-directory-id <directory-id>
파티션 재할당 3단계
{
"topics": [
{ "topic": "orders" },
{ "topic": "payments" }
],
"version": 1
}
# 계획 생성: 현재 배치와 제안 배치를 함께 출력합니다.
# "Current partition replica assignment" 출력은 롤백용으로 반드시 파일로 저장하세요.
bin/kafka-reassign-partitions.sh --bootstrap-server $BS \
--topics-to-move-json-file topics-to-move.json \
--broker-list "1,2,3,4,5,6" --generate
# 실행: throttle 없이 돌리면 복제 트래픽이 클러스터를 잡아먹습니다 (bytes/sec)
bin/kafka-reassign-partitions.sh --bootstrap-server $BS \
--reassignment-json-file reassignment.json --execute --throttle 50000000
# 검증: 완료되면 throttle 설정이 자동으로 제거됩니다.
# --verify 를 돌리지 않으면 throttle 이 남아 복제가 계속 느립니다.
bin/kafka-reassign-partitions.sh --bootstrap-server $BS \
--reassignment-json-file reassignment.json --verify
kafka-reassign-partitions.sh 옵션 전체
옵션은 4.3 소스의 ReassignPartitionsCommandOptions.java에서 확인했습니다.
| 옵션 | 용도 |
|---|---|
--generate | 재할당 계획 생성. 현재 배치와 제안 배치를 함께 출력합니다 |
--execute | 계획 실행 |
--verify | 진행 상황 확인. 완료 시 throttle 설정을 제거합니다 |
--cancel | 진행 중인 재할당 취소. 클러스터가 흔들릴 때의 탈출구입니다 |
--list | 진행 중인 재할당 목록 조회 |
--additional | 기존 재할당에 덧붙여 실행 (취소하지 않고 추가) |
--preserve-throttles | --verify 시 throttle 설정을 제거하지 않고 유지합니다. 여러 단계로 나눠 진행할 때 |
--throttle | 복제 대역폭 상한 (bytes/sec). 지정하지 않으면 클러스터가 복제 트래픽에 잠깁니다 |
--replica-alter-log-dirs-throttle | 브로커 내부 로그 디렉터리 간 이동 대역폭 상한 |
--reassignment-json-file | 재할당 계획 JSON 파일 (--execute·--verify·--cancel) |
--topics-to-move-json-file | 옮길 토픽 목록 JSON (--generate) |
--broker-list | 대상 브로커 ID 목록 (--generate) |
--disable-rack-aware | 랙 인식 배치를 끕니다 |
--disallow-replication-factor-change | 복제 계수 변경을 금지합니다 (의도치 않은 RF 변경 방지) |
--timeout | 명령 타임아웃 |
--bootstrap-server | 브로커 엔드포인트 |
--bootstrap-controller | 컨트롤러 엔드포인트 |
--command-config | Admin 클라이언트 프로퍼티 파일 |
replicas 배열에 브로커를 추가합니다{
"version": 1,
"partitions": [
{ "topic": "orders", "partition": 0, "replicas": [1, 2, 3] },
{ "topic": "orders", "partition": 1, "replicas": [2, 3, 1] },
{ "topic": "orders", "partition": 2, "replicas": [3, 1, 2] }
]
}
# 진행 중인 재할당 목록
bin/kafka-reassign-partitions.sh --bootstrap-server $BS --list
# 취소 — 계획 파일이 필요합니다
bin/kafka-reassign-partitions.sh --bootstrap-server $BS \
--reassignment-json-file reassignment.json --cancel
# 여러 단계로 나눠 진행할 때는 throttle 을 유지합니다
bin/kafka-reassign-partitions.sh --bootstrap-server $BS \
--reassignment-json-file reassignment.json --verify --preserve-throttles
성능 측정 도구 — 4.3에서 옵션이 바뀌었습니다
| 도구 | 구 옵션 (deprecated) | 4.3 신규 | 용도 |
|---|---|---|---|
kafka-producer-perf-test.sh |
--producer-props |
--command-property |
프로듀서 설정을 인라인으로. 키마다 옵션을 반복합니다 |
kafka-producer-perf-test.sh |
--producer.config |
--command-config |
프로퍼티 파일로 설정 전달 |
kafka-consumer-perf-test.sh |
--messages |
--num-records |
소비할 레코드 수. 프로듀서 쪽 이름과 통일되었습니다 |
kafka-consumer-perf-test.sh |
--consumer.config |
--command-config |
프로퍼티 파일로 설정 전달 |
kafka-share-consumer-perf-test.sh |
--messages · --consumer.config |
--num-records · --command-config |
Share Consumer도 같은 규칙을 따릅니다 (4.2+) |
| 옵션 | 도구 | 용도 |
|---|---|---|
--bootstrap-server | producer-perf-test | 다른 CLI와 동일하게 브로커를 직접 지정합니다. 예전에는 --producer-props bootstrap.servers=…로 넘겨야 했습니다 |
--reporting-interval | producer · consumer · share-consumer | 중간 통계 출력 주기(ms) |
--include | consumer-perf-test | 소비할 토픽을 정규식으로 지정 |
--command-property | producer · consumer · share-consumer | 인라인 설정. 세 도구 모두 지원합니다 |
--warmup-records | producer-perf-test | 통계에서 제외할 워밍업 레코드 수. JIT 워밍업 때문에 초반 수치가 왜곡되는 문제를 없앱니다 |
구 옵션. 아직 동작하지만 실행 시 deprecation 경고가 출력되고 향후 제거됩니다.
bin/kafka-producer-perf-test.sh \
--topic perf-test \
--num-records 500000 --record-size 1024 --throughput -1 \
--producer-props bootstrap.servers=localhost:9092 \
compression.type=lz4 linger.ms=5
bin/kafka-consumer-perf-test.sh \
--bootstrap-server localhost:9092 \
--topic perf-test --messages 500000
4.3 스타일. 다른 CLI와 옵션 이름이 통일됩니다.
bin/kafka-producer-perf-test.sh \
--bootstrap-server localhost:9092 \
--topic perf-test \
--num-records 500000 --record-size 1024 --throughput -1 \
--warmup-records 10000 \
--command-property compression.type=lz4 \
--command-property linger.ms=5
bin/kafka-consumer-perf-test.sh \
--bootstrap-server localhost:9092 \
--topic perf-test --num-records 500000
Share Groups (4.2+)
| 타입 | 의미 | 전달 시도 카운트 |
|---|---|---|
ACCEPT (1) |
정상 처리 완료. 레코드가 확정됩니다 | 더 이상 전달되지 않습니다 |
RELEASE (2) |
처리하지 못했으니 다시 전달해 달라는 뜻 | 증가합니다. group.share.delivery.count.limit(기본 5)에 도달하면 아카이브됩니다 |
REJECT (3) |
이 레코드는 처리할 수 없다는 뜻. 재전달하지 않습니다 | 재전달 없음 — 포이즌 메시지 처리에 씁니다 |
RENEW (4) |
처리 중이니 잠금을 연장해 달라는 뜻 | 증가하지 않습니다. 처리 시간이 group.share.record.lock.duration.ms보다 긴 경우 |
| 설정 | 기본값 | 역할 |
|---|---|---|
share.record.lock.duration.ms | 30000 | 획득한 레코드의 잠금 유지 시간. 초과하면 다른 컨슈머에게 재배달됩니다 |
share.delivery.count.limit | 5 | 한 레코드의 최대 전달 시도 횟수. 초과 시 아카이브 — DLQ 대체 설계의 핵심 값 |
share.partition.max.record.locks | 2000 | 파티션당 동시 잠금 가능한 레코드 수 |
share.session.timeout.ms | 45000 | Share Group 멤버의 세션 타임아웃 |
share.heartbeat.interval.ms | 5000 | 하트비트 간격 |
share.auto.offset.reset | latest | share group의 시작 위치 |
share.isolation.level | read_uncommitted | 트랜잭션 레코드 가시성 |
share.renew.acknowledge.enable | true | RENEW ack(잠금 연장)을 허용할지 |
share.assignment.interval.ms | 1000 | 브로커가 할당을 재계산하는 주기 |
# 목록·상세·상태
bin/kafka-share-groups.sh --bootstrap-server $BS --list
bin/kafka-share-groups.sh --bootstrap-server $BS --describe --group my-share-group
bin/kafka-share-groups.sh --bootstrap-server $BS --describe --group my-share-group --members
bin/kafka-share-groups.sh --bootstrap-server $BS --describe --group my-share-group --state
# 콘솔로 소비해 보기
bin/kafka-console-share-consumer.sh --bootstrap-server $BS --topic orders
# 그룹 설정을 그룹 단위로 오버라이드 (GROUP 리소스 타입)
bin/kafka-configs.sh --bootstrap-server $BS --alter \
--entity-type groups --entity-name my-share-group \
--add-config share.delivery.count.limit=3
# 오프셋 리셋
bin/kafka-share-groups.sh --bootstrap-server $BS --reset-offsets \
--group my-share-group --topic orders --to-latest --execute
도구 색인
도구 이름을 이미 아는 경우 여기서 시작하세요.
| 도구 | 한 줄 용도 | 비고 |
|---|---|---|
kafka-storage.sh | 클러스터 UUID 생성, 로그 디렉터리 포맷, 초기 SCRAM 자격 증명 | KRaft 필수. 기동 전 단계 |
kafka-server-start.sh | 브로커·컨트롤러 프로세스 기동 | process.roles가 역할 결정 |
kafka-metadata-quorum.sh | 컨트롤러 쿼럼 조회, 컨트롤러 추가·제거 | KRaft 운영의 중심 도구 |
kafka-metadata-shell.sh | 메타데이터 스냅샷을 파일시스템처럼 탐색 | 대화형 |
kafka-features.sh | 클러스터 feature(metadata.version 등) 조회·업그레이드 | 버전 업그레이드 마지막 단계 |
kafka-cluster.sh | 클러스터 ID 조회, 죽은 브로커 등록 해제 | |
kafka-topics.sh | 토픽 생성·조회·변경·삭제, URP/ISR 필터 조회 | 가장 자주 쓰는 도구 |
kafka-configs.sh | 토픽·브로커·사용자·클라이언트·그룹 설정 조회·변경, 쿼터, SCRAM | 동적 설정의 유일한 창구 |
kafka-console-producer.sh | 표준 입력으로 메시지 발행 | --property로 키 파싱 |
kafka-console-consumer.sh | 토픽 내용을 표준 출력으로 | --from-beginning·--max-messages |
kafka-console-share-consumer.sh | Share Group으로 소비 | 4.2+ (KIP-932) |
kafka-consumer-groups.sh | 그룹 조회, lag 확인, 오프셋 리셋·삭제 | 장애 대응 필수 |
kafka-share-groups.sh | Share Group 조회·오프셋 리셋·삭제 | 4.2+ |
kafka-streams-groups.sh | Kafka Streams 그룹 조회 | |
kafka-groups.sh | 모든 종류의 그룹을 통합 조회 | consumer · share · streams |
kafka-streams-application-reset.sh | Streams 앱의 오프셋·내부 토픽 초기화 | 로컬 state.dir은 직접 삭제 |
kafka-get-offsets.sh | 파티션별 최초·최신·시각 기준 오프셋 조회 | lag 수동 계산 |
kafka-delete-records.sh | 지정 오프셋 이하 레코드 삭제 | 되돌릴 수 없습니다 |
kafka-reassign-partitions.sh | 파티션 재배치 계획 생성·실행·검증, 복제 대역폭 제한 | 3단계를 모두 실행하세요 |
kafka-leader-election.sh | preferred / unclean 리더 선거 실행 | unclean은 유실을 감수 |
kafka-log-dirs.sh | 브로커별 로그 디렉터리 크기·오프셋 조회 | 디스크 풀 조사 |
kafka-acls.sh | ACL 추가·제거·조회 | --producer·--consumer 편의 옵션 |
kafka-delegation-tokens.sh | 위임 토큰 생성·갱신·만료·조회 | SASL 채널 전용 |
kafka-dump-log.sh | 로그·인덱스·메타데이터·오프셋·트랜잭션 로그 해독 | 최후의 진단 도구 |
kafka-transactions.sh | 트랜잭션 조회, hanging 탐지, 강제 중단 | find-hanging이 실무 핵심 |
kafka-client-metrics.sh | 클라이언트 메트릭 구독 설정 | KIP-714 |
kafka-broker-api-versions.sh | 브로커가 지원하는 API 버전 조회 | 혼합 버전 진단 |
kafka-producer-perf-test.sh | 프로듀서 처리량·지연 측정 | 튜닝 전후 비교 |
kafka-consumer-perf-test.sh | 컨슈머 처리량 측정 | |
connect-distributed.sh | Connect 워커를 분산 모드로 기동 | Connect 치트시트 |
connect-standalone.sh | Connect 워커를 standalone 모드로 기동 | 개발·단일 노드 전용 |
자주 걸리는 지점
이어서 볼 곳
공식 문서 출처
이 페이지의 모든 명령·옵션은 Apache Kafka 4.3.1 공식 문서와
배포판의 bin/ 스크립트에서 확인했습니다.
- Quickstart —
kafka-storage.sh random-uuid/format/ 기동 순서 - Basic Kafka Operations — 토픽 조작, 재할당, 리더 선거, 쿼터
- KRaft —
kafka-metadata-quorum.sh, 컨트롤러 추가·제거,kafka-dump-log.sh --cluster-metadata-decoder - Authorization and ACLs —
kafka-acls.sh옵션 전체 - Authentication using SASL/SCRAM — SCRAM 자격 증명 생성·조회·삭제
- Upgrading Apache Kafka —
kafka-features.sh upgrade --release-version - Consumer Group 운영 —
kafka-consumer-groups.sh옵션 - Downloads —
kafka_2.13-4.3.1.tgz(Scala 2.13 단일 배포)