Docker里面的Cassandra

时间:2014-06-19 17:24:25

标签: cassandra docker

我打算使用docker容器部署几个cassandra节点。如果每个节点都在一个单独的docker容器中,我还可以构建一个包含这些节点的集群吗?

我想我可能会遇到很多问题,因为打开所有必要的端口可能很困难,因为其中一些是随机的。

1 个答案:

答案 0 :(得分:17)

小心所有读者,问题和所选答案在许多层面都是错误的。让我解释一下原因。

为什么问题出错

首先,港口不必,在大多数情况下,不是随机的。容器公开的端口在Dockerfile中的EXPOSE指令中定义。

只有当您决定使用-P选项将这些端口发布到主机时,才会在主机上随机选择它们。但通常使用小写-p选项手动映射端口。只有在希望从其他主机调用容器时,才需要在主机上发布端口。如果您决定在多个主机上创建Cassandra集群,这通常很有用。

该问题也未能指定容器是在同一节点上,还是分布在多个节点上。这些与Docker实现完全不同。

为什么答案是错误的

Docker Hub上有Cassandra official image。当有一张官方图片时,你通常最好先试试官方图片。

建议的非官方形象有几个缺陷。我没有测试它,但我可以从它的Dockerfile及其init.sh脚本中猜测:

  • 它只支持10个容器(这由作者解释)
  • 它依赖于容器链接,它仅适用于同一主机上的容器,现在不推荐使用
  • 它没有必要的选项来配置在不同主机上部署容器时需要的种子,广播IP等。
  • 它没有数据的挂载点。这意味着如果你有10个容器,它们必须写入同一个磁盘,这会破坏IO性能。 Cassandra的优势在于它不会进行随机读取以避免磁盘寻道时间。

那么如何在Docker中使用Cassandra?

提出这个问题的人最有可能在玩,但我会认真地回答这个问题,因为这样更有趣!

在单个主机上

在单个主机上部署Cassandra并没有多大意义,因为它意味着要横向扩展。但是,如果你要这样做,你仍然应该正确地做到这一点!

如果您想获得良好的性能,主机上应该有多个磁盘。要做的步骤是:

  • 使用official image并在每个容器上安装单独的磁盘。
  • 创建一个user-defined bridge network并将这些容器放在同一个网络上,以便它们可以相互通信,甚至可以自动解析主机名。
  • 创建第一个容器后,将CASSANDRA_SEEDS变量传递给每个后续容器,以通知集群中已有的任何其他容器的IP或主机名。

多个主机 - 每个主机上的单个Cassandra节点

如果您在每个单独的主机上只有一个容器,那么有一个简单的解决方案是在容器上使用--net=host使它们使用主机的网络堆栈而不是放置他们在桥梁网络上。这将使您的容器像网络一样充当主机。它们将具有与其主机相同的IP,并且可以被其他主机调用。

此技术在此blog的真实物理节点集群中进行了说明。该博客文章还显示了如果您不想使用主机网络并且仍希望在每台主机上使用默认网桥网络,可以使用哪些变通方法。

多个主机 - 每个主机上有多个Cassandra节点

实现此目的的最简单方法是使用overlay network。这将使所有节点上的所有容器位于同一虚拟网络上。然后,它们可以透明地相互通信,就好像它们位于同一节点上一样。但这需要使用更高级的Docker工具,并部署键值存储服务。