监控 Aurora PostgreSQL 逻辑复制的直写缓存和逻辑插槽 - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

监控 Aurora PostgreSQL 逻辑复制的直写缓存和逻辑插槽

监控逻辑复制直写缓存并管理逻辑插槽,以提高 Aurora PostgreSQL 数据库集群的性能。接下来,查找有关直写缓存和逻辑插槽的更多信息。

监控 Aurora PostgreSQL 逻辑复制直写缓存

原定设置情况下,Aurora PostgreSQL 版本 14.5、13.8、12.12 和 11.17 及更高版本使用直写缓存来提高逻辑复制的性能。如果没有直写缓存,Aurora PostgreSQL 在实现原生 PostgreSQL 逻辑复制过程时使用 Aurora 存储层。为此,它将 WAL 数据写入存储,然后从存储中读回数据以对其进行解码并发送(复制)到其目标(订阅者)。这可能会导致在 Aurora PostgreSQL 数据库集群的逻辑复制过程中出现瓶颈。

直写缓存尽可能减少了对 Aurora 存储层的依赖。Aurora PostgreSQL 并不始终在该层进行写入和读取,而是使用缓冲区来缓存逻辑 WAL 流以便在复制过程中使用,从而减少了访问磁盘的需求。该缓冲区是逻辑复制中使用的原生 PostgreSQL 缓存,在 Aurora PostgreSQL 数据库集群参数中标识为 rds.logical_wal_cache

当您在 Aurora PostgreSQL 数据库集群(对于支持直写缓存的版本)中使用逻辑复制时,您可以监控缓存命中率以查看其对您的使用案例的效果有多好。为此,请使用 psql 连接到 Aurora PostgreSQL 数据库集群的写入实例,然后使用 Aurora 函数 aurora_stat_logical_wal_cache,如以下示例所示。

SELECT * FROM aurora_stat_logical_wal_cache();

该函数返回如下输出。

name | active_pid | cache_hit | cache_miss | blks_read | hit_rate | last_reset_timestamp -----------+------------+-----------+------------+-----------+----------+-------------- test_slot1 | 79183 | 24 | 0 | 24 | 100.00% | 2022-08-05 17:39... test_slot2 | | 1 | 0 | 1 | 100.00% | 2022-08-05 17:34... (2 rows)

为了便于阅读,已缩短了 last_reset_timestamp 值。有关此函数的更多信息,请参阅 aurora_stat_logical_wal_cache

Aurora PostgreSQL 提供了以下两个用于监控直写缓存的函数。

如果您发现自动调整的 WAL 缓存大小不足以满足您的工作负载,则可以手动更改 rds.logical_wal_cache 的值。请考虑以下事项:

  • rds.logical_replication 参数禁用时,rds.logical_wal_cache 设置为零(0)。

  • rds.logical_replication 参数启用时,rds.logical_wal_cache 默认值为 16 MB。

  • rds.logical_wal_cache 参数是静态的,并需要重新启动数据库实例以使更改生效。根据 8 Kb 数据块定义此参数。请注意,任何小于 32 Kb 的正值均视为 32 Kb。有关 wal_buffers 的更多信息,请参阅 PostgreSQL 文档中的预写日志

管理 Aurora PostgreSQL 的逻辑插槽

流式传输活动在 pg_replication_origin_status 视图中捕获。要查看此视图的内容,您可以使用 pg_show_replication_origin_status() 函数,如下所示:

SELECT * FROM pg_show_replication_origin_status();

您可以使用以下 SQL 查询获取逻辑插槽的列表。

SELECT * FROM pg_replication_slots;

要删除逻辑插槽,请使用 pg_drop_replication_slot 以及插槽的名称,如以下命令所示。

SELECT pg_drop_replication_slot('test_slot');