【问题标题】:Is it safe to clear column caches in Rails production application?在 Rails 生产应用程序中清除列缓存是否安全?
【发布时间】:2014-01-19 13:43:35
【问题描述】:

跑步安全吗

Klass.reset_column_information
Klass.connection.schema_cache.clear!

在 Rails 应用程序运行时投入生产?

我想进行零停机时间部署,并在后台迁移完成运行后让某个功能开始工作。后台迁移正在创建新表,因此它们将很快完成。

根据我在简短研究中收集到的信息。如果我的 Rails 应用程序服务器重新启动并且尚未创建表,Klass(当然继承自 ActiveRecord::Base)将缓存表尚不存在的事实,在生产中启动 Rails 应用程序的急切加载过程中。

只要当我使用与Klass 相关的功能的部分代码被命中时该表不存在,我想检查名为Klass.table_name 的表是否存在并尝试重新加载其架构。在一段时间(几分钟)后,该表将由后台迁移创建,稍后重新加载架构,我可能会使用我的新功能。

我不担心性能影响,因为此功能不经常使用,而且很可能在迁移完成运行之前甚至不会触发一次。

TLDR:

  • 部署 Rails 应用
  • 重启网络服务器
  • 开始运行后台迁移
  • 功能不活跃
  • 完成运行后台迁移
  • 功能活跃

这就是程序。

我知道我可以将它分成两个部署。在旧代码运行时在后台添加新表,然后部署需要这些表的功能。但我想知道我是否可以通过一次部署获得一个可行的解决方案。我想避免为了实现零停机部署而对新功能进行两次部署。

【问题讨论】:

  • 在有待迁移的情况下进行零时间部署非常棘手。

标签: ruby-on-rails rails-migrations


【解决方案1】:

您应该查看Capistrano,它提供了您正在寻找的所有功能。

  • 将新代码部署到新目录(非实时)
  • 运行挂起的迁移
  • 运行任何其他部署任务,例如资产编译等
  • 使用符号链接将“实时”站点重新指向新代码
  • 重启应用服务器

这里是项目:

https://github.com/capistrano/capistrano

这是一个很好的教程:

http://railscasts.com/episodes/373-zero-downtime-deployment

【讨论】:

  • 如果您没有挂起的迁移,此解决方案可用于零时间部署。迁移数据的必要性会给您带来意想不到的麻烦。
  • 在上线之前,您应该在非上线环境中测试部署本身。使用 cap deploy:migrations 进行部署将确保在部署期间为您运行迁移。
  • 你是对的。如果在迁移期间可以访问站点,则可能会导致数据库不一致。
  • 我猜这取决于迁移。 Capistrano 还提供了在部署期间将站点置于“维护模式”以避免这些问题的能力。
  • 随着数据库架构更新或数据迁移,零停机时间部署实际上并不存在。无论您执行的速度有多快,都会有一段时间应用程序需要不可用或锁定以进行数据写入。然而,使用 Capistrano 之类的工具自动化流程当然可以最大限度地减少问题。
猜你喜欢
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
相关资源
最近更新 更多