【问题标题】:Rails3 ActiveRecord migrations on concurrent deploy并发部署时的 Rails3 ActiveRecord 迁移
【发布时间】:2011-07-08 16:49:25
【问题描述】:

当您同时部署到多台机器时,如何确保只运行一次迁移?

我现在要做的是选择一台机器来运行迁移,当我确实有这种变化时。理想情况下,部署是无脑的,这个过程会为我处理好。

我目前的想法是让迁移者寻找要迁移的模式并在它有事情要做时获取锁。如果锁已经被获取,它会一起跳过迁移。阅读 ActiveRecord 代码,它似乎不支持这样的想法,所以它需要一些补丁。

你的想法是什么?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    你在使用Capistrano吗?您可以指定一个数据库服务器列表并将其中一个标记为主要服务器。迁移只会在该服务器上运行:

    role :app, 'example.com.com'
    role :web, 'example.com'
    role :db,  'db01.example.com', :primary => true
    role :db,  'db02.example.com'
    role :db, 'db03.example.com'
    

    编辑::db 角色不打算用于不运行 Rails 应用程序代码的单独数据库服务器。这可能不是您的设置。

    【讨论】:

    • 感谢不错的技巧,但我正在寻找一个通用的解决方案。我想我最终会用 Redis 实现一个锁。
    • @zimbatm 锁定是不够的。您应该考虑先运行一台机器,运行迁移,然后再运行其他机器,这样它们就不会跳过迁移并在您的数据库尚未更新时开始运行您的新代码
    猜你喜欢
    • 2010-12-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    相关资源
    最近更新 更多