
Apache Kafka는 대용량의 실시간 데이터 스트리밍을 처리하는 분산 메세징 시스템이다.
Kafka 브로커의 핵심 설정 파일인 server.properties를 올바르게 구성하는 것은 안정적이고 효율적인 운영의 시작점이다.
이 가이드에서는 주요 설정 항목들을 카테고리 별로 상세히 살펴보겠다.
1. 필수 기본 설정 (Essential Configurations)
1.1 broker.id
broker.id = 0
- 설명: 클러스터 내에서 각 브로커를 식별하는 고유한 정수 ID
- 권장사항:
- 첫번째 브로커는 0, 두번째는 1, 세번째는 2... 순차적으로 설정
- 설정하지 않으면 자동으로 고유 ID가 생성되지만, 명시적 설정 권장
- 클러스터 내에서 절대 중복되어서는 안됨
1.2 log.dirs
log.dirs=/var/kafka-logs
- 설명: Kafka가 메세지 로그를 저장할 디렉토리 경로
- 권장사항:
- 쉼표로 구분하여 여러 디렉토리 지정 가능: /mnt/disk1/kafka-logs,/mnt/disk2/kafka-logs
- SSD 사용 시 성능 향상 효과 큼
- 충분한 디스크 용량 확보 필요
- 파티션은 설정된 디렉토리 들에 균등하게 분산됨
1.3 zookeeper.connect
zookeeper.connect=localhost:2181
- 설명: Zookeeper 클러스터 연결 정보
- 권장사항:
- 단일 노드: localhost:2181
- 클러스터: zk1:2181,zk2:2181,zk3:2181
- chroot 경로 사용 가능: zk1:2181, zk2:2181/kafka
- 참고: kafka 3.x 이상에서는 KRaft 모드를 통해 Zookeeper 의존성 제거 가능

2. 네트워크 및 통신 설정
2.1 listeners
listeners=PLAINTEXT://:9092
- 설명: 브로커가 실제로 바인딩되어 수신 대기하는 주소
- 형식: PROTOCOL://HOST:PORT
- 예시:
listeners=PLAINTEXT://0.0.0.0:9092,SSL://0.0.0.0:9093
2.2 advertised.listeners
advertised.listeners=PLAINTEXT://kafka-broker-1:9092
- 설명 : 클라이언트에게 알리는(advertise) 브로커 접속 주소
- 중요: 클라이언트는 이 주소를 사용하여 브로커에 연결
- 권장사항:
- Docker/Kubernetes환경에서 특히 중요
- 외부에서 접근 가능한 실제 주소 설정 필요
- 클라우드 환경에서는 public IP 또는 도메인 사용
2.3 num.network.threads
num.network.threads=3
- 설명: 네트워크 요청을 처리하는 스레드 수
- 권장사항:
- 기본값: 3
- 높은 트래픽 환경: 8~16
- CPU 코어 수와 클라이언트 연결 수를 고려하여 조정
2.4 num.io.threads
num.io.threads=8
- 설명: 디스크 I/O 작업을 처리하는 스레드 수
- 권장사항:
- 기본값: 8
- 디스크가 많거나 파티션이 많은 경우 증가(16~32)
- SSD 사용 시 더 높은 값 설정 가능
3. 로그 보관 및 정리 설정
3.1 log.retention.hours
log.retention.hours=168
- 설명: 로그를 보관하는 시간(기본 168시간 = 7일)
- 대안 설정:
- log.retention.minutes : 분 단위
- log.retention.ms: 밀리초 단위(가장 우선순위 높음)
- 권장사항:
- 비즈니스 요구사항에 따라 조정
- 디스크 용량을 고려하여 설정
3.2 log.retention.bytes
log.retention.bytes=-1
- 설명: 파티션당 로그의 최대 크기(-1은 무제한)
- 권장사항:
- 디스크 공간 제한이 있을 때 설정
- ex: log.retention.bytes=1073741824 (1GB)
3.3 log.segment.bytes
log.segment.bytes=1073741824
- 설명: 로그 세그먼트 파일의 최대 크기(기본 1GB)
- 권장사항:
- 높은 처리량: 더 큰 값(2GB)
- 빠른 로그 롤링 필요: 더 작은 값 (512MB)
3.4 log.cleanup.policy
log.cleanup.policy=delete
- 설명: 로그 정리 정책
- 옵션:
- delete: 오래된 세그먼트 삭제
- compact:키 별 최신 값만 유지 (로그 컴팩션)
- delete, compact: 두 정책 모두 적용
4. 복제 및 고가용성 설정
4.1 default.replication.factor
default.replication.factor=3
- 설명:새로 생성되는 토픽의 기본 복제 팩터
- 권장사항:
- 프로덕션 환경: 최소 3
- 개발/테스트 환경: 1~2
4.2 min.insync.replicas
min.insync.replicas=2
- 설명: 쓰기가 성공으로 간주되기 위한 최소 동기화된 복제된 수
- 권장사항:
- replication.factor=3일때 min.insync.replicas=2 권장
- 데이터 내구성과 가용성의 균형점
4.3 replica.lag.time.max.ms
replica.lag.time.max.ms=30000
- 설명: 팔로워 복제본이 ISR에서 제외되기 전 최대 지연 시간(밀리초)
- 권장사항:
- 네트워크 지연을 고려하여 설정
- 기본값: 30000ms (30초)
5. 메모리 및 버퍼 설정
5.1 socket.send.buffer.bytes & socket.receive.buffer.bytes
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
- 설명: 네트워크 소켓 송수신 버퍼 크기
- 권장사항:
- 높은 처리량 환경: 더 큰 값 (1MB 이상)
- 기본값: 102400 (100KB)
5.2 socket.request.max.bytes
socket.request.max.bytes=104857600
- 설명: 소켓 요청의 최대 크기 (기본 100MB)
- 권장사항:
- 큰 메세지 처리 시 증가 필요
- 메모리 고려하여 설정
5.3 message.max.bytes
message.max.bytes=1048576
- 설명: 브로커가 수용할수 있는 최대 메세지 크기 (기본 1MB)
- 주의:
- Producer의 max.request.size와 일치 시켜야 함
- Consumer의 fetch.max.bytes보다 작거나 같아야함

