빠른참조 · 설정
설정 치트시트
Broker · Topic · Producer · Consumer · Streams · Connect 설정 302개를 Apache Kafka 4.3.1 공식 문서에서 확인한 기본값과 함께 정리했습니다. 각 표 위의 검색창에 설정명을 입력하면 해당 행만 남습니다. 기본값을 확인하지 못한 설정은 표에 넣지 않았습니다.
이 페이지 쓰는 법
- 설정명을 알면 검색창에 입력하세요. 6개 표가 각각 독립적으로 필터링됩니다.
- 목적만 아는 경우 프리셋 3종에서 시작해 개별 설정으로 내려가세요.
- "이 설정을 잘못 두면 무슨 일이 생기는가"는 트러블슈팅 치트시트에 있습니다.
프리셋 3종 — 처리량 / 지연 / 내구성
설정 하나씩 고민하기 전에 무엇을 포기할지 먼저 정하는 편이 빠릅니다.
아래 세 조합은 서로 배타적입니다. 처리량 우선 조합의 "linger.ms 올림"은
지연 우선 조합의 "linger.ms 내림"과 정면으로 충돌합니다.
acks, linger.ms, batch.size,
min.insync.replicas를 어느 방향으로 밀어 놓는지
| 설정 | 기본값 (4.3) | 처리량 우선 | 지연 우선 | 내구성 우선 | 왜 그 방향인가 |
|---|---|---|---|---|---|
| Producer | |||||
acks |
all |
1로 완화 |
1로 완화 |
all = |
1은 리더만 확인하므로 왕복이 짧아지지만 리더 장애 시 유실을 허용합니다 |
linger.ms |
5 |
↑ | ↓ (0) |
= | 배치를 모으는 시간입니다. 올리면 배치가 커져 처리량이 늘고 그만큼 지연이 늘어납니다 |
batch.size |
16384 |
↑ | = | = | linger.ms와 함께 올려야 효과가 있습니다. 이 값만 올리면 배치가 차기 전에 전송됩니다 |
compression.type |
none |
압축 적용 | 신중히 | 압축 적용 | 압축은 네트워크·디스크를 줄이고 CPU를 씁니다. 코덱별 압축률·CPU 수치는 공식 문서에 없으므로 아래 비교를 보고 직접 측정하세요 |
enable.idempotence |
true |
= | = | = | 세 조합 모두 유지합니다. 끌 이유가 없습니다 — 중복 제거와 순서 보장을 공짜로 얻습니다 |
max.in.flight.requests.per.connection |
5 |
= | = | = | 멱등성이 켜져 있으면 5가 상한입니다. 6 이상은 ConfigException |
delivery.timeout.ms |
120000 |
= | ↓ | ↑ | 재시도의 실질 상한입니다. 지연 우선은 빨리 포기하고 폴백, 내구성 우선은 끝까지 재시도합니다 |
buffer.memory |
33554432 |
↑ | = | = | 배치를 크게 모으려면 버퍼도 커야 합니다. 고갈되면 max.block.ms 동안 블록합니다 |
| Consumer | |||||
fetch.min.bytes |
1 |
↑ | = | = | 올리면 fetch 요청 수가 줄어 브로커 부하가 내려가고 지연이 늘어납니다 |
fetch.max.wait.ms |
500 |
= | ↓ | = | fetch.min.bytes가 안 차도 기다리는 상한입니다. 내리면 빈 응답이 늘어납니다 |
max.poll.records |
500 |
↑ | ↓ | ↓ | 내구성 우선에서 내리는 이유는 처리량이 아니라 한 배치의 처리 시간을 max.poll.interval.ms 안에 넣기 위해서입니다 |
enable.auto.commit |
true |
= | = | false |
자동 커밋은 처리 완료 전에 커밋될 수 있어 유실 위험이 있습니다. 정확성이 필요하면 처리 후 수동 커밋 |
isolation.level |
read_uncommitted |
= | = | read_committed |
트랜잭션 프로듀서를 쓰면서 이걸 안 바꾸면 abort된 레코드까지 읽습니다 |
auto.offset.reset |
latest |
= | = | none |
none은 커밋이 없을 때 조용히 건너뛰는 대신 예외로 알려 줍니다 |
| Broker · Topic | |||||
min.insync.replicas topic |
1 |
= | = | 2 (RF=3) |
acks=all과 함께여야만 의미가 있습니다. RF와 같게 두면 브로커 1대 손실로 쓰기가 멈춥니다 |
unclean.leader.election.enable |
false |
= | = | = | 세 조합 모두 false 유지입니다. 켜는 것은 유실을 허용하는 결정이며 처리량·지연과 무관합니다 |
num.replica.fetchers |
1 |
↑ | = | ↑ | 내구성 우선에서도 올립니다 — 복제가 빨라야 ISR이 유지되고 acks=all이 지연되지 않습니다 |
num.io.threads |
8 |
↑ | = | = | RequestHandlerAvgIdlePercent가 0.3 아래일 때만 올리세요. 디스크가 병목이면 무효입니다 |
num.network.threads |
3 |
↑ | = | = | NetworkProcessorAvgIdlePercent가 0.3 아래일 때만 올리세요 |
압축 코덱 선택
| 설정 | 기본값 | 허용 범위 | 메모 |
|---|---|---|---|
compression.type producer |
none |
none · gzip · snappy · lz4 · zstd |
압축은 배치 단위로 적용됩니다. 배치가 작으면 압축 효과도 작습니다 |
compression.type topic |
producer |
위 목록 + producer · uncompressed |
producer는 프로듀서가 압축한 배치를 그대로 보관합니다. 다른 값이면 브로커가 재압축해 CPU를 씁니다 |
compression.gzip.level |
-1 |
1~9 또는 -1 |
-1은 라이브러리 기본 레벨 |
compression.lz4.level |
9 |
1~17 |
|
compression.zstd.level |
3 |
-131072~22 |
# 같은 데이터로 코덱만 바꿔 처리량과 지연을 비교합니다.
# 압축률은 JMX 의 compression-rate-avg (압축후/압축전 비율) 로 확인합니다.
for codec in none lz4 zstd gzip snappy; do
echo "=== $codec"
bin/kafka-producer-perf-test.sh --bootstrap-server localhost:9092 --topic perf-test --num-records 500000 --record-size 1024 --throughput -1 --command-property compression.type=$codec --command-property batch.size=16384 --command-property linger.ms=5
done
# 참고: --producer-props / --producer.config 는 deprecated 입니다.
# 4.3 부터는 --command-property / --command-config 를 쓰세요.
# 출력의 "records/sec", "avg latency", "99th" 를 비교하고
# 브로커의 BytesInPerSec 감소량을 함께 보세요.
# CPU 는 브로커·클라이언트 양쪽 모두 확인해야 합니다.
Broker 설정
KRaft 기준입니다. Update Mode가 read-only인 설정은 재시작이 필요하고,
cluster-wide·per-broker는
kafka-configs --entity-type brokers --alter로 무중단 변경할 수 있습니다
(CLI 치트시트).
| 설정명 | 기본값 | 범위 · 타입 | 설명 | 튜닝 포인트 |
|---|---|---|---|---|
process.roles |
필수 · 기본값 없음 | list[broker, controller] |
KRaft 노드 역할. broker / controller / broker,controller(combined) |
프로덕션은 역할 분리를 권장합니다. combined는 개발·소규모 전용 |
node.id |
필수 · 기본값 없음 | int[0,...] |
KRaft 노드의 고유 정수 ID. 클러스터 내 유일해야 합니다 | 컨트롤러와 브로커가 ID 공간을 공유합니다. 재사용하면 등록이 거부됩니다 |
controller.quorum.bootstrap.servers |
""(빈 값) |
listnon-empty list |
컨트롤러 쿼럼을 찾기 위한 host:port 목록 |
4.x 권장 방식. 정적 controller.quorum.voters보다 유연합니다 |
controller.quorum.voters |
""(빈 값) |
listnon-empty list |
id@host:port 형식의 정적 투표자 목록 |
이 값을 쓰면 쿼럼 멤버가 고정됩니다. 동적 쿼럼은 bootstrap.servers 쪽을 씁니다 |
controller.listener.names |
필수 · 기본값 없음 | list |
컨트롤러 요청을 받는 리스너 이름. 브로커 전용 노드도 반드시 정의해야 합니다 | inter.broker.listener.name과 같은 값을 쓸 수 없습니다 |
controller.quorum.fetch.timeout.ms |
2000(2 seconds) |
int[0,...] |
팔로워가 리더 fetch 실패를 선거 트리거로 판단하는 시간 | 값을 늘리면 불필요한 재선거가 줄지만 실제 장애 감지가 늦어집니다 |
controller.quorum.election.timeout.ms |
1000(1 second) |
int[0,...] |
선거를 재시작하기 전 대기 시간 | 네트워크 지연이 큰 멀티 AZ에서는 상향 검토 |
controller.quorum.append.linger.ms |
25 |
int[0,...] |
메타데이터 레코드를 리더가 모아 두는 시간 | 낮추면 메타데이터 반영이 빨라지고 디스크 flush가 잦아집니다 |
metadata.log.dir |
null |
string |
__cluster_metadata 로그를 둘 디렉터리 |
미지정 시 log.dirs의 첫 디렉터리를 씁니다. 별도 디스크 분리를 권장 |
metadata.max.retention.bytes |
104857600(100 mebibytes) |
long |
메타데이터 로그·스냅샷 보관 크기 상한 | 스냅샷 주기와 함께 컨트롤러 디스크 사용량을 좌우합니다 |
metadata.log.max.record.bytes.between.snapshots |
20971520 |
long[1,...] |
스냅샷을 만들기까지 누적할 메타데이터 레코드 바이트 | 값이 크면 재시작 시 리플레이가 길어집니다 |
listeners |
PLAINTEXT://:9092 |
list |
브로커가 바인딩할 이름://호스트:포트 목록 |
내부/외부 분리는 여기서 시작합니다. 상세 패턴은 보안 치트시트 참조 |
advertised.listeners |
null |
list |
클라이언트에게 알릴 주소. 미지정이면 listeners 값을 그대로 알립니다 |
Docker·K8s에서 컨테이너 내부 주소를 그대로 알려 접속이 깨지는 원인 1위 |
listener.security.protocol.map |
SASL_SSL:SASL_SSL,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT |
string |
리스너 이름 → 보안 프로토콜 매핑 | 리스너에 커스텀 이름을 붙였으면 반드시 함께 지정해야 합니다 |
inter.broker.listener.name |
null |
string |
브로커 간 통신(주로 파티션 복제)에 쓰는 리스너 | 지정하지 않으면 security.inter.broker.protocol이 결정합니다 |
security.inter.broker.protocol |
PLAINTEXT |
string[PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL] |
브로커 간 통신 보안 프로토콜 | inter.broker.listener.name과 동시에 설정할 수 없습니다 |
log.dirs |
null |
list |
로그 세그먼트를 저장할 디렉터리 목록(콤마 구분) | 미지정이면 log.dir을 씁니다. JBOD는 여기에 여러 디렉터리를 나열 |
num.partitions |
1 |
int[1,...] |
자동 생성 토픽의 기본 파티션 수 | 소비 병렬성 상한. 운영 토픽은 명시 생성하세요 |
default.replication.factor |
1 |
int |
자동 생성 토픽의 기본 복제 계수 | 기본값 1은 브로커 한 대 손실로 데이터가 사라집니다. 3으로 올리세요 |
auto.create.topics.enable |
true |
boolean |
존재하지 않는 토픽 요청 시 자동 생성 | 오타 토픽이 조용히 생깁니다. 운영에서는 false 권장 |
delete.topic.enable |
true |
boolean |
토픽 삭제 허용 여부 | |
min.insync.replicas |
1 |
int[1,...] |
ISR 최소 개수. acks=all일 때만 판정에 쓰입니다 |
RF=3이면 2가 표준. RF와 같게 두면 브로커 1대 손실로 쓰기가 멈춥니다 |
unclean.leader.election.enable |
false |
boolean |
ISR 밖 레플리카를 리더로 승격할지 | true는 가용성을 위해 데이터 유실을 허용하는 선택입니다 |
replica.lag.time.max.ms |
30000(30 seconds) |
long |
팔로워가 이 시간 안에 따라오지 못하면 ISR에서 제외 | 너무 짧으면 ISR이 자주 흔들려 IsrShrinksPerSec가 튑니다 |
num.replica.fetchers |
1 |
int[1,...] |
팔로워가 리더에서 데이터를 당겨오는 스레드 수 | 복제 지연(URP 지속)이 보이면 먼저 올려 볼 값 |
replica.fetch.max.bytes |
1048576(1 mebibyte) |
int[0,...] |
파티션당 복제 fetch 최대 바이트 | 절대 상한이 아닙니다 — 첫 배치가 더 커도 반환해 복제 진행을 보장합니다(This is not an absolute maximum). 작으면 처리량만 떨어집니다 |
message.max.bytes |
1048588 |
int[0,...] |
Kafka가 허용하는 최대 레코드 배치 크기(압축 후) | 토픽의 max.message.bytes가 오버라이드합니다. 1MB가 아니라 1048588입니다 |
num.network.threads |
3 |
int[1,...] |
네트워크 요청 수신·응답 전송 스레드 수 | NetworkProcessorAvgIdlePercent가 0.3 아래면 상향 |
num.io.threads |
8 |
int[1,...] |
디스크 I/O를 포함한 요청 처리 스레드 수 | RequestHandlerAvgIdlePercent가 0.3 아래면 상향. 디스크 수 이상 권장 |
queued.max.requests |
500 |
int[1,...] |
네트워크 스레드가 대기시킬 요청 큐 길이 | 큐가 길면 지연이 숨겨집니다. 대기 시간 메트릭과 함께 보세요 |
background.threads |
10 |
int[1,...] |
백그라운드 작업 처리 스레드 수 | |
num.recovery.threads.per.data.dir |
2 |
int[1,...] |
비정상 종료 후 로그 복구에 쓰는 디렉터리당 스레드 수 | 재시작 시간을 줄이는 가장 직접적인 값 |
socket.send.buffer.bytes |
102400(100 kibibytes) |
int |
SO_SNDBUF 크기 | BDP가 큰 WAN 구간에서는 상향 |
socket.receive.buffer.bytes |
102400(100 kibibytes) |
int |
SO_RCVBUF 크기 | |
socket.request.max.bytes |
104857600(100 mebibytes) |
int[1,...] |
요청 하나의 최대 바이트 | message.max.bytes보다 충분히 커야 합니다 |
log.segment.bytes |
1073741824(1 gibibyte) |
int[1048576,...] |
세그먼트 파일 하나의 크기 | 리텐션 삭제는 세그먼트 단위입니다. 크면 실제 보관량이 설정보다 커집니다 |
log.roll.hours |
168 |
int[1,...] |
크기에 도달하지 않아도 세그먼트를 새로 여는 시간 | log.roll.ms가 있으면 그쪽이 우선합니다 |
log.retention.hours |
168 |
int |
delete 정책의 기본 보관 시간 |
log.retention.ms > log.retention.minutes > 이 값 순으로 우선 |
log.retention.bytes |
-1 |
long |
파티션당 보관 크기 상한. -1은 무제한 |
시간·크기 중 먼저 도달한 조건으로 삭제됩니다 |
log.retention.check.interval.ms |
300000(5 minutes) |
long[1,...] |
리텐션 조건을 검사하는 주기 | 이 주기 때문에 삭제가 즉시 일어나지 않습니다 |
log.cleanup.policy |
delete |
list[compact, delete] |
기본 정리 정책. delete / compact (조합 가능) |
토픽 레벨 cleanup.policy가 오버라이드합니다 |
log.cleaner.enable |
true |
boolean |
로그 컴팩션 스레드 활성화 | false면 __consumer_offsets도 컴팩션되지 않습니다 |
log.cleaner.threads |
1 |
int[0,...] |
컴팩션 스레드 수 | 컴팩션이 밀리면(dirty ratio 증가) 상향 |
log.cleaner.min.cleanable.ratio |
0.5 |
double[0,...,1] |
컴팩션을 시작할 dirty 비율 | 낮추면 더 자주 컴팩션되고 CPU·I/O를 더 씁니다 |
log.index.interval.bytes |
4096(4 kibibytes) |
int[0,...] |
오프셋 인덱스 항목을 추가하는 간격 | |
log.local.retention.ms |
-2 |
long[-2,...] |
Tiered Storage에서 로컬 디스크에 남길 시간. -2는 retention.ms를 따름 |
원격 계층을 켰을 때 로컬 디스크 사용량을 결정합니다 |
remote.log.storage.system.enable |
false |
boolean |
브로커에서 Tiered Storage 기능 활성화 | 켠 뒤 토픽별 remote.storage.enable로 개별 적용 |
offsets.topic.replication.factor |
3 |
short[1,...] |
__consumer_offsets 복제 계수 |
브로커 수가 이보다 적으면 토픽 생성이 실패합니다 |
offsets.topic.num.partitions |
50 |
int[1,...] |
__consumer_offsets 파티션 수 |
생성 후에는 변경하지 마세요. 그룹→파티션 매핑이 바뀝니다 |
offsets.retention.minutes |
10080 |
int[1,...] |
빈 그룹의 커밋 오프셋 보관 시간 | 만료되면 auto.offset.reset이 발동해 재처리·유실이 생깁니다 |
transaction.state.log.replication.factor |
3 |
short[1,...] |
__transaction_state 복제 계수 |
|
transaction.state.log.min.isr |
2 |
int[1,...] |
__transaction_state의 최소 ISR |
|
transaction.max.timeout.ms |
900000(15 minutes) |
int[1,...] |
프로듀서가 요청할 수 있는 트랜잭션 타임아웃 상한 | 프로듀서의 transaction.timeout.ms가 이 값을 넘으면 거부됩니다 |
transactional.id.expiration.ms |
604800000(7 days) |
int[1,...] |
트랜잭션 ID를 만료 처리하기까지의 유휴 시간 | |
producer.id.expiration.ms |
86400000(1 day) |
int[1,...] |
유휴 producer ID 만료 시간 | 만료 후 재사용하면 UnknownProducerIdException이 나올 수 있습니다 |
group.initial.rebalance.delay.ms |
3000(3 seconds) |
int |
첫 리밸런스를 지연시켜 멤버가 모이길 기다리는 시간 | 개발 환경에서는 0으로 두면 기동이 빨라집니다 |
group.min.session.timeout.ms |
6000(6 seconds) |
int |
컨슈머가 요청할 수 있는 세션 타임아웃 하한 | |
group.max.session.timeout.ms |
1800000(30 minutes) |
int |
컨슈머가 요청할 수 있는 세션 타임아웃 상한 | |
group.max.size |
2147483647 |
int[1,...] |
한 컨슈머 그룹의 최대 멤버 수 | |
group.coordinator.rebalance.protocols |
classic,consumer,streams |
list[consumer, classic, share, streams] |
코디네이터가 활성화할 그룹 프로토콜 목록 | consumer(KIP-848)·share(KIP-932)를 쓰려면 여기에 있어야 합니다 |
group.consumer.session.timeout.ms |
45000(45 seconds) |
int[1,...] |
새 컨슈머 프로토콜의 세션 타임아웃 (브로커가 관리) | group.protocol=consumer에서는 클라이언트 값이 무시됩니다 |
group.consumer.heartbeat.interval.ms |
5000(5 seconds) |
int[1,...] |
새 컨슈머 프로토콜의 하트비트 간격 (브로커가 관리) | |
group.share.delivery.count.limit |
5 |
int[2,...,10] |
Share Group에서 한 레코드의 최대 전달 시도 횟수 | 초과하면 레코드가 아카이브됩니다. DLQ 대체 설계 시 핵심 값 |
group.share.record.lock.duration.ms |
30000(30 seconds) |
int[1000,...,3600000] |
Share Group에서 획득한 레코드 잠금 유지 시간 | 처리 시간이 이보다 길면 다른 컨슈머에게 재배달됩니다 |
group.share.max.size |
200 |
int[1,...,1000] |
한 Share Group의 최대 멤버 수 | 컨슈머 수가 파티션 수를 넘어도 됩니다 |
auto.leader.rebalance.enable |
true |
boolean |
리더 불균형을 주기적으로 자동 교정 | 재시작 직후 리더가 한쪽에 몰리는 것을 자동 완화합니다 |
leader.imbalance.check.interval.seconds |
300 |
long[1,...] |
리더 불균형 검사 주기 | |
broker.rack |
null |
string |
브로커의 랙·AZ 식별자 | 지정하면 레플리카가 랙에 분산 배치됩니다. AZ 단위 장애 대비 |
broker.heartbeat.interval.ms |
2000(2 seconds) |
int |
브로커가 컨트롤러에 하트비트를 보내는 간격 | |
broker.session.timeout.ms |
9000(9 seconds) |
int |
컨트롤러가 브로커를 fenced로 판단하는 시간 | |
controlled.shutdown.enable |
true |
boolean |
종료 전 리더십을 넘기고 내려가기 | false면 재시작마다 짧은 불가용 구간이 생깁니다 |
compression.type |
producer |
string[uncompressed, zstd, lz4, snappy, gzip, producer] |
브로커가 저장할 때 적용할 압축. producer는 프로듀서 설정을 그대로 유지 |
producer가 아니면 재압축으로 CPU를 씁니다 |
max.connections |
2147483647 |
int[0,...] |
브로커 전체 최대 연결 수 | |
max.connections.per.ip |
2147483647 |
int[0,...] |
IP당 최대 연결 수 | NAT·K8s에서는 여러 클라이언트가 같은 IP로 보입니다 |
connections.max.idle.ms |
600000(10 minutes) |
long |
유휴 연결을 닫기까지의 시간 | |
authorizer.class.name |
""(빈 값) |
stringnon-null string |
Authorizer 구현 클래스. 미설정이면 인가를 하지 않습니다 | KRaft는 org.apache.kafka.metadata.authorizer.StandardAuthorizer |
ssl.client.auth |
none |
string[required, requested, none] |
리스너가 클라이언트 인증서를 요구할지 | requested는 잘못 설정된 클라이언트도 통과시켜 권장되지 않습니다 |
sasl.enabled.mechanisms |
GSSAPI |
list |
브로커가 받아들일 SASL 메커니즘 목록 | |
transaction.partition.verification.enable |
true |
boolean |
트랜잭션 파티션 검증 활성화 | |
log.dir.failure.timeout.ms |
30000(30 seconds) |
long[1,...] |
로그 디렉터리 장애를 컨트롤러에 알리지 못할 때 브로커를 내리는 시간 |
Topic 설정
| 설정명 | 기본값 | 범위 · 타입 | 설명 | 튜닝 포인트 |
|---|---|---|---|---|
cleanup.policy |
delete |
list[compact, delete] |
delete / compact / compact,delete |
기존 데이터에 소급 적용되지 않습니다. 변경 시점 이후 세그먼트에만 적용 |
retention.ms |
604800000(7 days) |
long[-1,...] |
delete 정책의 보관 시간. -1은 무제한 |
재처리 여유 기간을 결정합니다 |
retention.bytes |
-1 |
long |
파티션당 보관 크기. -1은 무제한 |
토픽 전체가 아니라 파티션당입니다 |
segment.bytes |
1073741824(1 gibibyte) |
int[1048576,...] |
세그먼트 파일 크기 | 삭제는 세그먼트 단위입니다. 짧은 리텐션을 원하면 이 값도 줄이세요 |
segment.ms |
604800000(7 days) |
long[1,...] |
크기 미달이어도 세그먼트를 새로 여는 주기 | 리텐션이 짧을 때 실제 삭제 시점을 좌우합니다 |
segment.index.bytes |
10485760(10 mebibytes) |
int[4,...] |
오프셋 인덱스 파일 크기 상한 | |
segment.jitter.ms |
0 |
long[0,...] |
세그먼트 롤링 시점에 더할 무작위 지연 | 여러 파티션이 동시에 롤링하는 것을 분산시킵니다 |
min.insync.replicas |
1 |
int[1,...] |
acks=all 쓰기가 성공하려면 필요한 최소 ISR |
RF=3 → 2. RF와 같게 두면 브로커 1대 손실로 쓰기 중단 |
unclean.leader.election.enable |
false |
boolean |
ISR 밖 레플리카의 리더 승격 허용 | 유실을 감수하고 가용성을 택하는 스위치 |
max.message.bytes |
1048588 |
int[0,...] |
이 토픽이 받는 최대 레코드 배치 크기(압축 후) | 브로커 message.max.bytes를 오버라이드합니다 |
compression.type |
producer |
string[uncompressed, zstd, lz4, snappy, gzip, producer] |
토픽 저장 압축. producer면 프로듀서 배치를 그대로 보관 |
|
min.cleanable.dirty.ratio |
0.5 |
double[0,...,1] |
컴팩션을 시작할 dirty 비율 | 낮추면 tombstone·중복 키가 더 빨리 사라집니다 |
min.compaction.lag.ms |
0 |
long[0,...] |
메시지가 컴팩션 대상이 되기까지 최소 유지 시간 | 컨슈머가 최신 레코드를 읽을 시간을 보장합니다 |
max.compaction.lag.ms |
9223372036854775807 |
long[1,...] |
컴팩션 대상이 되기까지 허용할 최대 시간 | GDPR 삭제 요구처럼 상한이 필요한 경우에 씁니다 |
delete.retention.ms |
86400000(1 day) |
long[0,...] |
tombstone(null value)을 유지하는 시간 | 이보다 오래 멈춘 컨슈머는 삭제 사실을 놓칩니다 |
file.delete.delay.ms |
60000(1 minute) |
long[0,...] |
삭제 표시된 파일을 실제로 지우기까지의 지연 | |
message.timestamp.type |
CreateTime |
string[CreateTime, LogAppendTime] |
CreateTime(프로듀서 시각) / LogAppendTime(브로커 시각) |
Streams의 이벤트 시간 처리와 리텐션 판정에 함께 영향 |
message.timestamp.after.max.ms |
3600000(1 hour) |
long[0,...] |
브로커 시각보다 미래인 타임스탬프 허용 폭 | 초과하면 InvalidTimestampException |
message.timestamp.before.max.ms |
9223372036854775807 |
long[0,...] |
브로커 시각보다 과거인 타임스탬프 허용 폭 | |
flush.messages |
9223372036854775807 |
long[1,...] |
이 메시지 수마다 fsync. 기본은 사실상 무제한 | Kafka는 복제로 내구성을 얻습니다. 임의로 낮추면 처리량이 급락합니다 |
flush.ms |
9223372036854775807 |
long[0,...] |
fsync 강제 주기 | |
index.interval.bytes |
4096(4 kibibytes) |
int[0,...] |
인덱스 항목 추가 간격 | |
preallocate |
false |
boolean |
새 세그먼트 파일을 미리 할당 | |
remote.storage.enable |
false |
boolean |
이 토픽에 Tiered Storage 사용 | 브로커에서 remote.log.storage.system.enable=true가 먼저 필요합니다 |
local.retention.ms |
-2 |
long[-2,...] |
원격 계층으로 올린 뒤 로컬에 남길 시간. -2는 retention.ms를 따름 |
|
local.retention.bytes |
-2 |
long[-2,...] |
로컬에 남길 크기. -2는 retention.bytes를 따름 |
|
remote.log.copy.disable |
false |
boolean |
원격 계층으로의 복사만 중단 | |
remote.log.delete.on.disable |
false |
boolean |
Tiered Storage를 끌 때 원격 데이터를 삭제할지 | |
leader.replication.throttled.replicas |
""(빈 값) |
list[partitionId]:[brokerId],[partitionId]:[brokerId],... |
리더 쪽 복제 대역폭 제한을 적용할 레플리카 목록 | 파티션 재할당 시 kafka-reassign-partitions가 자동으로 설정합니다 |
follower.replication.throttled.replicas |
""(빈 값) |
list[partitionId]:[brokerId],[partitionId]:[brokerId],... |
팔로워 쪽 복제 대역폭 제한 대상 | 재할당이 끝나면 반드시 제거하세요. 남으면 복제가 계속 느립니다 |
compression.gzip.level |
-1 |
int[1,...,9] or -1 |
gzip 압축 레벨 | |
compression.lz4.level |
9 |
int[1,...,17] |
lz4 압축 레벨 | |
compression.zstd.level |
3 |
int[-131072,...,22] |
zstd 압축 레벨 |
Producer 설정
4.x에서 기본값이 바뀐 항목(acks, enable.idempotence,
linger.ms)에 특히 주의하세요. 상세한 전송 파이프라인은
4장 Producer 심화에 있습니다.
| 설정명 | 기본값 | 범위 · 타입 | 설명 | 튜닝 포인트 |
|---|---|---|---|---|
bootstrap.servers |
필수 · 기본값 없음 | list |
초기 연결용 host:port 목록 |
부하 분산이 아니라 부트스트랩 단일 장애점 제거가 목적입니다. 2개 이상 |
key.serializer |
필수 · 기본값 없음 | class |
키 직렬화 클래스 | |
value.serializer |
필수 · 기본값 없음 | class |
값 직렬화 클래스 | |
acks |
all |
string[all, -1, 0, 1] |
쓰기 성공으로 볼 확인 수준. 0 / 1 / all |
4.x 기본값은 all입니다. 3.0 이전 자료의 1과 다릅니다 |
enable.idempotence |
true |
boolean |
멱등 프로듀서. 파티션 단위 중복 제거와 순서 보장 | 기본 true. acks=all·retries>0·in-flight ≤ 5가 필수 조건 |
max.in.flight.requests.per.connection |
5 |
int[1,...] |
응답 대기 중 허용할 요청 수 | 멱등성이 켜져 있으면 5 이하여야 합니다. 6 이상은 ConfigException |
retries |
2147483647 |
int[0,...,2147483647] |
전송 재시도 횟수 | 4.x 기본값은 Integer.MAX_VALUE. 실질 상한은 delivery.timeout.ms입니다 |
delivery.timeout.ms |
120000(2 minutes) |
int[0,...] |
send()부터 성공·실패 확정까지의 총 시간 |
request.timeout.ms + linger.ms 이상이어야 합니다. 재시도의 진짜 상한 |
request.timeout.ms |
30000(30 seconds) |
int[0,...] |
요청 하나에 대한 응답 대기 시간 | |
linger.ms |
5 |
long[0,...] |
배치를 채우기 위해 전송을 미루는 시간 | 4.0에서 0 → 5로 변경. 지연이 극도로 민감하면 명시적으로 0 |
batch.size |
16384 |
int[0,...] |
파티션별 배치의 바이트 상한 | 처리량을 올리려면 linger.ms와 함께 올려야 효과가 있습니다 |
buffer.memory |
33554432 |
long[0,...] |
전송 대기 레코드를 담는 총 버퍼 크기 | 고갈되면 max.block.ms 동안 블록한 뒤 예외 |
max.block.ms |
60000(1 minute) |
long[0,...] |
send()·partitionsFor()가 블록할 최대 시간 |
메타데이터 조회 실패도 이 값에 걸립니다 |
max.request.size |
1048576 |
int[0,...] |
요청 하나의 최대 바이트 | 토픽 max.message.bytes와 별개입니다. 둘 다 맞춰야 합니다 |
compression.type |
none |
string[none, gzip, snappy, lz4, zstd] |
none / gzip / snappy / lz4 / zstd |
lz4·zstd가 실무 기본 선택. 압축은 배치 단위입니다 |
compression.gzip.level |
-1 |
int[1,...,9] or -1 |
gzip 압축 레벨 | |
compression.lz4.level |
9 |
int[1,...,17] |
lz4 압축 레벨 | |
compression.zstd.level |
3 |
int[-131072,...,22] |
zstd 압축 레벨 | |
partitioner.class |
null |
class |
커스텀 파티셔너. 미지정이면 내장 로직 | 키가 있으면 키 해시, 없으면 배치 친화적으로 분배 |
partitioner.ignore.keys |
false |
boolean |
키를 무시하고 분배 | true로 두면 키 기반 순서 보장이 깨집니다 |
partitioner.adaptive.partitioning.enable |
true |
boolean |
브로커 응답성에 따라 분배를 조정 | |
partitioner.availability.timeout.ms |
0 |
long[0,...] |
이 시간 동안 응답 없는 파티션을 회피 (adaptive 필요) | |
transactional.id |
null |
stringnon-empty string |
트랜잭션 프로듀서 식별자. 지정하면 EOS 가능 | 인스턴스마다 안정적으로 같은 값이어야 좀비 펜싱이 동작합니다 |
transaction.timeout.ms |
60000(1 minute) |
int |
트랜잭션이 열려 있을 수 있는 최대 시간 | 브로커 transaction.max.timeout.ms를 넘으면 거부됩니다 |
transaction.two.phase.commit.enable |
false |
boolean |
2PC 스타일 외부 조정 트랜잭션 | |
metadata.max.age.ms |
300000(5 minutes) |
long[0,...] |
메타데이터 강제 갱신 주기 | |
metadata.max.idle.ms |
300000(5 minutes) |
long[5000,...] |
유휴 토픽의 메타데이터를 버리기까지의 시간 | |
metadata.recovery.strategy |
rebootstrap |
string(case insensitive) [REBOOTSTRAP, NONE] |
모든 노드 연결 실패 시 복구 방식 | |
retry.backoff.ms |
100 |
long[0,...] |
재시도 사이 대기 시간 | |
retry.backoff.max.ms |
1000(1 second) |
long[0,...] |
재시도 백오프 상한 | |
reconnect.backoff.ms |
50 |
long[0,...] |
재연결 대기 시간 | |
reconnect.backoff.max.ms |
1000(1 second) |
long[0,...] |
재연결 백오프 상한 | |
connections.max.idle.ms |
540000(9 minutes) |
long |
유휴 연결 종료 시간 | |
client.id |
""(빈 값) |
string |
요청에 실려 서버 로그·쿼터에 쓰이는 논리 이름 | 쿼터·메트릭 식별에 필수입니다. 반드시 설정하세요 |
client.dns.lookup |
use_all_dns_ips |
string[use_all_dns_ips, resolve_canonical_bootstrap_servers_only] |
DNS 결과 처리 방식 | |
interceptor.classes |
""(빈 값) |
list |
프로듀서 인터셉터 목록 | |
security.protocol |
PLAINTEXT |
string(case insensitive) [SASL_SSL, PLAINTEXT, SSL, SASL_PLAINTEXT] |
PLAINTEXT / SSL / SASL_PLAINTEXT / SASL_SSL |
|
sasl.mechanism |
GSSAPI |
string |
SASL 메커니즘 | 기본값이 GSSAPI이므로 SCRAM·PLAIN은 반드시 명시해야 합니다 |
sasl.jaas.config |
null |
password |
JAAS 로그인 설정을 프로퍼티로 인라인 지정 | |
ssl.keystore.location |
null |
string |
클라이언트 인증서 키스토어 경로 (mTLS) | |
ssl.truststore.location |
null |
string |
트러스트스토어 경로 | |
ssl.endpoint.identification.algorithm |
https |
string |
서버 호스트명 검증 알고리즘 | 빈 문자열로 두면 검증을 끕니다. 운영에서는 https 유지 |
ssl.protocol |
TLSv1.3 |
string |
SSLContext 프로토콜 | |
ssl.enabled.protocols |
TLSv1.2,TLSv1.3 |
list |
허용할 TLS 프로토콜 목록 | |
send.buffer.bytes |
131072(128 kibibytes) |
int[-1,...] |
SO_SNDBUF | |
receive.buffer.bytes |
32768(32 kibibytes) |
int[-1,...] |
SO_RCVBUF | |
metrics.recording.level |
INFO |
string[INFO, DEBUG, TRACE] |
메트릭 수집 상세도 | DEBUG로 올리면 파티션별 메트릭까지 나옵니다 |
enable.metrics.push |
true |
boolean |
브로커로 클라이언트 메트릭 푸시 (KIP-714) |
Consumer 설정
| 설정명 | 기본값 | 범위 · 타입 | 설명 | 튜닝 포인트 |
|---|---|---|---|---|
bootstrap.servers |
필수 · 기본값 없음 | list |
초기 연결용 host:port 목록 |
|
key.deserializer |
필수 · 기본값 없음 | class |
키 역직렬화 클래스 | 역직렬화 실패는 RecordDeserializationException으로 poll 루프를 막습니다 |
value.deserializer |
필수 · 기본값 없음 | class |
값 역직렬화 클래스 | |
group.id |
null |
string |
컨슈머 그룹 식별자 | 없으면 그룹 관리·오프셋 커밋을 못 합니다(assign() 전용) |
group.protocol |
classic |
string(case insensitive) [CONSUMER, CLASSIC] |
classic / consumer(KIP-848) |
기본값은 여전히 classic입니다. 4.0 GA지만 기본이 아닙니다 |
group.instance.id |
null |
stringnon-empty string |
정적 멤버십 ID | 지정하면 재시작이 리밸런스를 일으키지 않습니다(세션 타임아웃 내) |
group.remote.assignor |
null |
string |
브로커 측 할당자 이름 (새 프로토콜) | group.protocol=consumer에서만 의미가 있습니다 |
partition.assignment.strategy |
class org.apache.kafka.clients.consumer.RangeAssignor,class org.apache.kafka.clients.consumer.CooperativeStickyAssignor |
list |
할당 전략 목록 (classic 프로토콜) | 새 프로토콜에서는 무시됩니다. 협조적 리밸런스 전환은 롤링 2회 |
session.timeout.ms |
45000(45 seconds) |
int |
하트비트가 끊긴 뒤 멤버를 죽었다고 볼 시간 | heartbeat.interval.ms의 3배 이상 권장. 새 프로토콜에서는 브로커가 관리 |
heartbeat.interval.ms |
3000(3 seconds) |
int |
하트비트 전송 간격 | |
max.poll.interval.ms |
300000(5 minutes) |
int[1,...] |
연속된 poll() 사이 허용 시간 |
처리 시간이 길면 여기서 쫓겨납니다. 세션 타임아웃과 혼동 금지 |
max.poll.records |
500 |
int[1,...] |
poll() 한 번에 반환할 최대 레코드 수 |
리밸런스가 반복되면 가장 먼저 줄여 볼 값 |
enable.auto.commit |
true |
boolean |
주기적 오프셋 자동 커밋 | true는 처리 전 커밋 위험(유실). 정확성이 필요하면 수동 커밋 |
auto.commit.interval.ms |
5000(5 seconds) |
int[0,...] |
자동 커밋 주기 | |
auto.offset.reset |
latest |
string[latest, earliest, none, by_duration:PnDTnHnMn.nS] |
커밋된 오프셋이 없거나 범위를 벗어났을 때. earliest / latest / none / by_duration:… |
기본 latest. 새 그룹으로 붙으면 과거 데이터를 건너뜁니다 |
isolation.level |
read_uncommitted |
string[read_committed, read_uncommitted] |
read_uncommitted / read_committed |
EOS 파이프라인의 컨슈머는 반드시 read_committed. 기본값이 아닙니다 |
fetch.min.bytes |
1 |
int[0,...] |
브로커가 응답을 만들기 위해 모을 최소 바이트 | 올리면 요청 수가 줄고 지연이 늘어납니다 |
fetch.max.wait.ms |
500 |
int[0,...] |
fetch.min.bytes가 안 차도 기다릴 최대 시간 |
|
fetch.max.bytes |
52428800(50 mebibytes) |
int[0,...] |
한 fetch 요청의 최대 바이트(전체) | 첫 파티션의 첫 배치는 이 값을 넘어도 반환되어 진행이 보장됩니다 |
max.partition.fetch.bytes |
1048576(1 mebibyte) |
int[0,...] |
파티션당 fetch 최대 바이트 | 큰 레코드를 다루면 이 값과 max.message.bytes를 함께 맞춥니다 |
check.crcs |
true |
boolean |
레코드 CRC 검증 | 끄면 CPU를 아끼지만 손상 감지를 포기합니다 |
client.rack |
""(빈 값) |
string |
컨슈머의 랙 ID | 브로커 replica.selector.class와 함께 근접 레플리카에서 읽습니다 |
allow.auto.create.topics |
true |
boolean |
구독한 토픽이 없을 때 자동 생성 요청 | 오타 토픽을 만듭니다. false 권장 |
exclude.internal.topics |
true |
boolean |
패턴 구독에서 내부 토픽 제외 | |
default.api.timeout.ms |
60000(1 minute) |
int[0,...] |
타임아웃 인자가 없는 API의 기본 타임아웃 | |
request.timeout.ms |
30000(30 seconds) |
int[0,...] |
요청 응답 대기 시간 | |
metadata.max.age.ms |
300000(5 minutes) |
long[0,...] |
메타데이터 강제 갱신 주기 | 패턴 구독에서 새 토픽 발견 지연의 원인 |
metadata.recovery.strategy |
rebootstrap |
string(case insensitive) [REBOOTSTRAP, NONE] |
전 노드 연결 실패 시 복구 방식 | |
retry.backoff.ms |
100 |
long[0,...] |
재시도 대기 시간 | |
retry.backoff.max.ms |
1000(1 second) |
long[0,...] |
재시도 백오프 상한 | |
reconnect.backoff.ms |
50 |
long[0,...] |
재연결 대기 시간 | |
reconnect.backoff.max.ms |
1000(1 second) |
long[0,...] |
재연결 백오프 상한 | |
connections.max.idle.ms |
540000(9 minutes) |
long |
유휴 연결 종료 시간 | |
receive.buffer.bytes |
65536(64 kibibytes) |
int[-1,...] |
SO_RCVBUF | |
send.buffer.bytes |
131072(128 kibibytes) |
int[-1,...] |
SO_SNDBUF | |
client.id |
""(빈 값) |
string |
논리 클라이언트 이름 | 쿼터·메트릭 식별에 씁니다 |
client.dns.lookup |
use_all_dns_ips |
string[use_all_dns_ips, resolve_canonical_bootstrap_servers_only] |
DNS 결과 처리 방식 | |
interceptor.classes |
""(빈 값) |
list |
컨슈머 인터셉터 목록 | |
security.protocol |
PLAINTEXT |
string(case insensitive) [SASL_SSL, PLAINTEXT, SSL, SASL_PLAINTEXT] |
보안 프로토콜 | |
sasl.mechanism |
GSSAPI |
string |
SASL 메커니즘 | |
share.acknowledgement.mode |
implicit |
string[implicit, explicit] |
Share Group ack 방식. implicit / explicit |
KIP-932 Share Consumer 전용. 레코드 단위 ack 제어 |
share.acquire.mode |
BATCH_OPTIMIZED |
string[batch_optimized, record_limit] |
Share Group 레코드 획득 방식 | |
metrics.recording.level |
INFO |
string[INFO, DEBUG, TRACE] |
메트릭 수집 상세도 | |
enable.metrics.push |
true |
boolean |
브로커로 클라이언트 메트릭 푸시 |
Kafka Streams 설정
Streams는 내부적으로 프로듀서·컨슈머·Admin 클라이언트를 만들기 때문에
producer.·consumer.·admin. 접두어로
위의 클라이언트 설정을 그대로 넘길 수 있습니다.
DSL 연산자별 리파티션 유발 여부는 Streams 치트시트를 보세요.
| 설정명 | 기본값 | 범위 · 타입 | 설명 | 튜닝 포인트 |
|---|---|---|---|---|
application.id |
필수 · 기본값 없음 | string |
애플리케이션 식별자. 컨슈머 group.id와 내부 토픽 접두어로 쓰입니다 |
바꾸면 완전히 새 애플리케이션이 됩니다(상태·오프셋 초기화) |
bootstrap.servers |
필수 · 기본값 없음 | list |
초기 연결용 host:port 목록 |
|
num.stream.threads |
1 |
int |
인스턴스당 스트림 스레드 수 | 전체 병렬성 상한은 파티션 수입니다. 스레드를 그 이상 늘려도 유휴만 늘어납니다 |
processing.guarantee |
at_least_once |
string[at_least_once, exactly_once_v2] |
at_least_once / exactly_once_v2 |
기본값이 at_least_once입니다. EOS는 명시해야 켜집니다 |
replication.factor |
-1 |
int |
내부 토픽(changelog·repartition) 복제 계수. -1은 브로커 기본값 사용 |
운영에서는 3으로 명시하세요. 브로커 기본이 1이면 상태 유실 위험 |
state.dir |
${java.io.tmpdir} |
string |
RocksDB 상태 저장소 디렉터리 | 컨테이너에서 임시 볼륨을 쓰면 재시작마다 전체 복구가 일어납니다 |
num.standby.replicas |
0 |
int |
태스크별 hot standby 수 | 1로 두면 페일오버 복구 시간이 극적으로 줄어듭니다 |
max.warmup.replicas |
2 |
int[1,...] |
동시에 워밍업할 수 있는 태스크 수 | 스케일 아웃 속도와 복제 부하의 트레이드오프 |
acceptable.recovery.lag |
10000 |
long[0,...] |
태스크를 "따라잡았다"고 볼 changelog lag | 이 값 이내면 활성 태스크로 승격됩니다 |
probing.rebalance.interval.ms |
600000(10 minutes) |
long[60000,...] |
워밍업 진행을 확인하는 리밸런스 주기 | |
commit.interval.ms |
30000(30 seconds) |
long[0,...] |
오프셋·상태 커밋 주기 | exactly_once_v2에서는 이 값이 종단 지연의 하한이 됩니다 |
statestore.cache.max.bytes |
10485760(10 mebibytes) |
long[0,...] |
인스턴스 전체 상태 저장소 캐시 크기 | 크게 하면 downstream 갱신이 줄고(중간 결과 억제) 지연이 늘어납니다 |
cache.max.bytes.buffering |
10485760 |
long[0,...] |
(deprecated) 이전 이름의 캐시 설정 | 신규 코드에서는 statestore.cache.max.bytes를 쓰세요 |
poll.ms |
100 |
long |
내부 컨슈머 poll() 블록 시간 |
|
buffered.records.per.partition |
1000 |
int |
파티션당 버퍼링할 레코드 수 | |
max.task.idle.ms |
0 |
long |
한쪽 입력이 비었을 때 조인·병합에서 기다릴 시간 | 양쪽 토픽 시간 정렬이 필요한 조인에서 순서 오류를 줄입니다 |
task.timeout.ms |
300000(5 minutes) |
long[0,...] |
태스크가 재시도 가능한 오류로 멈춰 있을 수 있는 시간 | |
topology.optimization |
none |
string[all, none, reuse.ktable.source.topics, merge.repartition.topics, single.store.self.join] |
토폴로지 최적화. none / all 등 |
all은 불필요한 repartition 토픽을 줄입니다. 기존 앱에 켜면 호환 문제 주의 |
default.key.serde |
null |
class |
기본 키 Serde | |
default.value.serde |
null |
class |
기본 값 Serde | |
default.timestamp.extractor |
org.apache.kafka.streams.processor.FailOnInvalidTimestamp |
class |
기본 타임스탬프 추출기 | 기본은 잘못된 타임스탬프에서 실패합니다(FailOnInvalidTimestamp) |
deserialization.exception.handler |
org.apache.kafka.streams.errors.LogAndFailExceptionHandler |
class |
역직렬화 예외 처리기 | 기본은 로그 후 실패. 손상 레코드를 건너뛰려면 교체해야 합니다 |
production.exception.handler |
org.apache.kafka.streams.errors.DefaultProductionExceptionHandler |
class |
생산 예외 처리기 | |
processing.exception.handler |
org.apache.kafka.streams.errors.LogAndFailProcessingExceptionHandler |
class |
처리 로직 예외 처리기 | 기본은 로그 후 실패 |
processing.exception.handler.global.enabled |
false |
boolean |
전역 처리 예외 핸들러 활성화 | |
errors.dead.letter.queue.topic.name |
null |
string |
DLQ 토픽 이름 | 설정하지 않으면 DLQ가 동작하지 않습니다 |
default.dsl.store |
rocksDB |
string[rocksDB, in_memory] |
DSL 기본 저장소 타입 | in_memory로 바꾸면 디스크는 안 쓰지만 힙이 커집니다 |
dsl.store.suppliers.class |
org.apache.kafka.streams.state.BuiltInDslStoreSuppliers$RocksDBDslStoreSuppliers |
class |
DSL 저장소 공급자 클래스 | |
rocksdb.config.setter |
null |
class |
RocksDB 옵션 커스터마이저 | 블록 캐시·write buffer 튜닝 지점. 메모리 폭주의 원인이기도 합니다 |
windowstore.changelog.additional.retention.ms |
86400000(1 day) |
long |
윈도 스토어 changelog에 더할 추가 보관 시간 | |
repartition.purge.interval.ms |
30000(30 seconds) |
long[0,...] |
repartition 토픽 purge 요청 주기 | |
state.cleanup.delay.ms |
600000(10 minutes) |
long |
태스크 이관 후 로컬 상태를 지우기까지 대기 | |
rack.aware.assignment.strategy |
none |
string[none, min_traffic, balance_subtopology] |
랙 인식 태스크 할당 전략 | 멀티 AZ에서 크로스 AZ 트래픽 비용을 줄입니다 |
rack.aware.assignment.tags |
""(빈 값) |
listList containing maximum of 5 elements |
랙 인식에 쓸 클라이언트 태그 | |
application.server |
""(빈 값) |
string |
인터랙티브 쿼리용 host:port |
설정하면 다른 인스턴스로 쿼리를 라우팅할 수 있습니다 |
group.protocol |
classic |
string(case insensitive) [STREAMS, CLASSIC] |
Streams가 쓰는 그룹 프로토콜 | Streams Rebalance Protocol 관련. 기본은 classic |
task.assignor.class |
null |
string |
커스텀 태스크 할당자 | |
default.deserialization.exception.handler |
org.apache.kafka.streams.errors.LogAndFailExceptionHandler |
class |
(deprecated) 이전 이름의 역직렬화 예외 처리기 | 신규 코드에서는 deserialization.exception.handler를 쓰세요 |
log.summary.interval.ms |
120000(2 minutes) |
long |
요약 로그 출력 주기 | |
upgrade.from |
null |
string[null, 2.4, 2.5, 2.6, 2.7, 2.8, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 4.1, 4.2] |
롤링 업그레이드 시 이전 버전 표기 | 메이저 업그레이드에서 2단계 롤링에 필요합니다 |
ensure.explicit.internal.resource.naming |
false |
boolean |
내부 리소스 이름을 명시하도록 강제 | |
request.timeout.ms |
40000(40 seconds) |
int[0,...] |
요청 응답 대기 시간 | |
metrics.recording.level |
INFO |
string[INFO, DEBUG, TRACE] |
메트릭 수집 상세도 |
Kafka Connect 설정
REST API 전체 표와 SMT 목록은 Connect 치트시트에 있습니다.
| 설정명 | 기본값 | 범위 · 타입 | 설명 | 튜닝 포인트 |
|---|---|---|---|---|
bootstrap.servers |
필수 · 기본값 없음 | list |
초기 연결용 host:port 목록 |
|
group.id |
필수 · 기본값 없음 | string |
분산 모드 워커 그룹 ID | 컨슈머 그룹 ID와 겹치면 안 됩니다 |
key.converter |
필수 · 기본값 없음 | class |
키 컨버터 클래스 | 워커 기본값. 커넥터별로 오버라이드 가능합니다 |
value.converter |
필수 · 기본값 없음 | class |
값 컨버터 클래스 | JSON 컨버터는 schemas.enable도 함께 봐야 합니다 |
header.converter |
org.apache.kafka.connect.storage.SimpleHeaderConverter |
class |
헤더 컨버터 클래스 | |
config.storage.topic |
필수 · 기본값 없음 | string |
커넥터 설정을 저장할 내부 토픽 | 파티션 1개 · cleanup.policy=compact가 필수입니다 |
config.storage.replication.factor |
3 |
shortPositive number not larger than the number of brokers in the Kafka cluster, or -1 to use the broker's default |
설정 토픽 복제 계수 | |
offset.storage.topic |
필수 · 기본값 없음 | string |
source 커넥터 오프셋을 저장할 내부 토픽 | sink는 여기가 아니라 __consumer_offsets를 씁니다 |
offset.storage.partitions |
25 |
intPositive number, or -1 to use the broker's default |
오프셋 토픽 파티션 수 | |
offset.storage.replication.factor |
3 |
shortPositive number not larger than the number of brokers in the Kafka cluster, or -1 to use the broker's default |
오프셋 토픽 복제 계수 | |
status.storage.topic |
필수 · 기본값 없음 | string |
커넥터·태스크 상태를 저장할 내부 토픽 | |
status.storage.partitions |
5 |
intPositive number, or -1 to use the broker's default |
상태 토픽 파티션 수 | |
status.storage.replication.factor |
3 |
shortPositive number not larger than the number of brokers in the Kafka cluster, or -1 to use the broker's default |
상태 토픽 복제 계수 | |
offset.flush.interval.ms |
60000(1 minute) |
long |
오프셋 커밋 주기 | |
offset.flush.timeout.ms |
5000(5 seconds) |
long |
오프셋 커밋 완료 대기 시간 | 타임아웃이 반복되면 커밋이 계속 실패해 재처리가 늘어납니다 |
plugin.path |
null |
list |
커넥터 플러그인 디렉터리 목록 | 클래스로딩 격리의 근거. 여기에 없으면 커넥터가 보이지 않습니다 |
plugin.discovery |
hybrid_warn |
string(case insensitive) [ONLY_SCAN, SERVICE_LOAD, HYBRID_WARN, HYBRID_FAIL] |
플러그인 검색 모드 | |
listeners |
http://:8083 |
listList of comma-separated URLs, ex: http://localhost:8080,https://localhost:8443. |
REST 인터페이스 바인딩 주소 | |
rest.advertised.host.name |
null |
string |
다른 워커에게 알릴 호스트명 | 컨테이너에서 내부 주소를 알리면 워커 간 요청 전달이 깨집니다 |
rest.advertised.port |
null |
int |
다른 워커에게 알릴 포트 | |
rest.advertised.listener |
null |
string |
알릴 리스너(http/https) | |
admin.listeners |
null |
list |
관리용(/admin/loggers) 별도 리스너 |
|
connect.protocol |
sessioned |
string[eager, compatible, sessioned] |
워커 그룹 프로토콜 | sessioned는 워커 간 요청에 서명을 씁니다 |
scheduled.rebalance.max.delay.ms |
300000(5 minutes) |
int[0,...,2147483647] |
워커 이탈 시 태스크 재배치를 미루는 최대 시간 | 롤링 재시작 중 불필요한 재배치를 막습니다 |
rebalance.timeout.ms |
60000(1 minute) |
int |
리밸런스 완료 대기 시간 | |
session.timeout.ms |
10000(10 seconds) |
int |
워커 세션 타임아웃 | |
heartbeat.interval.ms |
3000(3 seconds) |
int |
워커 하트비트 간격 | |
task.shutdown.graceful.timeout.ms |
5000(5 seconds) |
long |
태스크 정상 종료 대기 시간 | |
exactly.once.source.support |
disabled |
string(case insensitive) [DISABLED, ENABLED, PREPARING] |
source 커넥터 EOS 지원. disabled / preparing / enabled |
전체 워커를 2단계 롤링으로 켜야 합니다 |
connector.client.config.override.policy |
All |
string |
커넥터가 클라이언트 설정을 덮어쓸 수 있는 범위 | None으로 좁히면 커넥터별 보안 설정을 막을 수 있습니다 |
topic.creation.enable |
true |
boolean |
커넥터의 토픽 자동 생성 허용 | |
topic.tracking.enable |
true |
boolean |
커넥터가 쓰는 토픽 추적 | GET /connectors/{name}/topics의 근거 데이터 |
topic.tracking.allow.reset |
true |
boolean |
토픽 추적 리셋 API 허용 | |
inter.worker.key.ttl.ms |
3600000(1 hour) |
int[0,...,2147483647] |
워커 간 서명 키 유효 기간 | |
name |
필수 · 기본값 없음 | stringnon-empty string without ISO control characters |
커넥터 이름 (커넥터 설정) | REST 경로에 그대로 들어갑니다. URL 안전한 이름을 쓰세요 |
connector.class |
필수 · 기본값 없음 | string |
커넥터 구현 클래스 (커넥터 설정) | |
tasks.max |
1 |
int[1,...] |
커넥터가 만들 최대 태스크 수 (커넥터 설정) | 실제 병렬성 상한은 source의 분할 단위, sink는 파티션 수입니다 |
tasks.max.enforce |
true |
boolean |
tasks.max를 초과하는 태스크 생성을 막을지 |
|
topics |
""(빈 값) |
list |
sink 커넥터가 읽을 토픽 목록 | topics.regex와 동시에 쓸 수 없습니다 |
topics.regex |
""(빈 값) |
stringvalid regex |
sink 커넥터가 읽을 토픽 정규식 | |
transforms |
""(빈 값) |
listnon-null string, unique transformation aliases |
SMT 별칭 목록 (적용 순서) | 별칭마다 transforms.{별칭}.type이 필요합니다 |
predicates |
""(빈 값) |
listnon-null string, unique predicate aliases |
SMT 조건 별칭 목록 | transforms.{별칭}.predicate + negate와 함께 씁니다 |
errors.tolerance |
none |
string[none, all] |
none / all |
none이면 첫 오류에서 태스크가 FAILED가 됩니다 |
errors.retry.timeout |
0 |
long |
실패한 작업을 재시도할 총 시간. 0은 재시도 없음 |
|
errors.retry.delay.max.ms |
60000(1 minute) |
long |
재시도 사이 최대 지연 | |
errors.log.enable |
false |
boolean |
오류를 로그로 남길지 | DLQ를 쓸 때도 켜 두면 원인 추적이 쉬워집니다 |
errors.log.include.messages |
false |
boolean |
로그에 레코드 내용을 포함할지 | 개인정보가 로그로 새어 나갈 수 있습니다 |
errors.deadletterqueue.topic.name |
""(빈 값) |
string |
DLQ 토픽 이름 (sink 전용) | 비워 두면 DLQ가 동작하지 않습니다. errors.tolerance=all과 함께 |
errors.deadletterqueue.topic.replication.factor |
3 |
short |
DLQ 토픽 복제 계수 | |
errors.deadletterqueue.context.headers.enable |
false |
boolean |
DLQ 레코드에 오류 컨텍스트 헤더 추가 | 원본 토픽·파티션·오프셋·예외를 헤더로 남깁니다. 반드시 켜세요 |
config.action.reload |
restart |
string[none, restart] |
외부 설정이 바뀔 때의 동작 | |
exactly.once.support |
requested |
string(case insensitive) [REQUIRED, REQUESTED] |
source 커넥터의 EOS 요구 수준 | |
transaction.boundary |
poll |
string(case insensitive) [INTERVAL, POLL, CONNECTOR] |
source EOS 트랜잭션 경계. poll / interval / connector |
|
offsets.storage.topic |
null |
stringnon-empty string |
커넥터별 오프셋 토픽 오버라이드 |
이어서 볼 곳
공식 문서 출처
이 페이지의 모든 기본값은 Apache Kafka 4.3.1 배포판에 포함된 공식 설정 문서에서 확인했습니다. 확인하지 못한 설정은 표에 넣지 않았습니다.
- Broker Configs
- Topic-Level Configs
- Producer Configs
- Consumer Configs
- Kafka Streams Configs
- Kafka Connect Configs
- Sink Connector Configs —
errors.*/ DLQ - Source Connector Configs —
transaction.boundary - Apache Kafka 4.3.1 배포 아카이브 —
kafka_2.13-4.3.1-site-docs.tgz