Kafka 주제 구성 마스터링: 종합 가이드
Apache Kafka는 실시간 데이터 파이프라인 및 스트리밍 애플리케이션 구축을 위한 사실상의 표준입니다. Kafka의 강력함의 핵심에는 데이터 스트림을 구성하고 분류하는 기본 단위 역할을 하는 주제(Topic)가 있습니다. 적절한 주제 구성은 단순한 설정 작업이 아니라, 필수적인 내구성, 내결함성 및 성능 수준을 달성하는 데 매우 중요합니다.
이 가이드에서는 Kafka 주제를 생성하거나 수정할 때 마스터해야 하는 필수 매개변수를 심층적으로 다룹니다. 파티션 수, 복제 계수, 보존 설정 및 견고하고 효율적인 분산 이벤트 스트리밍 플랫폼을 운영하는 데 필요한 기타 중요한 구성을 살펴보겠습니다.
핵심 Kafka 주제 개념 이해
주제를 구성하기 전에 주제의 동작을 정의하는 세 가지 주요 개념을 이해하는 것이 중요합니다.
- 파티션(Partitions): 주제는 파티션이라고 하는 레코드의 순서가 지정되고 불변하는 시퀀스로 나뉩니다. 파티션은 프로덕션 및 소비 모두에서 병렬 처리를 허용하여 처리량에 직접적인 영향을 미칩니다.
- 복제 계수(Replication Factor): 데이터의 내구성 및 내결함성을 결정합니다. 각 파티션 리더는 여러 개의 동기 복제본(ISR)을 가지고 있습니다.
- 소비자 그룹(Consumer Groups): 엄밀히 말하면 주제 설정은 아니지만, 소비자는 그룹 ID를 기반으로 주제와 상호 작용하여 순서가 지정되고 확장 가능한 소비를 보장합니다.
필수 주제 구성 매개변수
kafka-topics.sh 명령 또는 프로그래밍 방식 API를 사용하여 주제를 생성할 때 여러 매개변수가 해당 동작을 결정합니다. 가장 중요한 매개변수는 다음과 같습니다.
1. 파티션 수 (--partitions)
파티션 수는 해당 주제에 대해 Kafka가 지원할 수 있는 최대 병렬 처리 수준에 직접적인 영향을 미칩니다.
- 영향: 파티션이 많을수록 처리량이 증가하지만 오버헤드(메타데이터 관리, 리더 선출 지연 시간)가 증가합니다. 파티션 수가 너무 적으면 처리 속도가 느릴 경우 소비자 지연이 발생할 수 있습니다.
- 모범 사례: 예상 처리량과 소비자 인스턴스 수를 기반으로 합리적인 수로 시작하십시오. 일반적인 관행은 클러스터의 브로커 수보다 파티션 수가 훨씬 초과되지 않도록 하는 것이지만, 이는 엄격한 규칙은 아닙니다.
예제 생성 명령:
kafka-topics.sh --create --topic user_events_v1 \n --bootstrap-server localhost:9092 \n --partitions 6 --replication-factor 3
2. 복제 계수 (--replication-factor)
이 설정은 브로커 클러스터에서 파티션 데이터의 복사본이 몇 개 유지되는지를 정의합니다.
- 영향: 복제 계수가 N이면 데이터가 N개의 브로커에 존재한다는 의미입니다. 이는 고가용성에 필수적입니다. 리더 브로커가 실패하면 복제본(팔로워) 중 하나가 자동으로 새 리더로 선출됩니다.
- 권장 사항: 프로덕션 환경의 경우 최소 복제 계수 3을 강력히 권장합니다(브로커 하나가 실패해도 데이터 가용성을 유지할 수 있음).
3. 보존 정책
보존 정책은 Kafka가 삭제하기 전에 파티션에서 메시지를 얼마나 오래 유지할지 제어합니다. 이는 스토리지 관리 및 규정 준수에 중요합니다.
시간 기반 보존 (log.retention.ms)
이 매개변수는 크기에 관계없이 메시지가 유지되는 시간(밀리초)을 지정합니다.
- 기본값: 604800000밀리초 (7일).
- 구성 예제 (24시간으로 설정):
kafka-configs.sh --alter --topic user_events_v1 \n --bootstrap-server localhost:9092 \n --add-config log.retention.ms=86400000
크기 기반 보존 (log.retention.bytes)
이는 오래된 세그먼트가 삭제 대상으로 지정되기 전에 파티션의 모든 로그 세그먼트에 대한 최대 총 크기(바이트)를 지정합니다.
- 참고: 보존은 충족되는 첫 번째 조건(시간 또는 크기)에 따라 적용됩니다.
log.retention.ms가 7일로 설정되고log.retention.bytes가 1GB로 설정되면, 시간 제한에 도달하거나 크기 제한을 초과하는 즉시 데이터가 삭제됩니다.
4. 정리 정책 (cleanup.policy)
이는 데이터가 위의 보존 한계를 초과할 때 발생하는 작업을 정의합니다.
delete(기본값): 오래된 세그먼트가 삭제됩니다.compact: 이 정책은 상태 저장 스트림(예: 사용자 프로필 또는 구성 설정)에 사용됩니다. Kafka는 각 키에 대해 최신 메시지만 유지하고 동일한 키를 가진 이전 메시지를 덮어씁니다. 이는 변경 데이터 캡처(CDC) 로그에 일반적입니다.
고급 구성 시나리오
Kafka는 프로듀서와 소비자가 주제와 상호 작용하는 방식을 세밀하게 제어할 수 있습니다.
세그먼트 크기 (log.segment.bytes)
Kafka는 대규모 파티션을 더 작은 로그 세그먼트 파일로 분할합니다. 이 설정은 이러한 세그먼트의 크기를 제어합니다(기본값은 일반적으로 1GB).
- 영향: 세그먼트가 작을수록 로그 정리 및 세그먼트 전환이 빨라지지만 메타데이터 오버헤드가 증가합니다.
동기 복제본(ISR) 설정
이 설정은 쓰기가 성공한 것으로 간주되는 데 필요한 승인의 엄격성을 제어하며, 내구성 보장에 직접적인 영향을 미칩니다.
최소 동기 복제본 수 (min.insync.replicas)
이것은 프로듀서가 성공 확인을 받기 위해 인식해야 하는 최소 복제본 수입니다. 이 설정은 항상 replication.factor보다 작거나 같아야 합니다.
- 경고: 복제 계수가 3인 경우
min.insync.replicas를 1로 설정하면 두 개의 브로커가 다운되어도 쓰기가 성공하므로 데이터 손실 위험이 심각하게 발생합니다. 2로 설정하면(3의 계수에 대한 최소값) 균형을 제공합니다.
RF=3인 주제에 min.insync.replicas를 2로 설정:
kafka-configs.sh --alter --topic critical_data \n --bootstrap-server localhost:9092 \n --add-config min.insync.replicas=2
압축 유형 (compression.type)
프로듀서는 브로커로 보내기 전에 메시지를 압축하여 약간의 CPU 사용량(프로듀서 및 소비자 모두)을 희생하는 대신 네트워크 대역폭과 디스크 사용량을 줄일 수 있습니다.
- 일반적인 값:
none,gzip,snappy,lz4,zstd. - 권장 사항:
lz4또는snappy는 압축률과 CPU 오버헤드 간의 최상의 균형을 제공하는 경우가 많습니다.
기존 주제 구성 수정
Kafka는 브로커를 다시 시작하거나 주제를 중지하지 않고도 대부분의 매개변수에 대해 동적 구성 변경을 허용합니다.
kafka-configs.sh 도구를 사용하여 구성을 변경합니다.
# 예제: 기존 주제의 보존 시간 늘리기
kafka-configs.sh --alter --topic existing_topic \n --bootstrap-server localhost:9092 \n --add-config log.retention.ms=1209600000 # 14일
중요 고려 사항: 파티션 수 및 복제 계수와 같은 일부 기본 속성은 토픽 생성 후 변경할 수 없습니다 (--alter --partitions 플래그를 사용하여 파티션 수를 늘릴 수는 있지만 줄일 수는 없습니다).
요약 및 모범 사례
효과적인 Kafka 주제 구성은 가용성 및 처리량에 대한 애플리케이션 요구 사항에 맞춰진 반복적인 프로세스입니다. 프로덕션 환경에서는 항상 내구성을 우선시하십시오.
| 구성 항목 | 프로덕션 권장 사항 | 이유? |
|---|---|---|
| 복제 계수 | 3 | 브로커 하나 실패를 허용합니다. |
| 최소 동기 복제본 수 | 복제 계수 - 1 | 쓰기 내구성에 대한 과반수 합의를 보장합니다. |
| 보존 정책 | 법적/비즈니스 요구 사항에 따라 | 스토리지 고갈을 방지합니다. |
| 압축 | LZ4 또는 Snappy | I/O 절감과 CPU 비용의 균형을 맞춥니다. |
이러한 매개변수를 숙달하면 Kafka 클러스터가 예상 부하 조건에서 데이터를 안정적으로 처리하고 최적으로 성능을 발휘하도록 보장할 수 있습니다.