PostgreSQL Hot Standby 查询冲突处理

冲突原因(4种)

  1. 主库 VACUUM 清理了备库查询需要的多版本数据(最常见)
  2. 主库 LOCK/DDL 产生的排他锁与备库查询冲突
  3. 主库删除表空间,但备库查询需要在其上存放临时文件
  4. 主库删除数据库,而备库仍有 session 连接

处理方式(2种)

  • 等待:让备库 WAL 应用进程等查询结束再应用 WAL
  • 取消:强制取消备库正在执行的查询

关键参数

  • max_standby_archive_delay — 归档模式最大等待延迟,默认 30s,-1 表示一直等
  • max_standby_streaming_delay — 流复制模式最大等待延迟,默认 30s,-1 表示一直等
场景 建议设置
备库用于高可用 设小值,保证不延迟
备库用于大查询 设大值

减少冲突的配置

  • hot_standby_feedback = on:备库告知主库哪些多版本数据还需要,防止 AutoVacuum 清理(推荐方案)
  • vacuum_defer_cleanup_age 调大:延迟清理多版本数据(辅助方案)

注意事项

  • 即使配置了以上参数,仍可能因冲突被取消查询
  • 备库应用应检测 canceling statement due to conflict with recovery 错误并自动重试
  • 冲突可通过 pg_stat_database_conflicts 视图查询
分类未分类

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注