Docker内部的Cassandra

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

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

我还没有尝试过,但是我在Docker.io上find了zmarcantel / cassandra镜像,声称它可以作为集群运行。

要小心所有的读者 ,问题和select的答案在很多层面都是错误的。 让我解释一下为什么。

为什么这个问题是错误的

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

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

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

为什么答案是错误的

Docker Hub上有一个Cassandra官方图片 。 有一个你通常更好地尝试官方形象。

build议的非官方图像有几个缺陷。 我没有testing过,但是我可以从它的Dockerfile和init.sh脚本中猜测:

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

那么如何在Docker上使用Cassandra呢?

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

在一台主机上

在单个主机上部署Cassandra没有什么意义,因为它意味着要水平缩放。 但是如果你打算这样做的话,你还是应该这样做的!

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

  • 使用官方映像并在每个容器上安装单独的磁盘。
  • 创build一个用户定义的桥接networking ,并将这些容器放在同一个networking上,以便它们可以相互通信,甚至可以自动进行主机名parsing。
  • 在创build第一个容器之后,将CASSANDRA_SEEDSvariables传递给每个后续容器,以通知其集群中已join的任何其他容器的IP或主机名。

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

如果你打算在每个单独的主机上只有一个容器,有一个简单的解决scheme,就是在你的容器上使用--net=host来使他们使用主机的networking堆栈,而不是把它们放在桥接networking上。 这将使您的容器像networking主机一样运行。 他们将拥有与主机相同的IP,并可以被其他主机调用。

这个技术在这个博客的真实物理节点集群上进行了说明。 如果您不想使用主机networking,并且仍希望在每台主机上使用默认桥接networking,则博客文章还会显示可以使用哪些解决方法。

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

最简单的方法是使用覆盖networking 。 这将使所有节点上的所有容器都在同一虚拟networking上。 然后他们可以透明地彼此交谈,就好像他们在同一个节点上一样。 但是这需要使用更高级的Docker工具,并部署一个键值存储服务。