← 학습 카테고리

Learn

Kafka

42개 모듈 · 현재 31번째

Kafka 모듈 31/42 kafka-learn-31

KRaft 모드에서 달라지는 설정·메트릭·기능

Apache Kafka Official Documentation — Getting Started (v4.3) — Apache Software Foundation Section 6: KRaft vs ZooKeeper — Differences Between KRaft mode and ZooKeeper mode (pp.34-40)

이 모듈을 다 읽으면

  • ZooKeeper 모드에서만 쓰이던 설정 카테고리(비밀번호 인코더, 컨트롤 플레인, graceful shutdown 등)가 KRaft에서 왜/어떻게 사라졌는지 설명할 수 있다.
  • KRaft 모드에서 동적 설정(dynamic config)을 브로커/컨트롤러에 적용하는 방법을 판단할 수 있다.
  • ZooKeeper 전용 JMX 메트릭이 KRaft의 어떤 대체 메트릭으로 이어지는지 설명할 수 있다.
  • CreateTopicPolicy/AlterConfigPolicy, KafkaPrincipalBuilder 등 커스텀 확장 지점이 KRaft에서 어떻게 달라지는지 설명할 수 있다.

KRaft 모드는 ZooKeeper 의존을 전제로 했던 설정·메트릭 카테고리를 통째로 제거하거나 대체 메트릭/설정으로 바꿨고, 정책 플러그인의 실행 위치도 브로커에서 컨트롤러로 옮겼다. ZooKeeper 시절의 운영 지식(설정명, 대시보드 지표)을 그대로 KRaft에 옮기면 상당수가 더 이상 존재하지 않는다는 점을 확인해야 한다.

제거된 ZooKeeper 전용 설정 카테고리

KRaft 모드에서는 ZooKeeper 의존을 전제로 했던 여러 설정 카테고리가 통째로 사라졌다.

비밀번호 인코더 설정(password.encoder.secret/old.secret/keyfactory.algorithm/cipher.algorithm/key.length/iterations)은 ZooKeeper에 민감정보를 암호화해 저장하기 위한 것이었다. KRaft 모드는 민감정보를 레코드(내부 토픽)에 저장하며 Kafka 자체적으로는 암호화하지 않는다.

control.plane.listener.name은 제거되고, 컨트롤러 간 통신은 controller.listener.names / listeners / listener.security.protocol.map으로 구성한다.

controlled.shutdown.max.retries / controlled.shutdown.retry.backoff.ms 같은 graceful shutdown 재시도 설정도 사라졌다 — KRaft에서는 쿼럼 컨트롤러가 리더 전환과 메타데이터 갱신을 자동으로 처리하므로 더 안정적인 종료가 가능해졌다.

reserved.broker.max.id / broker.id.generation.enable 등 브로커 ID 자동 생성 설정도 없어졌고, 대신 node.id로 서버를 식별한다.

inter.broker.protocol.version은 제거되고 metadata.version + bin/kafka-features.sh로 클러스터 기능 레벨을 관리한다.

zookeeper.connect를 비롯한 zookeeper.* 계열 설정(session/connection timeout, SSL 관련 등 20개 가까이) 전부 제거됐다.

핵심 포인트

  • password.encoder.* 설정이 사라졌다 — KRaft는 민감정보를 레코드에 저장하되 Kafka 차원의 암호화는 하지 않는다.
  • 브로커 ID 자동생성 설정 대신 node.id로 서버를 식별한다.
  • inter.broker.protocol.version 대신 metadata.version + kafka-features.sh로 기능 레벨을 관리한다.
  • zookeeper.* 계열 설정이 전부 제거됐다(연결/세션/SSL 관련 포함).

동적 설정 변경: 브로커와 컨트롤러 모두 대상

KRaft에서도 kafka-configs.sh로 프로세스를 재시작하지 않고 설정을 바꿀 수 있다. 브로커 로그 레벨을 바꾸는 명령 형식은 ZooKeeper 시절과 동일하게 --bootstrap-server를 쓰지만, 컨트롤러의 로그 레벨을 바꿀 때는 --bootstrap-controller 플래그를 써야 한다(이때도 entity-type은 broker-loggers로 지정하는 점이 헷갈리기 쉬운 부분이다). 브로커와 컨트롤러 역할을 함께 갖는 combined 노드는 로그 레벨 집합이 하나뿐이라 --bootstrap-server/--bootstrap-controller 어느 쪽으로 접근해도 무방하다.

