【问题标题】:Cassandra on Docker - nodetool connection issueDocker 上的 Cassandra - nodetool 连接问题
【发布时间】:2015-08-25 10:27:25
【问题描述】:

我接到了一项在 Docker 上运行 Cassandra 的研发任务。我正在开发 XUbuntu 14.04.2 64 位(安装在 Windows7 32 位操作系统的 VirtualBOX 上)。

我按照Docker on UbuntuPokle cassandra 教程中给出的步骤操作,当我尝试使用nodetool 检查特定节点的状态时,我得到了一个ConnectException

以下是我执行的步骤列表。

asela@teamlk:~$ docker run -d --name cass1 poklet/cassandra start
7b2ddfb60adf1c270a425c4440fe263e1fe56f5dc1c3205372bee3b8626e0624

asela@teamlk:~$ docker run -d --name cass2 poklet/cassandra start $(/data/cassandra/scripts/ipof.sh cass1)
4f98a194214e603242279226bb94cee20774058e84b6d0171a8d14d648e19016

asela@teamlk:~$ docker run -d --name cass3 poklet/cassandra start $(/data/cassandra/scripts/ipof.sh cass1)
394f9ce918121c0b79ed8282ba95c8f1badd4e3536d4ad3f24c4c21651e50b3c

asela@teamlk:~$ docker ps
CONTAINER ID        IMAGE                     COMMAND              CREATED              STATUS              PORTS                                                                      NAMES
394f9ce91812        poklet/cassandra:latest   "start 172.17.0.1"   6 seconds ago        Up 3 seconds        22/tcp, 7000-7001/tcp, 7199/tcp, 8012/tcp, 9042/tcp, 9160/tcp, 61621/tcp   cass3               
4f98a194214e        poklet/cassandra:latest   "start 172.17.0.1"   31 seconds ago       Up 29 seconds       22/tcp, 7000-7001/tcp, 7199/tcp, 8012/tcp, 9042/tcp, 9160/tcp, 61621/tcp   cass2               
7b2ddfb60adf        poklet/cassandra:latest   "start"              About a minute ago   Up About a minute   22/tcp, 7000-7001/tcp, 7199/tcp, 8012/tcp, 9042/tcp, 9160/tcp, 61621/tcp   cass1               

asela@teamlk:~$ docker run -i -t poklet/cassandra nodetool -h $(/data/cassandra/scripts/ipof.sh cass1) status
nodetool: Failed to connect to '172.17.0.1:7199' - ConnectException: 'Connection refused'.

ifconfig 显示我的 Docker 正在 172.17.42.1 上运行

谁能告诉我我是否遗漏了任何配置和/或我做错了什么?

