데이터 노트

[Docker Compose] Kafka-Prometheus-Grafana 브로커/exporter 컨테이너 올라오지 않는 오류 본문

Data Engineering/Docker

[Docker Compose] Kafka-Prometheus-Grafana 브로커/exporter 컨테이너 올라오지 않는 오류

돌돌찐 2024. 6. 5. 23:49

문제 상황

docker-compose.yml 파일을 생성했다.

그리고 컨테이너를 올리는데 kafka 브로커 3개와 jmx-exporter 3개 다 안 올라왔다.

 

오류 찾기 & 해결 과정

  1. 실패한 컨테이너 오류 확인
    • 먼저 브로커 컨테이너 로그를 확인했다.
    • 오류 내용
      •  
      • 더보기
        ===> Launching ...
        ===> Launching kafka ...
        Error: Could not find or load main class '-Xmx1G'
        Caused by: java.lang.ClassNotFoundException: '-Xmx1G'
    • jmx-exporter 컨테이너 로그 확인.
    • 오류 내용 
      • 더보기
        Error: Could not find or load main class '-Xmx128m'
  2. 오류 원인
    • 브로커 컨테이너 : KAFKA_HEAP_OPTS 환경 변수를 제대로 인식하지 못해서 발생하는 문제
    • jmx-exporter 컨테이너 : JVM_OPTS 메모리 환경 변수 인식 오류
  3. 해결
    • 브로커 컨테이너 설정
      • 기존 : KAFKA_HEAP_OPTS: "${KAFKA_BROKER_HEAP_OPTS:-'-Xmx1G'}"
      • 변경 : KAFKA_HEAP_OPTS: “-Xmx1G"
    • jmx-exporter 컨테이너 설정
      • 기존 : JVM_OPTS: "${PROMETHEUS_JMX_AGENT_JVM_OPTS:-'-Xmx128m'}"
      • 변경 : JVM_OPTS: "-Xmx128m"

해결 완료

최종 docker-compose.yml

