Amazon Aurora PostgreSQL 参数系列之内存和查询方案管理(二)

2022-02-23 00:00:00 集群 参数 缓存 管理 计划

apg_ccm_enabled

 

apg_ccm_enabled处理集群缓存管理,这是Aurora中的一个特性,可以帮助改进故障转移后的应用程序性能。可以在DB集群参数组中启用apg_ccm_enabled。该参数需要重新启动才能使集群缓存管理生效,并且写入器和至少一个副本应该设置为优先级为0的故障转移优先级目标,并且它们的实例类应该完全相同。

通常,一个Aurora集群有一个写入器实例和一个或多个副本实例。如果写入器实例失败,其中一个副本实例将被提升为写入器。副本上的共享缓冲区缓存可能没有与写入者相同的页面,或者缓存可能是空的。这就是所谓的冷缓存,冷缓存会降低性能,因为DB实例必须从存储中读取数据,而不是利用存储在缓冲区缓存中的数据。使用集群缓存管理,可以将一个特定的副本DB实例设置为故障转移目标。集群缓存管理确保指定副本实例缓存中的数据与写入器DB实例缓存中的数据保持同步。

 

如果实例类对0级故障转移组中的所有实例不是完全相同的,或者实例使用不同的参数组,则Apg_ccm_enabled参数没有任何影响。如果集群缓存管理的所有必要条件都没有满足,您将在Logs &Amazon RDS管理控制台上看到一个错误: 

 

This DB instance is not eligible for cluster cache management. The apg_ccm_enabled parameter has been reset to false for this DB instance.

 

pgbench测试显示了启用集群缓存管理后故障转移后性能的改善。该测试在一个拥有160gb缓存数据的数据库上执行,工作负载很重(读写比率为20:1)。使用写程序实例运行pgbench10分钟(600秒)后执行故障转移。下图显示,当启用apg_ccm_enabled时,pgbench几乎可以在故障转移后立即达到每秒事务(TPS)的平均第90百分位数。相比之下,如果没有集群缓存管理,新提升的写入器大约需要357秒才能扩展到TPS的第90百分位。 

 

wal_buffers

 

WAL缓冲区用于保存尚未写入存储的WAL记录。WAL缓冲区缓存的大小由wal_buffers设置控制。Aurora使用基于日志的存储引擎,将更改发送到存储节点进行持久化。考虑到Aurora存储引擎处理写的方式的差异,在使用Aurora PostgreSQL时,这个参数应该保持不变。

 

管理参数

 

PostgreSQL使用一个基于成本的优化器,它计算不同可用计划的成本,并使用成本低的计划。查询计划是根据优化器统计信息和查询规划器配置参数计算的。对优化器统计信息、查询规划器配置或绑定变量的更改可能导致优化器选择不同的计划。这称为查询计划不稳定性,可能导致不可预测的数据库性能。

AuroraPostgreSQL查询计划管理(QPM)特性解决了计划不稳定的问题,允许数据库用户对一组管理的SQL语句保持稳定且优的性能。QPM服务于两个主要目标:

计划稳定性——当系统中出现上述任何更改时,QPM可以防止计划回归并提高计划的稳定性。

计划适应性——QPM会自动检测新的低成本计划,并在可能使用新计划时进行控制,以适应变化。


QPM是Aurora PostgreSQL特有的特性。在本节中,我们将讨论影响其工作方式的参数。

 

rds.enable_plan_管理

 

此参数启用apg_plan_mgmt扩展,这是使用QPM所需的。可以在DB集群参数组中启用。更改需要重新启动才能生效。

apg_plan_mgmt.capture_plan_baselines

 

此参数指示如何捕获SQL语句的运行计划Off——完全禁用计划捕获Manual——为所有SQL语句启用计划捕获Automatic——为满足资格条件的SQL语句启用自动计划捕获

该参数可以在DB集群参数组、DB参数组中设置,也可以在会话级别设置,无需重启。当您的应用程序中有所有SQL语句的列表或者您的特定SQL语句受到计划不稳定性影响时,manual模式可能非常有用。
您可以设置apg_plan_mgmt.capture_plan_baselines
manual会话中,然后运行您想要的QPM为其管理计划的SQL语句。当您希望通过使用pg_hint_plan扩展强制执行特定的计划,或者希望优化器选择通过禁用特定查询优化器配置参数生成的计划时,手动计划管理可能非常有用。例如,可以通过在会话中禁用enable_merge_join并使用manual模式捕获查询计划来强制优化器不使用SQL语句的合并连接。

 

当您不知道应该由QPM管理哪些特定的SQL语句,或者使用应用程序框架(如Hibernate)动态生成SQL语句时,您可以使用automatic来处理许多遭受计划不稳定的语句。可以通过设置apg_plan_mgmt来启用自动计划捕获。capture_plan_baseline在DB参数组或DB集群参数组中自动。该参数生效后,将捕获后续所有的查询计划。


您可以查看apg_plan_mgmt.dba_plans视图中的查询计划。该视图为您提供了对估计和实际统计数据的访问,这有助于您决定是否要使用pg_hint_plan或自定义参数值来影响优化器。

 

apg_plan_mgmt.use_plan_baselines

 

apg_plan_mgmt.capture_plan_baseline设置为off以外的值使您能够捕获apg_plan_management.dba_plans中的查询计划。在捕获计划之后,数据库管理员可以选择批准或拒绝计划。

 

正如我们所讨论的,PostgreSQL优化器是一个基于成本的优化器,默认情况下,它使用成本小的计划。如果希望迫使优化器根据托管计划评估生成的计划,则需要启用apg_plan_mgmt。通过将其设置为true来使用plan_baseline。 该参数可以在DB集群参数组、DB参数组中设置,也可以在会话级别设置,无需重启。这个参数对于在QPM管理的计划和默认基于成本的PostgreSQL计划之间切换非常有用。

 

apg_plan_mgmt.plan_retention_period

 

QPM使用共享内存存储查询计划。如果未使用的计划未被清理,Aurora PostgreSQL将耗尽为QPM预留的共享内存。可以设置apg_plan_mgmt。将Plan_retention_period设置为非零整数以启用自动管理。它定义了删除未使用计划的天数,默认为32天。您也可以使用apg_plan_mgmt.delete_plan( )函数手动删除计划。

apg_plan_mgmt.max_plans

 

apg_plan_mgmt.max_plans控制QPM可以管理的SQL语句的数量。此参数设置apg_plan_mgmt中维护的SQL语句的数量限制。dba_plans视图。默认值是1000;值越大,需要向QPM分配更多的共享内存。可以修改apg_plan_mgmt.max_plans在DB集群参数组中,或者在DB参数组中,并且更改需要重新启动才能生效。

 

apg_plan_mgmt.max_databases

 

为其设置apg_plan_mgmt扩展的每个数据库都有一个单独的apg_plan_mgmt.Dba_plans视图,供数据库管理员查看托管计划。默认情况下,QPM可以管理10个数据库的查询计划,可以通过设置apg_plan_mgmt来增加它。将Max_database设置为更大的值。增加QPM管理的数据库数量将导致为QPM计划管理保留更多的共享内存。您可以在DB集群参数组或DB参数组中更改此参数,更改需要重新启动才能生效。

 

结论

本系列博客讨论了Aurora PostgreSQL的特定参数,以及如何通过调优这些参数来控制数据库行为。在这篇文章中,我们了解了Aurora内存利用率和缓冲区大小与社区PostgreSQL的不同,以及它们对性能的可能影响。我们还研究了Aurora PostgreSQL提供的其他参数,以控制查询运行计划更改导致的性能回归。

相关文章