Docker 1.12:多个副本,单个数据库

时间:2016-08-28 22:52:17

标签: database docker flyway docker-swarm

随着新的群体模式的推出'使用Docker 1.12,我们一直在尝试在容器上迁移我们的应用程序,并利用群集模式的编排& amp;簇。

我们的应用程序需要运行一些初始数据库脚本才能启动它。 我们没有在我们的dockerized应用程序中打包数据库,因此它可以遵循无状态微服务架构,并且多个容器最终会与单个(此时)数据库实例进行通信。

在创建服务时,我们不能将foreach (var file in files) { var fileProperties = await file.GetBasicPropertiesAsync(); var size = fileProperties.Size; } --replicas命令一起使用,因为多个实例会尝试在单个数据库上创建表并失败。虽然我们的脚本会检查数据库是否已设置并跳过创建但由于所有容器同时启动,因此无法使用它。

我们无法找到任何等待类型的机制,我们可以利用码头工具来解决此问题。如果我们只能在第一个容器创建数据库时启动第二个容器(并暴露端口),那将会很好,但我们如何为此配置容器间通信?

或者,像 flywaydb 这样的工具能否以某种方式提供帮助?

如何在生产中使用它?

2 个答案:

答案 0 :(得分:0)

来自Flyway FAQ

  

多个节点可以并行迁移吗?   是! Flyway使用数据库的锁定技术来协调多个节点。这确保即使您的应用程序的多个实例同时尝试迁移数据库,它仍然有效。完全支持群集配置。

答案 1 :(得分:0)

没有简单的方法来协调容器之间的这种情况。它基本上需要分布式锁解决方案。获取锁的第一个容器可以创建db,而其他未获得锁的容器需要等待。

在AWS中,您可以为其利用DynamoDB。 DynamoDB支持条件更新。容器首先尝试使用" attribute_not_exists(yourKey)"在DynamoDB中创建锁定密钥。第一次创作将成功,其他创作将被拒绝。第一个容器需要在DynamoDB中创建另一个密钥以指示db已准备就绪。其他容器只需等待,直到创建就绪密钥。

或者您可以在服务部署脚本中执行此操作。该脚本可以使用1个副本创建服务。然后继续检查db是否已创建。如果是,请缩放服务,例如docker service update yourservicce --replicas 5