暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PolarDB-PG高可用特性——Resource Manager

PolarDB农夫山泉 2023-07-24
148

PolarDB PostgreSQL版(简称 PolarDB-PG)是一款阿里云自主研发的云原生关系型数据库产品,100% 兼容 PostgreSQL,高度兼容Oracle语法;采用基于 Shared-Storage 的存储计算分离架构,具有极致弹性、毫秒级延迟、HTAP 的能力和高可靠、高可用、弹性扩展等企业级数据库特性。同时,PolarDB 具有大规模并行计算能力,可以应对OLTP与OLAP混合负载。

背景

PolarDB for PostgreSQL 的内存可以分为以下三部分:

  • 共享内存
  • 进程间动态共享内存
  • 进程私有内存

进程间动态共享内存和进程私有内存是 动态分配 的,其使用量随着实例承载的业务运行情况而不断变化。过多使用动态内存,可能会导致内存使用量超过操作系统限制,触发内核内存限制机制,造成实例进程异常退出,实例重启,引发实例不可用的问题。

进程私有内存 MemoryContext 管理的内存可以分为两部分:

  • 工作计算区域内存:业务运行所需的内存,此部分内存会影响业务的正常运行;
  • Cache 内存:数据库会把部分内部元数据存放在进程内,此部分内存只会影响数据库性能;

目标

为了解决以上问题,PolarDB for PostgreSQL 增加了 Resource Manager 资源限制机制,能够在实例运行期间,周期性检测资源使用情况。对于超过资源限制阈值的进程,强制进行资源限制,降低实例不可用的风险。

Resource Manager 主要的限制资源有:

  • 内存
  • CPU
  • I/O

当前仅支持对内存资源进行限制。

内存限制原理

内存限制依赖 Cgroup,如果不存在 Cgroup,则无法有效进行资源限制。Resource Manager 作为 PolarDB for PostgreSQL 一个后台辅助进程,周期性读取 Cgroup 的内存使用数据作为内存限制的依据。当发现存在进程超过内存限制阈值后,会读取内核的用户进程内存记账,按照内存大小排序,依次对内存使用量超过阈值的进程发送中断进程信号(SIGTERM)或取消操作信号(SIGINT)。

内存限制方式

Resource Manager 守护进程会随着实例启动而建立,同时对 RW、RO 以及 Standby 节点起作用。可以通过修改参数改变 Resource Manager 的行为。

  • enable_resource_manager:是否启动 Resource Manager,取值为 on / off,默认值为 on
  • stat_interval:资源使用量周期检测的间隔,单位为毫秒,取值范围为 10-10000,默认值为 500
  • total_mem_limit_rate:限制实例内存使用的百分比,当实例内存使用超过该百分比后,开始强制对内存资源进行限制,默认值为 95
  • total_mem_limit_remain_size:实例内存预留值,当实例空闲内存小于预留值后,开始强制对内存资源进行限制,单位为 kB,取值范围为 131072-MAX_KILOBYTES(整型数值最大值),默认值为 524288
  • mem_release_policy:内存资源限制的策略
    • none:无动作
    • default:缺省策略(默认值),优先中断空闲进程,然后中断活跃进程
    • cancel_query:中断活跃进程
    • terminate_idle_backend:中断空闲进程
    • terminate_any_backend:中断所有进程
    • terminate_random_backend:中断随机进程

内存限制效果

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论