services:
  grafana:
    image: "grafana/grafana:9.4.7"
    ports:
      - "3100:3000"
    environment:
      GF_PATHS_DATA: /var/lib/grafana
      GF_SECURITY_ADMIN_PASSWORD: {password}
    volumes:
      - ./grafana/provisioning:/etc/grafana/provisioning
      - ./grafana/dashboards:/var/lib/grafana/dashboards
    container_name: grafana
    depends_on:
      - prometheus

  prometheus:
    image: "bitnami/prometheus:latest"
    ports:
      - "9091:9090"
    volumes:
      - {path}/etc/prometheus:/etc/prometheus
    command: "--config.file=/etc/prometheus/prometheus.yml"
    container_name: prometheus

  jmx-kafka101:
    image: "sscaling/jmx-prometheus-exporter"
    ports:
      - "5556:5556"
    environment:
      CONFIG_YML: "/etc/jmx_exporter/config.yml"
      JVM_OPTS: "-Xmx128m"
    volumes:
      - ./etc/jmx_exporter/config_kafka101.yml:/etc/jmx_exporter/config.yml
    container_name: jmx-kafka101
    depends_on:
      - kafka101

  jmx-kafka102:
    image: "sscaling/jmx-prometheus-exporter"
    ports:
      - "5557:5556"
    environment:
      CONFIG_YML: "/etc/jmx_exporter/config.yml"
      JVM_OPTS: "-Xmx128m"
    volumes:
      - ./etc/jmx_exporter/config_kafka102.yml:/etc/jmx_exporter/config.yml
    container_name: jmx-kafka102
    depends_on:
      - kafka102

  jmx-kafka103:
    image: "sscaling/jmx-prometheus-exporter"
    ports:
      - "5558:5556"
    environment:
      CONFIG_YML: "/etc/jmx_exporter/config.yml"
      JVM_OPTS: "-Xmx128m"
    volumes:
      - ./etc/jmx_exporter/config_kafka103.yml:/etc/jmx_exporter/config.yml
    container_name: jmx-kafka103
    depends_on:
      - kafka103

  zk1:
    image: confluentinc/cp-zookeeper:7.4.1
    environment:
      ZOOKEEPER_CLIENT_PORT: 2182
      ZOOKEEPER_TICK_TIME: 2000
      ZOOKEEPER_INIT_LIMIT: 5
      ZOOKEEPER_SYNC_LIMIT: 2
    ports:
      - "2182:2181"
    container_name: zookeeper1

  kafka101:
    image: confluentinc/cp-kafka:7.4.1
    depends_on:
      - zk1
    ports:
      - "9095:9092"
      - "9995:9991"
    container_name: kafka101
    environment:
      KAFKA_BROKER_ID: 101
      KAFKA_JMX_PORT: 9991
      KAFKA_ZOOKEEPER_CONNECT: zk1:2182
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka101:29092,PLAINTEXT_HOST://localhost:9095
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
      CONFLUENT_METRICS_REPORTER_BOOTSTRAP_SERVERS: kafka101:29092
      CONFLUENT_METRICS_REPORTER_ZOOKEEPER_CONNECT: zk1:2182
      CONFLUENT_METRICS_REPORTER_TOPIC_REPLICAS: 1
      CONFLUENT_METRICS_ENABLE: 'false'
      KAFKA_HEAP_OPTS: "-Xmx1G"
    deploy:
      resources:
        limits:
          memory: "1G"

  kafka102:
    image: confluentinc/cp-kafka:7.4.1
    depends_on:
      - zk1
    ports:
      - "9096:9092"
      - "9996:9992"
    container_name: kafka102
    environment:
      KAFKA_BROKER_ID: 102
      KAFKA_JMX_PORT: 9992
      KAFKA_ZOOKEEPER_CONNECT: zk1:2182
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka102:29092,PLAINTEXT_HOST://localhost:9096
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
      CONFLUENT_METRICS_REPORTER_BOOTSTRAP_SERVERS: kafka102:29092
      CONFLUENT_METRICS_REPORTER_ZOOKEEPER_CONNECT: zk1:2182
      CONFLUENT_METRICS_REPORTER_TOPIC_REPLICAS: 1
      CONFLUENT_METRICS_ENABLE: 'false'
      KAFKA_HEAP_OPTS: "-Xmx1G"
    deploy:
      resources:
        limits:
          memory: "1G"

  kafka103:
    image: confluentinc/cp-kafka:7.4.1
    depends_on:
      - zk1
    ports:
      - "9097:9092"
      - "9997:9993"
    container_name: kafka103
    environment:
      KAFKA_BROKER_ID: 103
      KAFKA_JMX_PORT: 9993
      KAFKA_ZOOKEEPER_CONNECT: zk1:2182
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka103:29092,PLAINTEXT_HOST://localhost:9097
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
      CONFLUENT_METRICS_REPORTER_BOOTSTRAP_SERVERS: kafka103:29092
      CONFLUENT_METRICS_REPORTER_ZOOKEEPER_CONNECT: zk1:2182
      CONFLUENT_METRICS_REPORTER_TOPIC_REPLICAS: 1
      CONFLUENT_METRICS_ENABLE: 'false'
      KAFKA_HEAP_OPTS: "-Xmx1G"
    deploy:
      resources:
        limits:
          memory: "1G"

 

추가 지식!

  • heap
    • 힙(heap)은 Java 가상 머신(JVM)에서 동적으로 할당되는 메모리 영역 중 하나.
    • → 이 영역은 새로운 객체를 생성하고, 사용되지 않는 객체를 회수하는 가비지 컬렉션의 대상이 된다.
    • 힙 크기는 JVM이 힙에 할당할 수 있는 최대 메모리 양.→ Error-2 보면 "-Xmx128m"
    • -> -Xmx 옵션을 사용하여 JVM에 할당되는 힙의 최대 크기를 지정할 수 있으며, 이 값은 일반적으로 메가바이트 또는 기가바이트 단위로 지정된다.
    • 힙 크기는 애플리케이션의 성능과 메모리 사용에 영향을 미친다.
    • → 충분한 힙 공간을 할당하면 애플리케이션이 메모리 부족으로 인한 예외를 방지할 수 있지만, 너무 큰 힙을 할당하면 가비지 컬렉션의 오버헤드가 발생할 수 있어 적절한 힙 크기를 선택하는 것이 중요.
  • -Xmx 옵션
    • -X : JVM에게 전달되는 특별한 옵션
    • mx : 최대 힙 크기 maximum heap size

드디어 그라파나 메인 화면을 볼 수 있게 되었다.. 

작은 전진.. 소확행

 

 

앞으로 여기에 잘 채워나가보자.

 


Ref.