参数配置
PostgreSQL 参数可以在多个层级进行配置,不同层级的参数设置具有不同的作用范围和优先级。 Pigsty 支持在四个层级配置 PostgreSQL 参数,从全局到局部依次为:
| 层级 | 作用范围 | 配置方式 | 存储位置 |
|---|---|---|---|
| 集群级 | 整个集群所有实例 | Patroni DCS / 调优模板 | etcd + postgresql.conf |
| 实例级 | 单个 PostgreSQL 实例 | pg_parameters / ALTER SYSTEM |
postgresql.auto.conf |
| 数据库级 | 特定数据库的所有会话 | pg_databases[].parameters |
pg_db_role_setting |
| 用户级 | 特定用户的所有会话 | pg_users[].parameters |
pg_db_role_setting |
参数优先级从低到高:集群级 < 实例级 < 数据库级 < 用户级 < 会话级(SET 命令)。
高优先级的设置会覆盖低优先级的设置。
关于 PostgreSQL 参数的完整说明,请参阅 PostgreSQL 官方文档:服务器配置。
集群级参数
集群级参数是整个 PostgreSQL 集群共享的配置,所有实例(主库和从库)都会使用相同的参数值。 在 Pigsty 中,集群级参数通过 Patroni 管理,存储在分布式配置存储(DCS,默认为 etcd)中。
Pigsty 提供了四种预置的 Patroni 参数优化模板,针对不同的使用场景进行了优化,通过 pg_conf 参数指定:
| 模板 | 适用场景 | 特点 |
|---|---|---|
oltp.yml |
在线事务处理 | 低延迟、高并发,默认推荐 |
olap.yml |
在线分析处理 | 大查询、高吞吐,适合数仓 |
crit.yml |
核心金融业务 | 最大持久性,牺牲部分性能换取安全 |
tiny.yml |
微型实例 | 资源受限环境,适合开发测试 |
调优模板文件位于 Pigsty 安装目录的 roles/pgsql/templates/ 目录下,包含了根据硬件规格自动计算的参数值。
这些模板会在集群初始化时渲染为 Patroni 配置文件 /etc/patroni/patroni.yml。更多详情请参阅 场景模板。
在集群创建前,您可以通过调整这些 Patroni 配置模板来修改集群的 初始化参数。 一旦集群初始化完成,后续的参数修改应通过 Patroni 的 配置管理 机制进行。
Patroni DCS 配置
Patroni 将集群配置存储在 DCS(分布式配置存储,默认为 etcd)中,确保集群所有成员使用一致的配置。
配置存储结构:
配置渲染流程:
- 初始化阶段:调优模板(如
oltp.yml)通过 Jinja2 渲染为/etc/patroni/patroni.yml - 启动阶段:Patroni 读取本地配置,将 PostgreSQL 参数写入 DCS
- 运行阶段:Patroni 定期从 DCS 同步配置到本地 PostgreSQL
本地缓存机制:
每个 Patroni 实例会在本地缓存 DCS 配置,位于 /pg/conf/<instance>.yml:
- 启动时:从 DCS 加载配置,缓存到本地
- 运行时:定期同步 DCS 配置到本地缓存
- DCS 不可用时:使用本地缓存继续运行(但无法进行主从切换)
配置文件层次
Patroni 会将 DCS 中的配置渲染到本地 PostgreSQL 配置文件,形成以下层次结构:
配置加载顺序(优先级从低到高):
postgresql.conf:Patroni 动态生成,包含 DCS 中的集群参数postgresql.base.conf:通过include指令加载,包含静态基础配置postgresql.auto.conf:PostgreSQL 自动加载,用于实例级参数覆盖
由于 postgresql.auto.conf 最后加载,其中的参数会覆盖前面文件中的同名参数。
实例级参数
实例级参数仅对单个 PostgreSQL 实例生效,用于覆盖集群级配置或设置实例特定的参数。
实例级参数会写入 postgresql.auto.conf 文件,由于该文件最后加载,可以覆盖集群级的任何参数。
这是一项非常有用的技术:您可以为特定实例设置不同于集群的参数值,例如:
- 为从库设置
hot_standby_feedback = on - 为特定实例调整
work_mem或maintenance_work_mem - 为延迟从库设置
recovery_min_apply_delay
使用 pg_parameters
在 Pigsty 配置中,使用 pg_parameters 参数定义实例级配置:
使用 ./pgsql.yml -l <cls> -t pg_param 子任务,可以将参数配置应用生效,这些参数会被渲染到 postgresql.auto.conf 文件中。
参数覆盖层次
pg_parameters 可以在 Ansible 配置的不同层次定义,优先级从低到高:
使用 ALTER SYSTEM
除了通过配置文件,还可以在运行时使用 SQL 命令 ALTER SYSTEM 修改实例级参数:
ALTER SYSTEM 会将参数写入 postgresql.auto.conf 文件。
注意:在 Pigsty 管理的集群中,
postgresql.auto.conf由 Ansible 通过pg_parameters管理。 手动使用ALTER SYSTEM修改的参数可能会在下次执行 playbook 时被覆盖。 建议通过修改pigsty.yml中的pg_parameters来管理实例级参数。
列表类型参数
PostgreSQL 中有一类特殊的参数接受逗号分隔的列表值。在 YAML 配置文件中配置这类参数时, 整个值必须用引号包裹,否则 YAML 解析器会将其解释为数组而导致错误:
Pigsty 会自动识别以下列表类型参数,在渲染到配置文件时 不添加外层引号:
| 参数 | 说明 | 示例值 |
|---|---|---|
shared_preload_libraries |
预加载共享库 | 'timescaledb, pg_stat_statements' |
search_path |
Schema 搜索路径 | '"$user", public, app' |
local_preload_libraries |
本地预加载库 | 'auto_explain' |
session_preload_libraries |
会话预加载库 | 'pg_hint_plan' |
log_destination |
日志输出目标 | 'csvlog, stderr' |
unix_socket_directories |
Unix Socket 目录 | '/var/run/postgresql, /tmp' |
temp_tablespaces |
临时表空间 | 'ssd_space, hdd_space' |
debug_io_direct |
直接 I/O 模式(PG16+) | 'data, wal' |
渲染示例:
数据库级参数
数据库级参数针对特定数据库生效,连接到该数据库的所有会话都会应用这些参数设置。
通过 ALTER DATABASE ... SET 实现,存储在系统表 pg_db_role_setting 中。
配置方式
在 pg_databases 中使用 parameters 字段定义:
与实例级参数相同,列表类型参数值在 YAML 中需要用引号包裹。
参数渲染规则
数据库级参数通过 ALTER DATABASE ... SET 语句设置。Pigsty 会根据参数类型自动选择正确的语法:
列表类型参数(search_path、temp_tablespaces、local_preload_libraries、session_preload_libraries、log_destination)不加外层引号:
标量参数 使用引号包裹值:
注意:虽然
log_destination在数据库级参数白名单中,但由于其context为sighup, 实际上无法在数据库级别生效。此参数应在实例级(pg_parameters)配置。
查看数据库参数
手动管理
用户级参数
用户级参数针对特定数据库用户生效,该用户的所有会话都会应用这些参数设置。
通过 ALTER USER ... SET 实现,同样存储在系统表 pg_db_role_setting 中。
配置方式
在 pg_users 或 pg_default_roles 中使用 parameters 字段定义:
参数渲染规则
用户级参数的渲染规则与数据库级参数相同:
列表类型参数(search_path、temp_tablespaces、local_preload_libraries、session_preload_libraries)不加外层引号:
标量参数 使用引号包裹:
特殊值 DEFAULT
使用 DEFAULT(大小写不敏感)可以将参数重置为 PostgreSQL 默认值:
查看用户参数
手动管理
参数优先级
当同一参数在多个层级设置时,PostgreSQL 按以下优先级应用(从低到高):
关于数据库级与用户级的优先级:
当用户连接到特定数据库时,如果同一参数在数据库级和用户级都有设置, PostgreSQL 会使用 用户级参数,因为用户级优先级更高。
示例场景:
- 当
analyst用户连接到analytics数据库时:work_mem = 512MB(用户级优先) - 当其他用户连接到
analytics数据库时:work_mem = 256MB(数据库级生效) - 当
analyst用户连接到其他数据库时:work_mem = 512MB(用户级生效)