从开发到生产:online_migrations环境配置与部署策略全解析 从开发到生产online_migrations环境配置与部署策略全解析【免费下载链接】online_migrationsCatch unsafe PostgreSQL migrations in development and run them easier in production (code helpers for table/column renaming, changing column type, adding columns with default, background migrations, etc).项目地址: https://gitcode.com/gh_mirrors/on/online_migrationsonline_migrations是一款强大的PostgreSQL迁移工具能够在开发阶段捕获不安全的迁移操作并简化生产环境中的部署流程。它提供了表/列重命名、列类型变更、带默认值列添加以及后台迁移等实用功能是Ruby on Rails项目数据库迁移的理想选择。快速入门安装与基础配置一键安装步骤要开始使用online_migrations首先需要将其添加到你的Gemfile中gem online_migrations然后运行bundle install安装gem。安装完成后执行以下命令生成必要的迁移文件$ bin/rails generate online_migrations:install这个命令会创建初始化文件和数据库表为后续的迁移操作做好准备。基础配置指南online_migrations的所有配置都集中在initializer文件中。创建config/initializers/online_migrations.rb文件并添加基本配置# config/initializers/online_migrations.rb OnlineMigrations.configure do |config| # 设置迁移超时时间 config.statement_timeout 1.hour # 配置锁超时重试策略 config.lock_retrier OnlineMigrations::ExponentialLockRetrier.new( attempts: 30, base_delay: 0.01.seconds, max_delay: 1.minute ) # 标记小型表对这些表的操作会跳过某些安全检查 config.small_tables [:settings, :prices, :plans] end这个基础配置已经可以满足大多数项目的需求接下来我们将深入探讨更高级的配置选项。开发环境配置安全检查与自定义规则安全检查机制online_migrations在开发环境中默认启用了一系列安全检查防止不安全的数据库操作。这些检查包括禁止在生产环境可能导致锁表的操作检测可能导致性能问题的索引添加防止删除重要列或表你可以在配置文件中禁用特定的检查# 禁用删除索引的检查 config.disable_check(:remove_index)完整的检查列表可以在lib/online_migrations/error_messages.rb中找到。自定义检查规则除了内置检查你还可以添加自定义检查规则。例如限制对users表添加新列config.add_check do |method, args| if method :add_column args[0].to_s users stop!(No more columns on the users table) end end使用stop!方法可以阻止不安全的迁移操作并显示自定义错误消息。开发环境特殊配置为了使开发环境更接近生产环境你可以指定目标数据库版本# 模拟生产环境的PostgreSQL 12 config.target_version 12这确保了开发环境中运行的检查与生产环境保持一致。生产环境配置性能与安全优化数据库超时设置在生产环境中合理的超时设置至关重要。online_migrations提供了两种设置超时的方式通过配置文件设置# 设置语句超时和锁超时 config.statement_timeout 1.hour config.lock_retrier OnlineMigrations::ExponentialLockRetrier.new( attempts: 30, base_delay: 0.01.seconds, max_delay: 1.minute, lock_timeout: 0.2.seconds )直接在数据库用户上设置ALTER ROLE myuser SET lock_timeout 10s; ALTER ROLE myuser SET statement_timeout 1h;推荐在config/database.yml中添加连接超时设置production: connect_timeout: 5 variables: lock_timeout: 10s statement_timeout: 15s高级锁重试策略对于不同类型的迁移操作可能需要不同的锁重试策略。online_migrations允许你根据命令类型自定义重试行为module OnlineMigrations class CommandAwareLockRetrier LockRetrier def attempts(command nil, arguments []) case command when :add_index 10 # 并发索引创建使用较少的尝试次数 when :add_foreign_key 60 # 外键添加使用更多的尝试次数 else 30 # 默认尝试次数 end end def lock_timeout(attempt, command nil, arguments []) case command when :add_index 30.seconds # 索引创建允许更长的锁超时 when :add_foreign_key 5.seconds # 外键添加快速失败 else 10.seconds # 默认锁超时 end end end end config.lock_retrier OnlineMigrations::CommandAwareLockRetrier.new这种灵活的配置确保了不同类型的迁移操作都能以最佳方式执行。详细SQL日志在生产环境中启用详细SQL日志可以帮助排查迁移问题config.verbose_sql_logs true启用后迁移过程中执行的所有SQL语句都会被记录包括锁超时设置和重试信息。这对于调试复杂的迁移问题非常有帮助。后台数据迁移大规模数据处理什么是后台数据迁移当项目增长到一定规模直接在部署过程中执行大型数据迁移会导致严重的性能问题。background_data_migrations允许你在后台异步处理这些操作避免影响应用性能。适用场景大型表的数据更新需要长时间运行的数据转换从API获取数据并更新到数据库配置后台迁移后台数据迁移需要Sidekiq 7.3.3的支持。首先确保你的Gemfile中包含Sidekiqgem sidekiq, 7.3.3然后配置后台迁移调度器。使用whenever gem可以轻松设置定时任务# config/schedule.rb every 1.minute do runner OnlineMigrations.run_background_data_migrations end创建和使用后台迁移使用生成器创建新的后台数据迁移$ bin/rails generate online_migrations:data_migration backfill_project_issues_count这会创建两个文件数据迁移文件和用于入队的常规迁移文件。编辑数据迁移文件实现业务逻辑# lib/online_migrations/data_migrations/backfill_project_issues_count.rb module OnlineMigrations module DataMigrations class BackfillProjectIssuesCount OnlineMigrations::DataMigration class Project ActiveRecord::Base; end def collection Project.in_batches(of: 100) end def process(relation) relation.update_all(~SQL) issues_count ( SELECT COUNT(*) FROM issues WHERE issues.project_id projects.id ) SQL end def count collection.count end end end end然后在常规迁移中入队后台迁移# db/migrate/xxxxxxxxxxxxxx_enqueue_backfill_project_issues_count.rb class EnqueueBackfillProjectIssuesCount ActiveRecord::Migration[8.0] def up enqueue_background_data_migration(BackfillProjectIssuesCount) end def down remove_background_data_migration(BackfillProjectIssuesCount) end end后台迁移监控后台迁移有多种状态可以通过代码监控其进度migration OnlineMigrations::DataMigrations::Migration.find(id) puts 当前状态: #{migration.status} puts 进度: #{migration.progress}%可用状态包括pending、enqueued、running、paused、errored、failed、succeeded等。你还可以通过回调和通知系统集成监控工具# config/initializers/online_migrations.rb ActiveSupport::Notifications.subscribe(completed.background_data_migrations) do |name, start, finish, id, payload| migration payload[:migration] # 发送完成通知 NotificationService.send(Migration #{migration.name} completed) end部署策略确保平滑迁移迁移前检查清单在部署包含数据库迁移的代码前建议执行以下检查本地测试在开发环境中完整测试迁移查看迁移SQL使用rails db:migrate:sql检查生成的SQL检查索引确保没有添加不必要的索引测试回滚执行rails db:rollback测试回滚功能备份数据在生产环境迁移前备份数据库零停机部署策略online_migrations特别适合实现零停机部署。推荐的部署流程如下部署代码先部署包含迁移的代码但不执行迁移执行迁移通过单独的流程执行迁移验证迁移确认迁移成功完成监控性能部署后监控数据库性能对于大型表的变更使用后台迁移确保生产环境不受影响# 使用预定义的后台迁移 def up add_column :users, :new_column, :string backfill_column_in_background(:users, :new_column, default: default_value) end处理迁移失败即使做了充分准备迁移仍可能失败。online_migrations提供了多种处理失败的机制重试失败的迁移migration OnlineMigrations::DataMigrations::Migration.find(id) migration.retry暂停和恢复迁移# 暂停迁移 migration.pause # 恢复迁移 migration.resume取消迁移migration.cancel此外可以配置错误处理器集成异常监控服务config.background_data_migrations.error_handler -(error, errored_migration) do Bugsnag.notify(error) do |notification| notification.add_metadata(:migration, { name: errored_migration.name }) end end最佳实践与常见问题性能优化技巧分批处理对大型表始终使用分批处理collection_batch_size(1000) # 增大批处理大小利用数据库功能使用数据库内置功能而非Ruby代码处理数据# 推荐 relation.update_all(score points * 2) # 不推荐 relation.each { |record| record.update(score: record.points * 2) }指定目标版本在开发环境中模拟生产数据库版本config.target_version 12.9 # 匹配生产环境版本分析表添加索引后自动更新统计信息config.auto_analyze true常见问题解决Q: 迁移被锁定无法执行怎么办A: 检查是否有长时间运行的事务或查询阻塞了迁移。可以使用以下SQL查找锁定的查询SELECT * FROM pg_locks JOIN pg_stat_activity USING (pid) WHERE NOT granted;Q: 如何处理需要回滚的后台迁移A: 创建反向的后台迁移并在down方法中入队def down enqueue_background_data_migration(ReverseBackfillProjectIssuesCount) endQ: 开发环境和生产环境的迁移行为不一致A: 确保配置了target_version使开发环境模拟生产环境config.target_version { primary: 12, analytics: 14 } # 多数据库配置高级配置示例多数据库配置# 配置后台迁移使用特定数据库 OnlineMigrations::ApplicationRecord.connects_to database: { writing: :animals }按分片并行处理# config/schedule.rb [:shard_one, :shard_two, :shard_three].each do |shard| every 1.minute do runner OnlineMigrations.run_background_data_migrations(shard: :#{shard}) end end自定义数据迁移路径config.background_data_migrations.migrations_path app/data_migrations总结与资源online_migrations为PostgreSQL数据库迁移提供了全面的解决方案从开发阶段的安全检查到生产环境的平滑部署。通过合理配置和使用后台迁移功能可以显著降低数据库变更带来的风险确保应用在数据增长过程中保持高性能和可用性。官方资源配置文档docs/configuring.md后台数据迁移指南docs/background_data_migrations.md后台模式迁移指南docs/background_schema_migrations.md升级指南docs/0.27-upgrade.md通过这些资源你可以深入了解online_migrations的所有功能为你的项目构建安全、高效的数据库迁移流程。无论是小型应用还是大型企业系统online_migrations都能帮助你轻松应对数据库变更的挑战。【免费下载链接】online_migrationsCatch unsafe PostgreSQL migrations in development and run them easier in production (code helpers for table/column renaming, changing column type, adding columns with default, background migrations, etc).项目地址: https://gitcode.com/gh_mirrors/on/online_migrations创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考