有奖:语音产品征文挑战赛火热进行中> HOT

使用场景

在一些业务场景下,数据库对象 database 对应相关的业务逻辑,典型的如 SaaS 场景下database 对应租户,因此需要解决 database 资源隔离的问题。本文主要讲述如何在云数据库 PostgreSQL 实例中实现 database 的 CPU 隔离以及管理系统配套的监控、迁移和审计方案,满足能灵活的租户及资源管理需求。

设置 database 资源隔离

说明:
当前只有 v13.14_r1.15、v14.11_r1.21、v15.1_r1.10、v16.2_r1.3及以上的 PostgreSQL 13、14、15、16的内核版本支持资源隔离能力,具体请参考 内核版本动态
如需开启 database 资源隔离模式,请 提交工单 联系我们开启插件 tencentdb_serverless 并设置相关参数。
参数 tencentdb_serverless.min_cpu_cores 为实例可设置的最小 CPU 核数,参数 tencentdb_serverless.max_cpu_cores 为实例可设置的最大 CPU 核数。这两个参数主要用于后台管理系统控制实例中 database 的资源隔离,用户可以查看但不需要修改。
所有的 CPU 资源设置为实时生效。
当您已经开启 tencentdb_serverless 插件并设置了相关插件参数 tencentdb_serverless.min_cpu_cores 和 tencentdb_serverless.max_cpu_cores 后,可以正式开始配置。您可以通过如下命令检查插件已经安装成功:
postgres=> \\dx;
List of installed extensions
Name | Version | Schema | Description
-----------------------+---------+------------+------------------------------------------------------------------------
pg_stat_log | 1.0 | public | track runtime execution statistics of all SQL statements executed
pg_stat_statements | 1.9 | public | track planning and execution statistics of all SQL statements executed
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
tencentdb_serverless | 1.0 | public | extension for serverless mode
tencentdb_system_stat | 1.0 | public | track execution statistics of querssy executed
(5 rows)
tencentdb_serverless.min_cpu_cores 和 tencentdb_serverless.max_cpu_cores 参数的初始值为实例当前 CPU 核心数,这两个参数主要用于后台管理系统控制实例中 database 的资源隔离,用户不需要修改。后续如果实例发生变配,则此二参数会随之改变。您可以基于如下命令来检查参数的当前值。
postgres=> show tencentdb_serverless.min_cpu_cores;
tencentdb_serverless.min_cpu_cores
------------------------------------
8
(1 row)

postgres=> show tencentdb_serverless.max_cpu_cores;
tencentdb_serverless.max_cpu_cores
------------------------------------
8
(1 row)
说明:
当实例中有多个 database 对象时,需要每个 database 都设置 CPU 资源限制才能使配置生效。
您可以使用如下语句查看当前实例中的所有 database,具体如下:
postgres=> select datname from pg_database where datname not like 'template%';
datname
------------
postgres
tenant_001
tenant_002
tenant_003
(4 rows)
插件和参数检查完毕之后,您可以开始设置每个 database 的 CPU 资源上限和下限。我们提供了相应的函数或视图供您使用。分别说明如下:

设置指定 database 的 CPU 资源限制。

函数定义如下:
tencentdb_serverless.set_database_cpu_limit(database_name text [, min_cpu_cores numeric(5,1), max_cpu_cores numeric(5,1)])
min_cpu_cores:该参数为 database 可使用的最低 CPU 核心数,在实例整体资源不足时,也能保证该 database 能分配到的配额。该配额为按比例分配。例如,当前实例有3个 database,分别为 A、B、C。A 设置的最低配额为2,B 设置的最低配额为3,C 设置的最低配额为3,实例当前的 CPU 核心为8核,则A能使用的最低核心数为(2 /(2 + 3 + 3))* 8 = 2核。
max_cpu_cores:该参数为 database 可使用的最高 CPU 核心数,该值不能超过实例当前的核心数。如您无需设置 database 的最高 CPU 资源限制,则设置为-1即可。
调用示例:
postgres=> select tencentdb_serverless.set_database_cpu_limit('tenant_001',2,2.5);
set_database_cpu_limit
------------------------
(1 row)

清除指定 database 的 CPU 资源限制。

说明:
当实例中某个 database 被删除后,系统自动删除其 CPU 资源配置数据。
函数定义如下:
tencentdb_serverless.reset_database_limit(database_name text)
调用示例:
postgres=> select tencentdb_serverless.reset_database_limit('tenant_001');
reset_database_limit
----------------------
(1 row)
清空实例中所有 database 的 CPU 资源限制。
函数定义如下:
tencentdb_serverless.reset_all_database_limit()
调用示例:
postgres=> select tencentdb_serverless.reset_all_database_limit();
reset_all_database_limit
--------------------------
(1 row)
查看当前实例中所有已配置的 CPU 资源限制详情。
我们提供视图 tencentdb_serverless.resource_limit_view,用于您查看当前实例中所有的已配置的 CPU 资源限制详情,字段定义如下:
列名
含义
database_name
数据库的名字。
min_cpu_cores
当前 database 可以使用的最小 CPU 核数。
max_cpu_cores
当前 database 可以使用的最大 CPU 核数。
min_mem_kilobytes
当前 database 可以使用的最小内存,单位为 KB。预留字段,暂时未使用
max_mem_kilobytes
当前 database 可以使用的最大内存,单位为 KB。预留字段,暂时未使用
调用示例:
postgres=> select * from tencentdb_serverless.resource_limit_view;
database_name | min_cpu_cores | max_cpu_cores | min_mem_kilobytes | max_mem_kilobytes
---------------+---------------+---------------+-------------------+-------------------
tenant_001 | 2.0 | 2.5 | |
tenant_002 | 2.0 | 2.5 | |
(2 rows)

进程监控

当实例中所有 database 配置了 CPU 资源隔离后,如果实例整体资源利用率比较高,则每个 database 能保证最低配置的 CPU 核数的使用。同时,如您需要查看当前系统中哪些 database 使用的资源较多,则可以使用 进程监控 能力。查看当前所有 database 的 CPU 资源使用详情可以使用如下语句:
postgres=> select datname,sum(cpu_usage) as cpu_usage from tencentdb_process_system_usage where datname !='NULL' group by datname;
datname | cpu_usage
------------+-----------
postgres | 3
tenant_001 | 1.99
tenant_002 | 1
(3 rows)
当进程监控发现某些 database 资源使用率比较高时,您可以实时调整该 database 的 CPU 的配置,该配置可以实时生效

资源迁移

当 database 对应租户,且我们通过进程监控发现该 database 的资源使用一直很高需要进行资源再整合时,云数据库 PostgreSQL 提供了数据迁移能力,您可以配置云数据库 PostgreSQL 的 逻辑迁移。配置迁移任务如下图所示:


租户审计

云数据库 PostgreSQL 提供了 数据库审计 功能,能满足您对于租户操作的审计需要。数据库审计能记录实例级别的 database 、用户以及 SQL 明细,辅助业务进一步的管理租户。具体如下图所示:




关闭 database 资源隔离

如您需要关闭 database 的 CPU 资源隔离模式,请 提交工单 联系我们进行清理数据。后端工程师收到工单后,会重置所有的 CPU 资源参数tencentdb_serverless.min_cpu_cores 和 tencentdb_serverless.max_cpu_cores ,取消所有的资源配置,最后会删除插件 tencentdb_serverless。