多主机cassandra Docker-compose文件问题

时间:2017-02-20 07:10:54

标签: cassandra docker-compose

我对使用Docker很陌生,所以希望这完全是我的错,但我正在尝试使用Docker Compose获得多主机Apache Cassandra环设置。

我有以下 docker-compose.yml 文件

version: '2'

services:

    cassandra-1:
      hostname: cassandra-1
      image: cassandra:latest
      command: /bin/bash -c "sleep 1 && echo ' -- Pausing to let system catch up ... -->' && /docker-entrypoint.sh cassandra -f"
      expose:
        - 7000
        - 7001
        - 7199
        - 9042
        - 9160
      # volumes: # uncomment if you desire mounts, also uncomment cluster.sh
      #   - ./data/cassandra-1:/var/lib/cassandra:rw

    cassandra-2:
      hostname: cassandra-2
      image: cassandra:latest
      command: /bin/bash -c "sleep 20 && echo ' -- Pausing to let system catch up ... -->' && /docker-entrypoint.sh cassandra -f"
      environment:
        - CASSANDRA_SEEDS=cassandra-1
      links:
        - cassandra-1:cassandra-1
      expose:
        - 7000
        - 7001
        - 7199
        - 9042
        - 9160
      # volumes: # uncomment if you desire mounts, also uncomment cluster.sh
      #   - ./data/cassandra-2:/var/lib/cassandra:rw

此示例尝试在另一个容器中启动第一个cassandra节点(cassandra-1),然后启动第二个节点(cassandra-2),该容器应该能够将第一个节点用作标准Cassandra环境变量的种子节点“CASSANDRA_SEEDS “

然而,当我运行它时,我得到了这种异常

cassandra-2_1  | WARN  07:00:35 Seed provider couldn't lookup host cassandra-1
cassandra-2_1  | Exception (org.apache.cassandra.exceptions.ConfigurationException) encountered during startup: The
 provider lists no seeds.
cassandra-2_1  | The seed provider lists no seeds.
cassandra-2_1  | ERROR 07:00:35 Exception encountered during startup: The seed provider lists no seeds.
cass2_cassandra-2_1 exited with code 3

尝试启动第二个Cassandra节点(cassandra-2)总是失败,并在第一个结束时杀死

cass1_cassandra-1_1 exited with code 137

如果我将 docker-compose.yaml 文件分成两部分,那么第一个cassandra节点的启动位于一个文件中。然后使用 docker-compose up 启动该节点即可。

请注意,当我选择2个单独的 docker-compose.yml 文件路径时,一个用于“cassandra-1”,另一个用于“cassandra-2”我 AM < / strong>确保第二个文件使用“external_links”而不是“links”。但结果是一样的

我已经在网上搜索了其他例子,每个人似乎都像我一样这样做。但是我的工作不起作用。

2 个答案:

答案 0 :(得分:1)

在第二个节点尝试加入群集之前,您是否确定第一个节点已完成启动?

根据我的经验,第一个节点完成启动20秒是不够的。在加入群集之前,让第二个节点休眠60秒。

command: /bin/bash -c "echo ' -- Pausing to let system catch up ...' && sleep 60 && /docker-entrypoint.sh cassandra -f"

同样在上面的命令中,我交换了echosleep,这在你仔细观察终端输出时更有意义。

cassandra-1的日志应该显示类似

的内容
INFO  21:21:06 Node /172.18.0.2 state jump to NORMAL
INFO  21:23:04 Handshaking version with /172.18.0.4
INFO  21:23:07 Node /172.18.0.4 is now part of the cluster
INFO  21:23:07 InetAddress /172.18.0.4 is now UP

在您的终端上执行此命令,非常容器日志:

docker logs [OPTIONS] CONTAINER_ID

通过执行docker ps找到容器ID。

如果仍然无法正常工作,请尝试将mem_limit: 1024m添加到两个Cassandra容器定义中。由于内存资源有限,启动可能会失败。

答案 1 :(得分:1)

这似乎只是Docker for Windows的一个问题。我在Mac上尝试了原始文件并且工作得很好