升级Rails 6.1替换Makara读写分离后生产环境PG表权限错误如何解决
根因分析
你遇到的报错核心是两个问题连锁触发:
- Rails 6.1 原生多数据库读写分离的自动切换逻辑未正确配置,主库连接异常断开后,写请求被路由到了仅拥有只读权限的从库执行,触发权限报错
- 主库
Connection reset by peer日志说明应用到主库的链路本身存在连通性故障,才会触发降级逻辑
修复步骤
1. 补全Rails原生多数据库配置
第一步:在模型基类中声明多库连接规则
编辑app/models/application_record.rb:
class ApplicationRecord < ActiveRecord::Base self.abstract_class = true # 绑定读写角色对应的数据库配置 connects_to database: { writing: :primary, reading: :follower } end
第二步:开启生产环境读写自动切换中间件
Makara Gem默认自带请求级别的自动切换逻辑,但Rails原生能力需要手动在生产环境配置开启,编辑config/environments/production.rb:
# 配置读写自动切换,写请求2秒内的关联读请求也走主库,避免主从同步延迟导致的数据不一致 config.active_record.database_selector = { delay: 2.seconds } config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
第三步:补全数据库连接池配置
在database.yml的default块补充连接池配置,避免连接数超限导致主库连接被强制断开:
default: &default adapter: postgresql encoding: unicode pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
2. 排查主库连通性问题
- 检查Heroku环境变量
DATABASE_URL配置是否正确,确认对应数据库用户拥有所有业务表的读写权限 - 确认Amazon RDS主库的安全组规则,允许Heroku应用的出口IP段访问主库的5432端口
- 检查RDS主库的最大连接数阈值,确认应用总连接数未达到阈值触发连接重置
验证方案
- 本地模拟验证:本地启动两个PostgreSQL实例模拟主从架构,给从库用户设置只读权限,执行写操作(新增、修改、删除数据),查看Rails日志确认所有写操作都在主库执行,读请求可正常路由到从库
- 灰度验证:生产环境先切10%流量,监控PostgreSQL日志,确认没有写请求落到从库,也没有权限报错和连接重置日志
- 全量验证:全量发布后持续监控1小时无相关报错即修复完成
内容的提问来源于stack exchange,提问作者slopeofhope
相关产品推荐
相关产品推荐

