云数据库 RDS-只读查询复制冲突:发生流复制冲突时怎么办?

时间:2024-09-06 14:25:16

发生流复制冲突时怎么办?

参数控制

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等操作导致的冲突依然存在。同时若只读中存在长事务,会导致数据库中死元组不能及时清理,造成数据库膨胀。

优化建议

  1. 优化只读实例的SQL,将SQL查询时长控制在“max_standby_streaming_delay”值以内。
  2. 监控只读长事务,根据业务需求,超过一定时长(如30min)的长事务要强制终止。
support.huaweicloud.com/usermanual-rds/rds_pg_08_00016.html