모종닷컴

카프카 모니터링 - 메트릭 본문

Programming/Apache Kafka

카프카 모니터링 - 메트릭

모종 2023. 12. 2. 16:25
반응형

카프카 메트릭

카프카 코드를 보다 보면 메트릭을 수집해서 특정 클래스에서 계속 계산하는 모습을 볼 수 있습니다. 해당 클래스들은 MBean을 상속받아 작성되어 있어서 내부 메트릭을 JMX를 통해 얻을 수 있습니다. 브로커 뿐만 아니라 KRaft 같은 메타데이터, Producer, Consumer 등의 메트릭도 모두 JMX를 이용할 수 있습니다. 다만 메트릭에 접근하기 위해서는 몇 가지 설정이 필요합니다.

Java Management Extensions (JMX)는 Java 애플리케이션을 모니터링하고 관리하기 위한 기술.
JMX는 MBean (Managed Bean)이라는 관리 가능한 자바 오브젝트를 사용하는데 애플리케이션은 이 MBean을 통해 다양한 정보와 작동 상태를 노출하며, 관리자 또는 모니터링 도구는 JMX 인터페이스를 통해 이러한 정보에 접근할 수 있습니다.

JMX 활성화

카프카의 실행 스크립트의 일부분을 보면 아래와 같습니다.

# JMX settings
if [ -z "$KAFKA_JMX_OPTS" ]; then
  KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false  -Dcom.sun.management.jmxremote.ssl=false "
fi

# JMX port to use
if [  $JMX_PORT ]; then
  KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT "
  if ! echo "$KAFKA_JMX_OPTS" | grep -qF -- '-Dcom.sun.management.jmxremote.rmi.port=' ; then
    # If unset, set the RMI port to address issues with monitoring Kafka running in containers
    KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT"
  fi
fi

카프카를 실행할 때 JMX_PORT 옵션을 사용해야 합니다. 좀 더 디테일한 상세 설정이 필요하다면 KAFKA_JMX_OPTS를 사용하면 됩니다. 
도커를 사용하는 경우 이와 같은 설정을 하면 됩니다.

version: "3.9"

services:
  kafka-1:
    container_name: kafka-1
    image: docker.io/bitnami/kafka:3.5
    ports:
      - 19092:9092
      - {{JMX포트}}:{{JMX포트}}
    environment:
      ...
	  ...
      # JMX
      - JMX_PORT={{JMX포트}}
      - KAFKA_JMX_OPTS=-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname={{호스트명}} -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.authenticate=false  -Dcom.sun.management.jmxremote.ssl=false

JMX 초기화과정

jmx, rmi 에 대해서 간단하게 알아보고 어떤 과정을 통해 실행되는지 흝어보면 도움이 될 것 같습니다. RMI(Remote Method Invocation)는 Java에서 원격 객체 간의 상호작용을 가능하게 하는 API입니다. rmi를 사용하면 로컬에서 네트워크를 통해 다른 JVM에 있는 객체의 메서드를 호출할 수 있습니다.
JMX, RMI는 아래와 같은 과정을 거쳐 최초 초기화됩니다.

  1. kafka가 실행하면서 jmx agent를 같이 실행
  2. jmx agent가 실행될 때 내부적으로 rmi server가 실행됨.
  3. kafka는 자신의 MBean인터페이스를 상속받은 메트릭 클래스들을 jmx agent에 등록

JMX Client 연결 

저의 경우 jmx port를 9999번으로 설정했고, rmi port를 9998번으로 설정하였습니다. 도커로 카프카를 실행했기에 컨테이너의 "9999" 포트를 호스트의 "9999" 포트로 매핑시켜 외부에 노출시켰습니다. 이후에 jmx client인 jconsole을 사용해 연결을 시도하니 계속 실패하였습니다.
이는 연결 과정을 알고나면 굉장히 어이없는 문제입니다. Jconsole이 jmx agent와 연결되는 과정은 아래와 같습니다.

  1. jconsole은 jmx 포트를 통해 jmx 서버에 연결을 시도
  2. jmx 서버는 jconsole에게 rmi 포트 정보를 제공
  3. jconsole은 전달받은 rmi 포트를 사용하여 jmx의 rmi 서버와 연결

따라서 위 문제는 jmx 포트 번호만 노출시킨다 해서 연결이 되는 게 아니라 rmi 포트도 노출시켜 주어야 해결이 가능합니다만 rmi와 jmx를 동일한 포트를 사용하도록 설정도 가능합니다. 위에서 KAFKA_JMX_OPTS에 `com.sun.management.jmxremote.rmi.port` 프로퍼티를 설정하지 않는 경우 JMX_PORT를 이용해서 rmi port, jmx port를 설정하도록 돼있으니 이점 유의해서 사용하면 됩니다.

Jconsole 실행

jconsole은 jdk에 이미 포함되어 있는 상태이기 때문에 자바가 이미 설치되어 있다면 터미널로 접속해서 "jconsole"을 입력해서 실행시켜 줄 수 있습니다. 

jconsole이 실행되었다면 접속 정보를 입력해주면 되는데 주의할 점은 hostname입니다. 원래 기본값은 localhost인데 저의 경우 도커컴포즈 환경 + jmx expoter 같은 추가적인 세팅을 하다 보니 문제가 좀 있어서 `java.rmi.server.hostname`을 kafka-1로 설정해 주었습니다. 그래서 로컬 hosts 파일에 kafka-1 -> localhost로 등록해주어야 했습니다. 해당 프로퍼티를 사용하지 않은 분이라면 그냥 localhost로 접속시도하면 됩니다.
접속이 완료되면 이제 아래와 같이 메트릭을 보실수 있을 겁니다.

반응형

'Programming > Apache Kafka' 카테고리의 다른 글

Quorum based Controller  (0) 2024.01.07
KRaft 합의 알고리즘  (0) 2024.01.07
Kafka Transaction  (0) 2023.11.18
Exactly Once Semantics  (0) 2023.11.05