Today
Total
KoreanEnglishFrenchGermanJapaneseSpanishChinese (Simplified)
관리 메뉴

DB & AWS Knowledge

Kafka server.property (config 설정) 관련 옵션들 - 1 본문

Kafka, MSK, Kinesis/아키텍처 및 내부 구조

Kafka server.property (config 설정) 관련 옵션들 - 1

`O` 2025. 7. 1. 03:10
728x90
반응형

이 페이지에서는 Kafka broker 들을 구성할 때, 튜닝을 고려 할 수 있는 server.property 옵션들에 대하여 다룬다.

 

이 페이지는 perplexity 를 통해 필자가 어떤 prompt 를 작성하여 공부하는지를 공유한다. ([] 로 표기)

또한, 검색이외에 추가로 덧붙일 내용은 ※ 로 추가한다.

 

AI 를 통해 관련된 자료를 검색하다보면 이전 게시글과 중복된 사항도 있으나 이는 복습 및 상기 차원에서 그대로 기재 되도록 한다.

또한, 출처 또한 동시에 표기한다.

 

[kafka server.properties 에서 자주 사용되는 옵션들을 알려줘]

 

Kafka 서버(브로커)에서 자주 사용되는 주요 옵션(properties)은 다음과 같다.

주요 Kafka Server Properties

옵션명타입기본값설명
broker.id int 0 브로커의 고유 식별자. 클러스터 내 각 브로커마다 중복되지 않아야 함1.
listeners string PLAINTEXT://:9092 브로커가 클라이언트 연결을 받을 수 있는 주소와 프로토콜 목록. 예: PLAINTEXT://:9092,SSL://:9093231.
advertised.listeners string null 클라이언트가 실제로 연결해야 하는 주소. 외부 클라이언트가 접근해야 할 경우 설정 필요21.
log.dirs string /tmp/kafka-logs 메시지 데이터가 저장되는 디렉터리 경로. 여러 경로 지정 가능231.
num.network.threads int 3 네트워크 요청을 처리하는 스레드 수341.
num.io.threads int 8 디스크 I/O 처리 스레드 수341.
num.recovery.threads.per.data.dir int 1 데이터 디렉터리마다 로그 복구에 사용되는 스레드 수341.
default.replication.factor int 1 새로 생성되는 토픽의 기본 복제 인자. 보통 3으로 설정41.
num.partitions int 1 새로 생성되는 토픽의 기본 파티션 수41.
log.retention.hours int 168 (7일) 로그(메시지)가 보관되는 최대 시간41.
log.segment.bytes int 1073741824 (1GB) 하나의 로그 세그먼트 파일의 최대 크기41.
zookeeper.connect string localhost:2181 ZooKeeper 연결 정보. 클러스터 내 ZooKeeper 서버 목록1.
auto.create.topics.enable boolean true 존재하지 않는 토픽에 대한 생성을 자동으로 허용할지 여부1.
 

참고

  • listenersadvertised.listeners는 클라이언트가 브로커에 접근하는 방식과 실제 연결 주소를 구분하여 설정할 때 중요하다21.
  • log.dirs는 여러 경로를 지정할 수 있어 데이터 저장 공간을 확장할 수 있다231.
  • num.network.threads, num.io.threads 등은 브로커의 성능 튜닝에 자주 사용된다341.
  • default.replication.factornum.partitions는 토픽의 내구성과 병렬 처리 능력에 영향을 준다41.
  • log.retention.hourslog.segment.bytes는 메시지 저장 정책을 결정한다41.

이 옵션들은 Kafka 브로커의 기본 동작, 성능, 내구성, 확장성에 큰 영향을 미친다.

  1. https://www.ibm.com/docs/en/oala/1.3.7?topic=collection-apache-kafka-broker-configuration-example
  2. https://docs.confluent.io/platform/current/installation/configuration/broker-configs.html
  3. https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.5/html-single/kafka_configuration_properties/index
  4. https://docs.redhat.com/en/documentation/red_hat_streams_for_apache_kafka/2.8/html/kafka_configuration_tuning/con-broker-config-properties-str
  5. https://www.ibm.com/docs/en/tivoli-netcoolimpact/7.1.0?topic=source-kafka-configuration-properties-file
  6. https://presentlee.tistory.com/12
  7. https://dev-youngjun.tistory.com/177
  8. https://kafka.apache.org/documentation/
  9. https://docs.redhat.com/ko/documentation/red_hat_streams_for_apache_kafka/2.5/html/using_amq_streams_on_rhel/assembly-configuring-kafka-str
  10. https://docs.confluent.io/platform/current/kafka/dynamic-config.html

 

※ RDBMS 에서 파라미터 사용에 익숙하다면 이를 연상하여 읽으면 된다.

 

[broker.id 가 필요한 이유]

 

broker.id는 Kafka 클러스터 내에서 각 브로커를 고유하게 식별하기 위해 반드시 필요한 값이다. 클러스터에 여러 브로커가 존재할 때, 각 브로커가 자신만의 고유한 숫자 ID를 가져야만 클러스터 관리, 메타데이터 동기화, 장애 복구, 파티션 할당 등 다양한 작업에서 서로를 명확히 구분할 수 있다156.

