我打算使用docker容器部署几个cassandra节点.如果每个节点都在一个单独的docker容器中,我还可以构建一个包含这些节点的集群吗?
我想我可能会遇到很多问题,因为打开所有必要的端口可能很困难,因为其中一些是随机的.
小心所有读者,问题和所选答案在许多层面都是错误的.让我解释一下原因.
首先,端口不必,并且在大多数情况下,不是随机的.容器公开的端口EXPOSE
在Dockerfile 中的指令中定义.
只有当您决定使用该-P
选项将这些端口发布到主机时,才会在主机上随机选择它们.但通常使用小写-p
选项手动映射端口.只有在希望从其他主机调用容器时,才需要在主机上发布端口.如果您决定在多个主机上创建Cassandra集群,这通常很有用.
该问题也未能指定容器是在同一节点上,还是分布在多个节点上.这些与Docker实现完全不同.
Docker Hub上有一个Cassandra官方图片.当有一张官方图片时,你通常会更好地尝试官方图片.
建议的非官方形象有几个缺陷.我没有测试过它,但我可以从它的Dockerfile及其init.sh脚本中猜到:
它只支持10个容器(这由作者解释)
它依赖于容器链接,它仅适用于同一主机上的容器,现在无论如何都会被弃用
它没有配置种子,广播IP等的必要选项.在单独的主机上部署容器时需要这些选项.
它没有数据的挂载点.这意味着如果你有10个容器,它们必须写入同一个磁盘,这会破坏IO性能.Cassandra的优势在于它不会随机读取以避免磁盘寻道时间.
问这个问题的人最有可能在玩,但我会尽力回答这个问题,因为这样更有趣!
在一个主机上
在单个主机上部署Cassandra没有多大意义,因为它意味着水平扩展.但是,如果你要这样做,你仍然应该正确地做到这一点!
如果要获得良好的性能,主机上应该有多个磁盘.要做的步骤是:
使用官方映像并在每个容器上安装单独的磁盘.
创建用户定义的桥接网络并将这些容器放在同一网络上,以便它们可以相互通信,甚至可以自动解析主机名.
创建第一个容器后,将CASSANDRA_SEEDS变量传递给每个后续容器,以通知集群中已加入的任何其他容器的IP或主机名.
多个主机 - 每个主机上的单个Cassandra节点
如果您要在每个单独的主机上只有一个容器,那么可以使用容易的解决方案--net=host
在容器上使用它们来使用主机的网络堆栈,而不是将它们放在桥接网络上.这将使您的容器像网络一样充当主机.它们将具有与其主机相同的IP,并可由其他主机调用.
此博客中的真实物理节点集群上说明了此技术.该博客文章还显示了如果您不想使用主机网络并且仍希望在每个主机上使用默认桥接网络,可以使用哪些变通方法.
多个主机 - 每个主机上有多个Cassandra节点
实现此目的的最简单方法是使用覆盖网络.这将使所有节点上的所有容器位于同一虚拟网络上.然后,它们可以透明地相互通信,就好像它们位于同一节点上一样.但这需要使用更高级的Docker工具,并部署键值存储服务.