컨트롤러 자체의 동적 설정(예: max.connections)도 클러스터 전체 브로커+컨트롤러에 함께 적용할 수 있다. 다만 4.3 이전 버전에서는 static quorum(고정 컨트롤러 목록)을 쓰는 경우에만 컨트롤러 동적 설정 변경이 지원됐다는 버전 제약이 있었다.

핵심 포인트

  • 브로커 로그 레벨 변경은 --bootstrap-server, 컨트롤러 로그 레벨 변경은 --bootstrap-controller를 쓰되 entity-type은 둘 다 broker-loggers다.
  • 컨트롤러 동적 설정(예: max.connections)은 클러스터 전체 브로커+컨트롤러에 함께 반영된다.
  • 4.3 이전에는 static quorum을 쓸 때만 컨트롤러 동적 설정 변경이 지원됐다.

메트릭 변화: ControlPlane*와 다수의 컨트롤러 JMX 지표 제거

ZooKeeper 모드 전용이던 ControlPlaneNetworkProcessorAvgIdlePercent / ControlPlaneExpiredConnectionsKilledCount는 KRaft에서 NetworkProcessorAvgIdlePercent / ExpiredConnectionsKilledCount로 대체됐다. 이 외에도 kafka.controller:type=ControllerChannelManager/ControllerEventManager/ControllerStats/KafkaController 아래의 지표 상당수(QueueSize, EventQueueTimeMs, LeaderElectionRateAndTimeMs, ZkMigrationState 등)와 ZooKeeper 세션/연결 관련 지표(kafka.server:type=SessionExpireListener/ZooKeeperClientMetrics 아래의 ZooKeeperDisconnectsPerSec, ZooKeeperRequestLatencyMs 등)가 통째로 사라졌다. ZooKeeper 기반 대시보드나 알림 규칙을 그대로 KRaft 클러스터에 옮기면 상당수 지표가 더 이상 수집되지 않는다는 점을 운영 관점에서 반드시 확인해야 한다.

핵심 포인트

  • ControlPlane 관련 메트릭은 NetworkProcessorAvgIdlePercent / ExpiredConnectionsKilledCount로 대체됐다.
  • ZooKeeper 기반 컨트롤러/세션 관련 JMX 지표 다수(수십 개)가 KRaft에서 완전히 사라졌다.
  • ZooKeeper 시절 모니터링 대시보드를 그대로 KRaft에 옮기면 결측 지표가 발생할 수 있다.

확장 지점(policy, principal builder)의 실행 위치 변화

CreateTopicPolicy와 AlterConfigPolicy 같은 정책 플러그인은 ZooKeeper 모드에서는 브로커에서 실행됐지만, KRaft에서는 컨트롤러에서 실행된다. 따라서 마이그레이션 시 정책 클래스의 JAR 파일을 브로커가 아니라 컨트롤러 노드에 배포하고, create.topic.policy.class.name / alter.config.policy.class.name 설정도 컨트롤러 쪽에 지정해야 한다. 또한 KafkaPrincipalBuilder를 커스텀 구현한 경우 KafkaPrincipalSerde까지 함께 구현하지 않으면 브로커가 요청을 컨트롤러로 포워딩하지 못한다. 그 외에도 설정 값 크기가 Short.MAX_VALUE로 제한되어, append 방식으로 그보다 큰 설정값을 만드는 것이 불가능해졌다.

핵심 포인트

  • CreateTopicPolicy/AlterConfigPolicy는 KRaft에서 브로커가 아닌 컨트롤러에서 실행되므로 정책 JAR을 컨트롤러에 배포해야 한다.
  • 커스텀 KafkaPrincipalBuilder는 KafkaPrincipalSerde도 함께 구현해야 브로커→컨트롤러 요청 포워딩이 동작한다.
  • 설정 값 크기가 Short.MAX_VALUE로 제한된다.