2016-11-04 67 views
3

我使用Docker Swarm做了第一步,并想知道如何处理使用持久数据(如redis,elasticsearch或数据库)的服务。Docker Swarm与数据:共享卷vs集群vs单实例

我发现了很多关于如何使用docker swarm配置redis/elasticsearch/database集群的教程 - 但使用共享存储不是更容易吗?例如,我使用Azure,因此我可以使用单个Azure文件存储作为redis/elasticsearch /数据库卷,并让所有节点都安装此文件存储。 这是一种可接受的方法,还是存在一些明显的缺点(例如,当两个或多个数据库实例试图在该存储上同时写入时)?

是否推荐使用这样的“数据”服务?每个节点?还是应该将Docker Swarm用于前端服务,并且只有一个redis/elasticsearch /数据库服务?

回答

1

如果要使用从多个应用程序实例访问的共享文件夹,而不是应用程序本身,则需要设计一种避免数据损坏的方法(没有给定的文件是从多个应用程序同时写入的。叫做互斥锁)

我知道的所有数据库都没有这样设计,所以你不能在共享存储中使用它们。

他们通常做的是连接集群中的所有数据库,同步是在软件级完成的。

+0

谢谢你的想法!现在我正在计划一个复杂的群集,其中包含不能无状态的各种服务。我的发现与您的发现相同:1.避免使用共享卷2.如果服务提供共享卷,请使用群集功能3.由于弹性原因,避免使用服务的单个实例(在生产中)。我遇到的另一个问题是:(例如)如果我的群集数据库中有一个死掉了,我的节点应该如何在同一台机器上进行响应?我的答案是:将整个机器标记为“生病”,因此应该完全无法访问和/或重新启动。 – Munchkin

+0

如果你将db容器作为服务部署,你可以使用健康检查,所以如果容器真的死于docker swarm会杀死它并启动一个新的,这意味着只有几秒钟的停机时间 如果你使用mysql,我目前正在工作在一个非常简单的群集解决方案中,您可以部署多个实例,并且它们将全部使用gallera群集同步,因此丢失一个并不是问题 尚未准备好,但可能需要几周的时间。 https://github.com/vipconsult/percona-docker/tree/master/pxc-57 –