6. 자동 토픽 생성 설정
6.1 auto.create.topics.enable
auto.create.topics.enable=true
- 설명: 존재하지 않는 토픽에 메세지 생성/소비 시 자동 생성 여부
- 권장사항:
- 프로덕션 환경: false (명시적 토픽 관리)
- 개발 환경: true(편의성)
6.2 num.partitions
num.partitions=1
- 설명: 자동 생성되는 토픽의 기본 파티션 수
- 권장사항:
- 처리량 고려: 3~10 파티션
- 브로커 수와 소비자 수를 고려하여 결정
7. 압축 설정
7.1 compression.type
compression.type=producer
- 설명: 브로커가 사용하는 압축 타입
- 옵션:
- producer: Producer가 설정한 압축 유지
- none: 압축 없음
- gzip, snappy, lz4, zstd: 특정 압축 알고리즘 강제
- 권장사항:
- 일반적으로 producer 유지
- 네트워크 대역폭 절약이 중요하면 lz4 또는 zstd
8. 보안 설정
8.1 인증 및 암호화
# SSL 설정
listeners=SSL://0.0.0.0:9093
ssl.keystore.location=/var/private/ssl/kafka.server.keystore.jks
ssl.keystore.password=password
ssl.key.password=password
ssl.truststore.location=/var/private/ssl/kafka.server.truststore.jks
ssl.truststore.password=password
# SASL 설정
security.inter.broker.protocol=SASL_SSL
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN
8.2 ACL(Access Control List)
authorizer.class.name=kafka.security.authorizer.AclAuthorizer
allow.everyone.if.no.acl.found=false

9. 성능 튜닝 팁
9.1 운영 환경 추천 설정
# 브로커 식별
broker.id=1
# 로그 디렉토리
log.dirs=/data/kafka-logs
# Zookeeper 연결
zookeeper.connect=zk1:2181,zk2:2181,zk3:2181/kafka
# 네트워크 설정
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://kafka-1.example.com:9092
num.network.threads=8
num.io.threads=16
# 복제 설정
default.replication.factor=3
min.insync.replicas=2
replica.lag.time.max.ms=30000
# 로그 보관
log.retention.hours=168
log.segment.bytes=1073741824
log.cleanup.policy=delete
# 토픽 설정
auto.create.topics.enable=false
num.partitions=6
# 성능 최적화
socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576
socket.request.max.bytes=104857600
# 압축
compression.type=lz4
9.2 하드웨어 별 권장사항
고성능 시스템(SSD, 충분한 메모리):
- num.io.threads: 16~32
- num.network.threads: 8~16
- log.segment.bytes: 2GB
- 큰 힙 메모리 할당 (6~8GB)
일반 시스템
- num.io.threads: 8~16
- num.network.threads: 3~8
- log.segment.bytes: 1GB
- 힙 메모리 4~6GB
10. 모니터링 및 유지보수
10.1 JMX 포트 설정
export JMX_PORT=9999
- JMX를 통해 Kafka 메트릭 모니터링 가능
10.2 주요 모니터링 메트릭
- 처리량:BytesInPerSec, BytesOutPerSec
- 지연: RequestQueueTimeMs, ResponseQueueTimeMs
- 복제: UnderReplicatedPartitions
- 리소스: CPU, 메모리, 디스크I/O
결론
server.properties 설정은 Kafka 클러스터의 성능과 안정성을 좌우하는 핵심 요소입니다. 위에서 소개한 설정들을 환경과 요구사항에 맞게 조정하여 사용하시기 바랍니다.
주요 포인트:
- ✅ 필수 설정(broker.id, log.dirs, zookeeper.connect)을 반드시 구성
- ✅ 프로덕션 환경에서는 복제 팩터 최소 3 이상 설정
- ✅ 네트워크 및 I/O 스레드를 하드웨어 사양에 맞게 튜닝
- ✅ 로그 보관 정책을 디스크 용량과 비즈니스 요구사항에 맞게 설정
- ✅ 보안이 중요한 환경에서는 SSL/SASL 활성화
- ✅ 지속적인 모니터링을 통해 설정 최적화
설정 변경 후에는 반드시 테스트 환경에서 충분히 검증한 후 프로덕션에 적용하는 것을 권장한다.
'🔥 Data Engineer > Kafka' 카테고리의 다른 글
| [Kafka] - 카프카 컨슈머 그룹(Kafka Consumer Group) (0) | 2026.01.25 |
|---|---|
| [Kafka] - 카프카 KSQL(KsqlDB)란? 스트리밍 SQL로 실시간 데이터 처리하기 (0) | 2026.01.22 |
| [Kafka] - 카프카 스키마 레지스트리(kafka Schema Registry) (1) | 2026.01.20 |
| [Kafka] - 멱등성,At least once,At most once,Exactly once (0) | 2026.01.13 |
| [Kafka] - 카프카 관리툴의 종류와 특징 비교 (1) | 2026.01.09 |