예를 들어, 브로커가 새로 추가되거나 장애가 발생했을 때 클러스터는 broker.id를 기준으로 해당 브로커를 식별하고, 메타데이터(예: 컨트롤러 정보, 파티션 할당 상태 등)를 올바르게 관리한다78. 만약 broker.id가 중복되면 클러스터 내에서 브로커를 구분할 수 없게 되어 시스템 오류나 데이터 불일치가 발생할 수 있다.

정리하면, broker.id는 Kafka 클러스터의 안정적이고 일관성 있는 운영을 위해 각 브로커에 반드시 설정해야 하는 고유 식별자다.

  1. https://always-kimkim.tistory.com/entry/kafka101-broker
  2. https://velog.io/@jaymin_e/Kafka-Kafka-Brokers
  3. https://jh-labs.tistory.com/391
  4. https://blog.naver.com/adamdoha/222183734423
  5. https://assu10.github.io/dev/2024/06/15/kafka-install/
  6. https://presentlee.tistory.com/12
  7. https://sjh9708.tistory.com/151
  8. https://g-study.tistory.com/214
  9. https://cla9.tistory.com/169
  10. https://yeon-kr.tistory.com/183

 

[listeners 가 필요한 이유와 advertised.listeners 와의 연관성]

 

listeners는 Kafka 브로커가 실제로 클라이언트의 연결 요청을 수신하는 네트워크 인터페이스와 포트를 지정하는 설정이다. 즉, 브로커가 어느 IP 주소나 호스트, 그리고 어떤 포트에서 메시지를 받을지 결정한다. 예를 들어, listeners=PLAINTEXT://localhost:9092로 설정하면 브로커는 로컬호스트의 9092 포트에서 PLAINTEXT 프로토콜로 들어오는 연결을 받게 된다123.

이 설정은 브로커가 클라이언트와 통신하기 위해 반드시 필요하다. 만약 listeners를 설정하지 않으면, 브로커는 외부에서 접근할 수 없게 된다2.

advertised.listeners는 브로커가 클라이언트(프로듀서, 컨슈머, 다른 브로커 등)에게 자신의 위치를 알릴 때 사용하는 주소다. 클라이언트는 이 정보를 바탕으로 브로커에 접속한다. 특히, 브로커가 내부 네트워크와 외부 네트워크에서 서로 다른 주소로 접근해야 할 때(예: 내부에서는 사설 IP, 외부에서는 퍼블릭 IP 또는 도메인 사용), advertised.listeners를 통해 외부 클라이언트가 올바른 주소로 접속할 수 있게 해준다145.

예를 들어,

  • listeners=PLAINTEXT://192.168.1.10:9092
  • advertised.listeners=PLAINTEXT://kafka.example.com:9092
    이렇게 설정하면, 브로커는 내부 네트워크(192.168.1.10)에서 실제로 연결을 받지만, 클라이언트는 kafka.example.com 주소로 연결을 시도하게 된다.

두 설정의 연관성은 다음과 같다.

  • listeners는 브로커가 실제로 바인딩하는 주소(수신 주소)다.
  • advertised.listeners는 클라이언트가 브로커에 접속할 때 사용할 주소(공개 주소)다.
  • advertised.listeners를 따로 지정하지 않으면, listeners 설정이 클라이언트에게도 그대로 전달된다15.

이렇게 분리함으로써 내부/외부 네트워크, 프록시, 로드밸런서 등 다양한 환경에서 Kafka 클러스터를 유연하게 운영할 수 있다.

  1. https://blog.voidmainvoid.net/500
  2. https://dortmoot.tistory.com/144
  3. https://shinwusub.tistory.com/133
  4. https://westlife0615.tistory.com/529
  5. https://godekdls.github.io/Apache%20Kafka/broker-configuration/
  6. https://parkcheolu.tistory.com/196
  7. https://sharplee7.tistory.com/144
  8. https://foulerback.tistory.com/26
  9. https://developer-pi.tistory.com/388
  10. https://bagbokman.tistory.com/16

 

Kafka listeners 는 프로토콜, 호스트 이름, 포트 양식으로 접속 설정이 된다. 구버전은 단순 포트 설정으로만 설정이 가능했다.

 

[log.dirs 와 num.recovery.threads.per.data.dir 와의 연관성]

 

log.dirsnum.recovery.threads.per.data.dir는 모두 Kafka 브로커가 데이터를 저장하고 관리하는 데 중요한 역할을 하며, 서로 밀접하게 연관되어 있다.

  • log.dirs
    • Kafka가 메시지를 저장하는 로그 디렉터리(폴더) 경로를 지정한다.
    • 여러 경로를 쉼표로 구분해 입력할 수 있으며, 이 경우 데이터가 여러 디렉터리로 분산 저장된다123.
  • num.recovery.threads.per.data.dir
    • 각 로그 디렉터리(즉, log.dirs에 지정된 각 경로)마다 로그 복구(시작/종료 시 데이터 검증 및 동기화)에 사용할 수 있는 스레드(쓰레드) 개수를 지정한다412.
    • 예를 들어, log.dirs에 3개의 경로가 있고, num.recovery.threads.per.data.dir=4로 설정하면 총 12개의 스레드가 복구 작업에 사용될 수 있다(그러나 실제로는 복구 작업이 각 디렉터리별로 병렬로 이루어지므로, 복구 속도가 빨라질 수 있다).

