【问题标题】:Make JMX work with spotify/kafka Docker image使 JMX 与 spotify/kafka Docker 映像一起工作
【发布时间】:2017-05-30 05:38:12
【问题描述】:

我正在尝试让 JMX 与 spotify/kafka Docker 映像一起工作。

我有一个docker-compose.yml

version: '2'
services:
  my-kafka:
    image: spotify/kafka # Using this instead of wurstmeister's because it didn't work with /var/run/docker.sock on Windows while this one has integrated ZK and works
    hostname: my-kafka
    restart: unless-stopped
    ports:
      - "9092:9092" # Kafka
      - "2181:2181" # Zookeeper
      - "7203:7203" # JMX
    environment:
      KAFKA_ADVERTISED_HOST_NAME: my-kafka
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_OPTS: "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.rmi.port=7203 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=my-kafka"

然后我尝试使用jconsole my-kafka:7203 对其进行测试,并收到“连接失败:在 JRMP 连接建立期间出错;嵌套异常是:java.io.EOFException。'立即地。相比之下,使用不存在的主机会导致“未知主机”,而使用不同的端口会导致“连接被拒绝”。

docker ps 显示:

692eb6659aba        spotify/kafka                 "supervisord -n"         10 minutes ago      Up 10 minutes               0.0.0.0:2181->2181/tcp, 0.0.0.0:7203->7203/tcp, 0.0.0.0:9092->9092/tcp                       docker_my-kafka_1

ps aux在容器内显示:

root        11  1.8  3.3 5718844 274608 ?      Sl   06:16   0:12 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -Xmx1G -Xms1G -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+DisableExplicitGC -Djava.awt.headless=true -Xloggc:/opt/kafka_2.11-0.10.1.0/bin/../logs/kafkaServer-gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false ...offtopic skipped... -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.rmi.port=7203 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=my-kafka kafka.Kafka /opt/kafka_2.11-0.10.1.0/config/server.properties

容器日志很无聊,甚至没有提到JMX,以“kafka进入RUNNING状态,进程已停留>超过1秒(startsecs)”结束。

有一个相关的问题kafka monitoring using JMX when running kafka in docker in boot2docker,但我更愿意坚持spotify/kafka,以便 ZK 和 Kafka 生活在同一个容器中。

【问题讨论】:

    标签: docker apache-kafka docker-compose spotify jmx


    【解决方案1】:

    您能否尝试在属性中指定主机地址(您正在运行docker run):

    -Djava.rmi.server.hostname=xx.xx.xx.xx
    

    【讨论】:

    • 结果和之前一模一样: Connection failed: error during JRMP connection建立;嵌套异常是:java.io.EOFException。如果可行,将其放入 docker-compose.yml 文件也很麻烦。
    【解决方案2】:

    jmx 选项已经存在于spotify/kafka docker 镜像的启动脚本/opt/kafka_2.11-0.10.1.0/bin/kafka-run-class.sh 中。 您可以从容器内部对它们进行 grep 处理

    grep jmx /opt/kafka_2.11-0.10.1.0/bin/kafka-run-class.sh
    

    你会在容器内 jvm 进程的 java 选项的开头看到它们

    ps -ef java
    

    所以,在docker-compose.yml 中设置JMX_PORT 环境变量并删除额外的(重复的)KAFKA_OPTS 就足够了。

    version: '2'
    services:
      my-kafka:
        image: spotify/kafka # Using this instead of wurstmeister's because it didn't work with /var/run/docker.sock on Windows while this one has integrated ZK and works
        hostname: my-kafka
        restart: unless-stopped
        ports:
          - "9092:9092" # Kafka
          - "2181:2181" # Zookeeper
          - "7203:7203" # JMX
        environment:
          KAFKA_ADVERTISED_HOST_NAME: my-kafka
          KAFKA_ADVERTISED_PORT: 9092
          JMX_PORT: 7203
    

    然后在启动一个新容器并在您的主机中解析 my-kafka 后,jconsole my-kafka:7203 将连接到容器的 jmx 端口。

    【讨论】:

    • 您对重复选项非常正确,但由于某种原因,'jconsole' 仍然无法连接 - 现在它只是在连接时挂起:/.
    • 我在我的电脑上试过(Ubuntu Linux + Oracle JDK v. 1.8),它可以工作。检查您的 jconsole / jdk 版本。容器运行 1.8.x。
    • 1.8.0_112-b16 MacOS X 上的 Oracle JDK,我在容器中运行 jconsole, OpenJDK 1.8.0_111-8u111-b14-2~bpo8+1-b14。你如何运行jconsole,你填写了什么?我不需要用户名/密码,对吗?
    • 我的 Cassandra 容器运行完全相同的 1.8.0_111-8u111-b14-2~bpo8+1-b14 并且 JMX 可以正常工作(诚然,我创建了一个 jmxremote.password 文件并在其中使用了 com.sun.management.jmxremote.authenticate=true,所以它是不同的)。只是我不认为这是 JDK 不兼容,因为我当时也遇到过。
    • 我运行“jconsole 172.20.0.2:7203”,其中 172.20.0.2 是从“docker inspect kafka_my-kafka_1”获取的容器 IP。但是 docker 网络在 linux 和 macos 之间有所不同。无论如何,我从 jconsole 收到一条消息“安全连接失败。不安全地重试?”并且在选择“不安全的连接”之后它可以工作。为什么你不使用 jvisualvm 而不是 jconsole?如果你运行 jvisualvm 添加远程主机然后添加 JMX 远程连接,你可以选择不安全的连接。可能在您的环境中更好。
    【解决方案3】:

    Docker 容器在您机器内的 IP 集上运行。要查看这些,请运行:

    docker inspect docker_my-kafka_1

    这将输出机器正在处理的IP,例如:

    "IPAddress": "172.17.0.2",

    您需要将上面找到的 IP 添加到:

    -Djava.rmi.server.hostname=$INSERT_IP_HERE

    【讨论】:

    • 这意味着每次切换开发环境时都要重新生成 docker-compose.yml 文件。这听起来不是一个好方法。
    • 不幸的是,如果您没有适当的配置管理,这就是您必须这样做的方式。
    【解决方案4】:

    如果您更喜欢使用 ZK 和 Kafka 都位于同一个容器中的解决方案,请查看 https://github.com/Landoop/fast-data-dev

    这个 docker 专注于提供出色的 Kafka Development Environment,因此它公开了所有 JMX

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 2018-01-23
      • 2021-11-15
      • 2018-11-03
      • 1970-01-01
      相关资源
      最近更新 更多