【问题讨论】:

  • 您解决了这个问题吗?我现在正在为此苦苦挣扎:(
  • @Aides 我刚刚放弃使用 Cassandra 和 docker。我只是单独安装了 Cassandra。它工作正常。真的很抱歉,帮不了你。 :(
  • 实际上看起来我至少已经为自己解决了这个问题。这是详细信息。 github.com/pokle/cassandra/pull/28我打算尽快将更改上传到存储库中。
  • @Aides:你会考虑对你的发现给出答案吗?它可能对某人有帮助。谢谢!
  • 如果从以下答案的语言中不清楚,问题是您在调用 nodetool 时需要使用“exec”而不是“run”。 Docker(和 docker-compose)将启动一个新容器来“运行”命令,但在使用“exec”时连接到现有的、正在运行的容器。由于您想在 localhost 上连接到正在运行的 cassandra,因此您需要 exec。

标签: ubuntu cassandra docker nodetool connectexception


【解决方案1】:

我正在使用 Fedora 22,但我不明白为什么它不能在 Ubuntu 上运行。

我遇到了完全相同的问题,以下命令对我有用:

docker exec cass-1 nodetool status

请注意,cass1 是 cassandra 节点的 docker 容器的名称,用于代替 IP 地址。

我的输出:

Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address      Load       Tokens  Owns (effective)  Host ID                               Rack
UN  172.17.0.14  51.6 KB    256     100.0%            3dec79f4-4a6f-46e6-b4d5-14b8f56b6c13  rack1

【讨论】:

    【解决方案2】:

    我有点晚了,但这里有一些见解:

    如果您启动 docker 容器,您需要将端口映射到外部世界或将容器链接在一起。

    端口映射是在启动 Docker 容器时通过 -p 参数完成的。 文档可以找到:https://docs.docker.com/articles/networking/

    Containerlinking 是使用 --link 参数完成的,它的工作方式就像两个链接的容器在同一主机上运行一样。文档:https://docs.docker.com/userguide/dockerlinks/

    要使您的示例正常工作(通过其 IP 访问其他容器),您必须公开端口。如果是 cassandra,这将是

    -p 7000:7000 -p 9160:9160 -p 9042:9042 -p 7199:7199

    作为参考,这是我在 2 个物理主机上执行以启动 cassandra 集群的命令。由于端口映射,每台主机只能启动一个实例! (要将容器从命令行中分离,您需要添加 -d 开关)

    docker run --rm --name cassandra-`hostname \
      -v /data/cassandra/projectname:/var/lib/cassandra/data \
      -e CASSANDRA_CLUSTER_NAME=project-database 
      -e CASSANDRA_BROADCAST_ADDRESS=`hostname` 
      -p 7000:7000 -p 9160:9160 -p 9042:9042 -p 7199:7199 \
      -e CASSANDRA_SEEDS=<ip_of_host1>,<ip_of_host2>
      cassandra:2.2.1
    

    【讨论】:

    • 发布端口是为了让它们可以从主机外部访问。但在问题中,Asela 在同一主机上部署了 3 个 cass 节点容器。并且运行nodetool的额外容器也在同一主机上,并且在同一默认桥接网络上,因此它应该可以正常访问其他容器端口,无需在主机上导出端口。
    【解决方案3】:

    在 cassandra-env.sh 中有一个设置“LOCAL_JMX”。默认为“是”,设置为“否”将允许远程连接到端口 7199。

    此外,您可以通过添加以下内容在同一配置文件中禁用身份验证: JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=false"

    -- 关于 pokle 的 docker 映像,我已经对 start.sh(github.com/pokle/cassandra/pull/28) 进行了上述更改,并已合并,现在 docker 映像应该在 README.md 中按预期工作。

    【讨论】:

      【解决方案4】:

      使用 docker 的 exec 而不是 run

      世界上的大多数 Cassandra 映像都带有合理的、仅限本地的 JMX 配置。但是,有时很容易对命令的运行位置感到困惑。 docker run 将始终启动一个新容器(概念上是一个微型 VM)来执行命令。 docker exec 将连接到已经运行的容器并在其中执行命令。由于我们讨论的是通过 nodetool 进行的仅限本地 JMX 控制,因此我们需要 exec 在 cassandra 自身运行的同一容器内运行命令

      $ docker run -d cassandra:3.0
      6ebda615efd2f997f95aece8f7e8ae0faafa72145a3225831fe31513557dc2bb
      
      $ docker ps
      CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                                                              NAMES
      6ebda615efd2        cassandra:3.0       "docker-entrypoint.s…"   3 seconds ago       Up 2 seconds        7000-7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp                                                                                        confident_margulis
      
      $ docker run cassandra:3.0 nodetool status
      nodetool: Failed to connect to '127.0.0.1:7199' - ConnectException: 'Connection refused (Connection refused)'.
      
      $ docker exec 6ebda615efd2 nodetool status
      Datacenter: datacenter1
      =======================
      Status=Up/Down
      |/ State=Normal/Leaving/Joining/Moving
      --  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
      UN  172.17.0.2  103.06 KB  256          100.0%            72bc1f12-538c-4222-9931-40aab96089b3  rack1
      

      请注意,exec 命令需要运行容器的标识符,其中run 使用映像名称。

      【讨论】:

        【解决方案5】:

        我添加了行 - “LOCAL_JMX=否” 到我的 docker-compose.yml 文件,所以我有一个部分

        environment:
          - "MAX_HEAP_SIZE=256M"
          - "HEAP_NEWSIZE=128M"
          - "LOCAL_JMX=no"
        

        【讨论】:

          猜你喜欢
          • 2023-04-10
          • 2016-04-12
          • 2018-08-03
          • 2011-04-22
          • 2019-01-09
          • 2017-10-19
          • 2018-06-20
          • 2018-11-28
          相关资源
          最近更新 更多