云数据库 RDS-只读查询复制冲突:发生流复制冲突时怎么办?
发生流复制冲突时怎么办?
参数控制
PostgreSQL提供了以下参数用于控制流复制冲突:
- max_standby_streaming_delay
参数说明:参数默认为30秒,表示当只读库执行SQL时,有可能与正在应用的wal发生冲突,此查询如果30秒没有执行完成则被中止。
设置为“-1”表示遇到冲突时,直到只读库完成查询后,再继续进行wal回放。注意,“max_standby_streaming_delay”与取消之前一个查询能够运行的最长时间不同,它表示在从主库接收到 wal数据并立刻应用它能够被允许的最长总时间。因此,如果一个查询导致了明显的延迟,后续冲突查询只有更少的时间,直到只读库再次赶上进度。
缺点:该参数设置时间过长,或设置为“-1”时,若只读存在长事务,则会导致主库与只读库之间存在一定的数据时延。
- hot_standby_feedback
参数说明:设置为“on”后只读库执行查询时会通知主库,在只读库执行查询过程中,主库不会清理只读库需要的数据,因此也不会发生因vacuum导致的流复制冲突。
缺点:设置为“on”时,可以解决因vacuum导致的流复制冲突,DROP等操作导致的冲突依然存在。同时若只读中存在长事务,会导致数据库中死元组不能及时清理,造成数据库膨胀。
优化建议
- 优化只读实例的SQL,将SQL查询时长控制在“max_standby_streaming_delay”值以内。
- 监控只读长事务,根据业务需求,超过一定时长(如30min)的长事务要强制终止。
- 华为云数据库 RDS for MySQL常见故障排除_华为云
- 华为云数据库 RDS for PostgreSQL 实例规格介绍
- MySQLdump导入数据库_MySQL建立数据库_MySQL数据库导出
- 云数据库 RDS for PostgreSQL只读实例_PG只读实例_华为云
- RDS for MySQL限流_华为云数据库RDS_自治限流_SQL限流
- 共享镜像和复制镜像的区别
- 免费云数据库MySQL_MySQL数据库免费_MySQL数据库是免费的吗
- 云数据库 RDS 的实例类型有哪些
- 云数据库RDS for MySQL版本升级_MySQL版本_升级数据库版本
- RDS for MySQL审计日志_开启日志审计_数据库审计_华为云数据库RDS