즉, log.dirs에 지정된 디렉터리 개수가 많아질수록 num.recovery.threads.per.data.dir 값이 전체 복구 스레드 수에 미치는 영향이 커진다.
이 두 설정은 함께 조정하여, 브로커 시작/종료 시 로그 복구 속도를 최적화할 수 있다.
실제 운영 환경에서는 여러 디렉터리를 사용해 I/O 병목을 줄이고, 복구 스레드 수를 늘려 복구 시간을 단축하는 것이 일반적이다.

  1. https://docs.confluent.io/platform/current/installation/configuration/broker-configs.html
  2. https://www.ibm.com/docs/ko/oala/1.3.8?topic=collection-configuring-apache-kafka-brokers
  3. https://data-engineer-tech.tistory.com/11
  4. https://velog.io/@mineru/Kafka-kafka-%EC%84%9C%EB%B2%84-%EC%84%A4%EC%A0%95
  5. https://strimzi.io/blog/2021/06/08/broker-tuning/
  6. https://stackoverflow.com/questions/53821671/kafka-broker-taking-too-long-to-come-up
  7. https://presentlee.tistory.com/12
  8. https://marrrang.tistory.com/21
  9. https://stackoverflow.com/questions/63544003/understanding-kafka-log-dirs
  10. https://docs.cloudera.com/runtime/7.3.1/kafka-managing/topics/kafka-manage-cli-logdir.html

 

[auto.create.topics.enable  에 대해서 더 알려줘]

 

auto.create.topics.enable는 Kafka 브로커의 중요한 설정 중 하나로, 존재하지 않는 토픽에 대해 메시지를 전송하거나 읽으려고 할 때 해당 토픽을 자동으로 생성할지 여부를 결정한다. 기본값은 true로, 별도로 지정하지 않으면 자동 생성이 활성화된다125.

이 옵션의 주요 특징과 주의점은 다음과 같다.

  • 자동 생성 동작
    • 프로듀서가 존재하지 않는 토픽으로 메시지를 발송하거나, 컨슈머가 존재하지 않는 토픽을 읽으려고 할 때 브로커가 토픽을 자동으로 생성한다.
    • 자동 생성되는 토픽의 파티션 수와 복제 인자(replication factor)는 각각 num.partitions, default.replication.factor 설정값을 따른다128.
  • 편의성 vs 관리
    • 개발 및 테스트 환경에서는 편의를 위해 자동 생성이 유용하다.
    • 운영 환경에서는 원치 않는 토픽이 생성되어 불필요한 리소스를 소모하거나, 잘못된 설정(파티션 수, 복제 인자 등)으로 성능에 영향을 줄 수 있으므로 false로 설정하는 것이 권장된다236.
  • 성능 및 관리 영향
    • 자동 생성된 토픽이 많아지면 브로커의 메타데이터 관리 부담이 커지고, 불필요한 파티션 증가로 인해 컨슈머의 데이터 읽기 지연(latency)이 발생할 수 있다36.
    • 복제 인자나 파티션 수가 기본값(1)으로 설정될 경우, 장애 내구성이나 병렬 처리 성능이 떨어질 수 있다.
  • 관리 팁
    • 운영 환경에서는 토픽을 명시적으로 생성해 관리하는 것이 바람직하다.
    • 자동 생성 기능을 끄고 싶다면 auto.create.topics.enable=false로 설정하면 된다6910.

정리하면, auto.create.topics.enable는 Kafka의 편의성을 높여주지만, 운영 안정성과 성능을 위해 신중히 사용해야 하는 옵션이다.

  1. https://ydeer.tistory.com/311
  2. https://rockintuna.tistory.com/265
  3. https://devidea.tistory.com/85
  4. https://learn.microsoft.com/ko-kr/azure/hdinsight/kafka/apache-kafka-auto-create-topics
  5. https://velog.io/@mineru/Kafka-kafka-%EC%84%9C%EB%B2%84-%EC%84%A4%EC%A0%95
  6. https://kjyun.tistory.com/142
  7. https://snowturtle93.github.io/posts/%EC%B9%B4%ED%94%84%EC%B9%B4-%ED%94%84%EB%A1%9C%EB%93%80%EC%84%9C/
  8. https://motti.tistory.com/entry/%EC%B9%B4%ED%94%84%EC%B9%B4Kafka-%ED%99%9C%EC%9A%A9%EC%A0%95%EB%A6%AC
  9. https://presentlee.tistory.com/12
  10. https://heodolf.tistory.com/11

 

728x90
반응형
Comments