考虑到 Docker 1.12。我理解卷不能在群集间移植,而像 Flocker 这样的解决方案更适合较大的群集。
尽管如此,我下面描述的选项是否适合我的设置?
设置 一个由 3 个节点组成的集群,运行来自实验分支的 Docker 1.12.latest。
目标 运行一个不错但较小的 Cassandra 集群。
问题 我想解耦有状态的服务的一部分(数据量)来自无国籍者Cassandra 守护进程。
建议的解决方案
在每个节点上手动创建一个命名卷,每个节点上的名称相同。使用docker service create --name cassandra --replicas 3 --mount type=volume,source=cassandra_data,target=/usr/var/cassandra
我的理解是,每个节点都会运行一个 Cassandra 副本,每个副本都引用一个具有相同名称的本地命名卷。
这可行吗?我是否需要指定一个约束来确保群集中每个节点最多有 1 个副本?
编辑:阅读文档后,我似乎应该使用--mode=global
而不是replicas=3
在群集的每个节点上运行 1 个副本。这很有意义...
答案1
是的,这确实有效,使用全局标志将是防止任何冲突的更好选择。我已经使用 MongoDB 运行了类似的模型作为测试,并且运行良好。
答案2
从 19.03 版本开始,现在有一个选项可以限制每个节点的副本数量,以避免多个副本访问同一个卷:
$ docker service create --help
Usage: docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
Create a new service
Options:
...
--replicas-max-per-node uint Maximum number of tasks per node (default 0 = unlimited)
将其添加到service create
命令后,下一步将在撰写文件中添加放置偏好以支持docker stack deploy
。