我打算使用docker容器部署几个cassandra节点。如果每个节点都在一个单独的docker容器中,我还可以构建一个包含这些节点的集群吗?
我想我可能会遇到很多问题,因为打开所有必要的端口可能很困难,因为其中一些是随机的。
答案 0 :(得分:17)
小心所有读者,问题和所选答案在许多层面都是错误的。让我解释一下原因。
首先,港口不必,在大多数情况下,不是随机的。容器公开的端口在Dockerfile中的EXPOSE
指令中定义。
只有当您决定使用-P
选项将这些端口发布到主机时,才会在主机上随机选择它们。但通常使用小写-p
选项手动映射端口。只有在希望从其他主机调用容器时,才需要在主机上发布端口。如果您决定在多个主机上创建Cassandra集群,这通常很有用。
该问题也未能指定容器是在同一节点上,还是分布在多个节点上。这些与Docker实现完全不同。
Docker Hub上有Cassandra official image。当有一张官方图片时,你通常最好先试试官方图片。
建议的非官方形象有几个缺陷。我没有测试它,但我可以从它的Dockerfile及其init.sh脚本中猜测:
提出这个问题的人最有可能在玩,但我会认真地回答这个问题,因为这样更有趣!
在单个主机上
在单个主机上部署Cassandra并没有多大意义,因为它意味着要横向扩展。但是,如果你要这样做,你仍然应该正确地做到这一点!
如果您想获得良好的性能,主机上应该有多个磁盘。要做的步骤是:
多个主机 - 每个主机上的单个Cassandra节点
如果您在每个单独的主机上只有一个容器,那么有一个简单的解决方案是在容器上使用--net=host
使它们使用主机的网络堆栈而不是放置他们在桥梁网络上。这将使您的容器像网络一样充当主机。它们将具有与其主机相同的IP,并且可以被其他主机调用。
此技术在此blog的真实物理节点集群中进行了说明。该博客文章还显示了如果您不想使用主机网络并且仍希望在每台主机上使用默认网桥网络,可以使用哪些变通方法。
多个主机 - 每个主机上有多个Cassandra节点
实现此目的的最简单方法是使用overlay network。这将使所有节点上的所有容器位于同一虚拟网络上。然后,它们可以透明地相互通信,就好像它们位于同一节点上一样。但这需要使用更高级的Docker工具,并部署键值存储服务。