部署到多个实例时如何只迁移一次我的数据库架构?
How to migrate my database schema only once when deploying to multiple instances?
我有一个 MySQL 数据库支持的 Web 应用程序,我将其部署到多个云实例。我正在使用数据库迁移工具,这意味着我的架构更改 运行 作为部署的一部分(例如,通过配置管理工具)。但是,当我启动我的 Web 应用程序的多个实例时,所有这些实例都会尝试将架构更改应用到 MySQL 数据库,我基本上可以最终处于未知状态 DB/error 出去。在这样的设置中,推荐的数据库架构更改部署方法是什么?
我看到的唯一可能的解决方案是 运行 模式更改与应用程序部署过程分开。还有其他想法吗?
以下是一些解决方案:
将迁移操作分离为您可以独立调用的内容,并在您的生产和类似生产的部署中的一个地方显式调用它。
指定一个云实例作为迁移运行器。以某种方式标记它,以便您的部署过程可以将它与其他实例区分开来:给它一个特殊的主机名; on EC2, set a value in user data; if using Chef, give the instance a Chef role;等。让您的部署检查它是否正在部署到迁移运行器,只有在部署时才迁移。
编写代码在您的数据库(或可能在您的生产环境中的其他一些单例资源)中获取锁,检查数据库模式版本,如果它是预期版本则退出,然后迁移如果不是预期的版本。
哪种方法最好取决于您的部署环境和工具。在任何情况下,为了在非生产环境中方便,您都希望继续自动迁移(例如,作为服务器启动的一部分)。
我有一个 MySQL 数据库支持的 Web 应用程序,我将其部署到多个云实例。我正在使用数据库迁移工具,这意味着我的架构更改 运行 作为部署的一部分(例如,通过配置管理工具)。但是,当我启动我的 Web 应用程序的多个实例时,所有这些实例都会尝试将架构更改应用到 MySQL 数据库,我基本上可以最终处于未知状态 DB/error 出去。在这样的设置中,推荐的数据库架构更改部署方法是什么?
我看到的唯一可能的解决方案是 运行 模式更改与应用程序部署过程分开。还有其他想法吗?
以下是一些解决方案:
将迁移操作分离为您可以独立调用的内容,并在您的生产和类似生产的部署中的一个地方显式调用它。
指定一个云实例作为迁移运行器。以某种方式标记它,以便您的部署过程可以将它与其他实例区分开来:给它一个特殊的主机名; on EC2, set a value in user data; if using Chef, give the instance a Chef role;等。让您的部署检查它是否正在部署到迁移运行器,只有在部署时才迁移。
编写代码在您的数据库(或可能在您的生产环境中的其他一些单例资源)中获取锁,检查数据库模式版本,如果它是预期版本则退出,然后迁移如果不是预期的版本。
哪种方法最好取决于您的部署环境和工具。在任何情况下,为了在非生产环境中方便,您都希望继续自动迁移(例如,作为服务器启动的一部分)。