这是本节的多页打印视图。 .
集群配置
Pigsty 是一个“配置驱动”的 PostgreSQL 平台:所有行为都来自 ~/pigsty/conf/*.yml 清单与 PGSQL 参数 的组合。
只要写好配置,你就能在几分钟内复刻出一套包含实例、用户、数据库、访问控制、扩展与调优策略的定制集群。
配置入口
- 准备清单:复制
pigsty/conf/*.yml模板或从零开始编写 Ansible Inventory,将集群分组(all.children.<cls>.hosts)与全局变量(all.vars)写入同一个文件。 - 定义参数:在
vars区块中覆盖需要的PGSQL参数。全局 → 集群 → 主机的覆盖顺序决定了最终值。 - 应用配置:运行
./configure -c <conf>或bin/pgsql-add <cls>等剧本让配置落地。Pigsty 会根据参数生成 Patroni/pgbouncer/pgbackrest 等服务所需的配置文件。
Pigsty 默认的 Demo 清单 conf/pgsql.yml 就是一份最小化示例:一个 pg-meta 集群、全局 pg_version: 18、少量业务用户与数据库定义。你可以在此基础上扩展更多集群。
关注点与文档索引
Pigsty 的 PostgreSQL 配置可以从以下几个维度组合,后续文档会逐一展开“如何配置”:
- 集群实例:通过
pg_cluster / pg_role / pg_seq / pg_upstream定义实例拓扑(单机、主从、备份集群、延迟集群、Citus 等)。 - 内核版本:使用
pg_version、pg_mode、pg_packages、pg_extensions、pg_conf等参数挑选核心版本、风味和调优模板。 - 用户/角色:在
pg_default_roles与pg_users中声明系统角色、业务账号、密码策略以及连接池属性。 - 数据库对象:借助
pg_databases、baseline、schemas、extensions、pool_*字段按需创建数据库并自动接入 pgbouncer/Grafana。 - 访问控制 (HBA):利用
pg_default_hba_rules与pg_hba_rules维护主机级认证策略,保证不同角色/网络的访问边界。 - 权限模型 (ACL):通过
pg_default_privileges、pg_default_roles、pg_revoke_public等参数收敛对象权限,开箱即用地提供分层角色体系。
理解这些参数之后,你就可以针对任意业务需求写出“配置即基础设施”的声明式清单,Pigsty 会负责执行并确保幂等。
一个典型示例
下面的片段展示了如何在同一个配置文件中同时控制实例拓扑、内核版本、扩展、用户以及数据库:
pg-analytics集群包含一个主库和一个离线副本。- 全局指定
pg_version: 18与一套扩展示例,并加载olap.yml调优。 - 在
pg_databases与pg_users中声明业务对象,自动生成 schema/extension 与连接池条目。 - 附加的
pg_hba_rules限制了访问来源与认证方式。
修改并应用这份清单即可得到一套定制化的 PostgreSQL 集群,而无需手工逐项配置。
1 - 集群实例
根据需求场景选择合适的实例与集群类型,配置出满足需求的 PostgreSQL 数据库集群。
您可以定义不同类型的实例和集群,下面是 Pigsty 中常见的几种 PostgreSQL 实例/集群类型:
- 读写主库:定义单一实例集群。
- 只读从库:定义具有一个主库和一个副本的基本 HA 集群。
- 离线从库:定义专用于 OLAP/ETL/交互式查询的实例
- 同步备库:启用同步提交以确保没有数据丢失。
- 法定人数提交:使用多数同步提交获得更高的一致性级别。
- 备份集群:克隆现有集群并跟随它
- 延迟集群:克隆现有集群用于紧急数据恢复
- Citus集群:定义一个 Citus 分布式数据库集群
读写主库
我们从最简单的情况开始:由一个主库(Primary)组成的单实例集群:
这段配置言简意赅,自我描述,仅由 身份参数 构成。为方便使用 -l pg-test 限定目标,
通常仍建议让 Ansible Group 分组名与 pg_cluster 一致,但这不是成员发现的硬约束;
当前源码会按各主机的 pg_cluster 身份计算实际成员,因此同一 PostgreSQL 集群可以跨越多个清单分组。
使用以下命令创建该集群:
Demo 展示,开发测试,承载临时需求,进行无关紧要的计算分析任务时,使用单一数据库实例可能并没有太大问题。但这样的单机集群没有 高可用,当出现硬件故障时,您需要使用 PITR 或其他恢复手段来确保集群的 RTO / RPO。为此,您可以考虑为集群添加若干个 只读从库
只读从库
要添加一台只读从库(Replica)实例,您可以在 pg-test 中添加一个新节点,并将其 pg_role 设置为 replica。
如果整个集群不存在,您可以直接 创建 这个完整的集群。 如果集群主库已经初始化好了,那么您可以向现有集群 添加 一个从库:
当集群主库出现故障时,只读实例(Replica)可以在高可用系统的帮助下接管主库的工作。除此之外,只读实例还可以用于执行只读查询:许多业务的读请求要比写请求多很多,而大部分只读查询负载都可以由从库实例承担。
离线从库
离线实例(Offline)是专门用于服务慢查询、ETL、OLAP 流量和交互式查询等的专用只读从库。慢查询/长事务对在线业务的性能与稳定性有不利影响,因此最好将它们与在线业务隔离开来。
要添加离线实例,请为其分配一个新实例,并将 pg_role 设置为 offline。
专用离线实例的工作方式与常见的从库实例类似,但它在 pg-test-replica 服务中用作备份服务器。 也就是说,只有当所有 replica 实例都宕机时,离线和主实例才会提供此项只读服务。
许多情况下,数据库资源有限,单独使用一台服务器作为离线实例是不经济的做法。作为折中,您可以选择一台现有的从库实例,打上 pg_offline_query 标记,将其标记为一台可以承载"离线查询"的实例。在这种情况下,这台只读从库会同时承担在线只读请求与离线类查询。您可以使用 pg_default_hba_rules 和 pg_hba_rules 对离线实例进行额外的访问控制。
同步备库
当启用同步备库(Sync Standby)时,PostgreSQL 将选择一个从库作为 同步备库,其他所有从库作为 候选者。 主数据库会等待备库实例刷新到磁盘,然后才确认提交,备库实例始终拥有最新的数据,没有复制延迟,主从切换至同步备库不会有数据丢失。
PostgreSQL 默认使用异步流复制,主库故障时可能丢失尚未复制的 WAL。pg_rpo 配置的是 Patroni 候选副本的采样落后阈值,并非实际丢失量硬上限;实际窗口还取决于写入速率、复制状态与 Patroni 采样时机。
但在某些关键场景中(例如,金融交易),数据丢失是完全不可接受的,或者,读取复制延迟是不可接受的。在这种情况下,您可以使用同步提交来解决这个问题。 要启用同步备库模式,您可以简单地使用 pg_conf 中的 crit.yml 模板。
要在现有集群上启用同步备库,请 配置集群 并启用 synchronous_mode:
在这种情况下,PostgreSQL 配置项 synchronous_standby_names 由 Patroni 自动管理。
一台从库将被选拔为同步从库,它的 application_name 将被写入 PostgreSQL 主库配置文件中并应用生效。
法定人数提交
法定人数提交(Quorum Commit)提供了比同步备库更强大的控制能力:特别是当您有多个从库时,您可以设定提交成功的标准,实现更高/更低的一致性级别(以及可用性之间的权衡)。
如果想要 最少两个从 库来确认提交,可以通过 Patroni 配置集群,调整参数 synchronous_node_count 并应用生效
如果你想要使用更多的同步从库,修改 synchronous_node_count 的取值即可。当集群的规模发生变化时,您应当确保这里的配置仍然是有效的,以避免服务不可用。
在这种情况下,PostgreSQL 配置项 synchronous_standby_names 由 Patroni 自动管理。
应用配置后,出现两个同步备库。
另一种情景是,使用 任意 n 个 从库来确认提交。在这种情况下,配置的方式略有不同,例如,假设我们只需要任意一个从库确认提交:
应用后,配置生效,所有备库在 Patroni 中变为普通的 replica。但是在 pg_stat_replication 中可以看到 sync_state 会变为 quorum。
备份集群
您可以克隆现有的集群,并创建一个备份集群(Standby Cluster),用于数据迁移、水平拆分、多区域部署,或灾难恢复。
在正常情况下,备份集群将追随上游集群并保持内容同步,您可以将备份集群提升,作为真正地独立集群。
备份集群的定义方式与正常集群的定义基本相同,除了在主库上额外定义了 pg_upstream 参数,备份集群的主库被称为 备份集群领导者 (Standby Leader)。
例如,下面定义了一个 pg-test 集群,以及其备份集群 pg-test2,其配置清单可能如下所示:
而 pg-test2 集群的主节点 pg-test2-1 将是 pg-test 的下游从库,并在 pg-test2 集群中充当备份集群领导者(Standby Leader)。
只需确保备份集群的主节点上配置了 pg_upstream 参数,以便自动从原始上游拉取备份。
如果您在一台从库上指定了 pg_upstream,而不是主库。那么可以配置集群的 级联复制(Cascade Replication)
在配置级联复制时,您必须使用集群中某一个实例的 IP 地址作为参数的值,否则初始化会报错。该从库从特定的实例进行流复制,而不是主库。
这台充当 WAL 中继器的实例被称为 桥接实例(Bridge Instance)。使用桥接实例可以分担主库发送 WAL 的负担,当您有几十台从库时,使用桥接实例级联复制是一个不错的注意。
延迟集群
延迟集群(Delayed Cluster)是一种特殊类型的 备份集群,用于尽快恢复"意外删除"的数据。
例如,如果你希望有一个名为 pg-testdelay 的集群,其数据内容与一小时前的 pg-test 集群相同:
当某些元组和表格被意外删除时,你可以通过修改此参数的方式,将此延迟集群推进到适当的时间点,并从中读取数据,快速修复原始集群。
延迟集群需要额外的资源,但比起 PITR 要快得多,并且对系统的影响也小得多,对于非常关键的集群,可以考虑搭建延迟集群。
Citus集群
Pigsty 原生支持 Citus。可以参考 conf/ha/citus.yml 作为完整样例。
要定义一个 citus 集群,您需要指定以下参数:
pg_mode必须设置为citus,而不是默认的pgsql- 在每个分片集群上都必须定义分片名
pg_shard和分片号pg_group - 必须定义
pg_primary_db来指定由 Patroni 管理的 Citus 数据库。 - 如果您想使用
pg_dbsu的postgres而不是默认的pg_admin_username来执行管理命令,那么pg_dbsu_password必须设置为非空的纯文本密码
此外,还需要额外的 hba 规则,允许从本地和其他数据节点进行 SSL 访问。如下所示:
在协调者节点上,您可以创建分布式表和引用表,并从任何数据节点查询它们。从 11.2 开始,任何 Citus 数据库节点都可以扮演协调者的角色了。
2 - 内核版本
在 Pigsty 中选择"内核"意味着确定 PostgreSQL 大版本、模式/发行版、需要安装的包以及要加载的调优模板。
Pigsty v4.5 当前源码支持 PostgreSQL 14 - 18,默认使用 18。下方内容展示如何通过配置文件完成这些选择。
大版本与软件包
pg_version:指定 PostgreSQL 主版本(默认 18)。Pigsty 会根据版本自动映射到正确的包名前缀。pg_packages:定义需要安装的核心包集合,支持使用 包别名(默认pgsql-main pgsql-common,包含内核 + patroni/pgbouncer/pgbackrest 等常用工具)。pg_extensions:额外需要安装的扩展包列表,同样支持别名;缺省为空表示只装核心依赖。
效果:Ansible 在安装阶段会拉取与
pg_version=18对应的包,将扩展预装到系统中,随后数据库初始化脚本即可直接CREATE EXTENSION。
Pigsty 的离线仓库中不同版本的扩展支持范围不同:14 可用扩展相对较少,17/18 覆盖最广。若某扩展未预打包,可通过 repo_extra_packages 追加。
内核模式(pg_mode)
pg_mode 控制要部署的内核“风味”,默认 pgsql 表示标准 PostgreSQL。Pigsty 目前支持以下模式:
| 模式 | 场景 |
|---|---|
pgsql |
标准 PostgreSQL,高可用 + 复制 |
citus |
Citus 分布式集群,需要额外的 pg_shard / pg_group |
gpsql |
Cloudberry / Greenplum / MatrixDB |
mssql |
Babelfish |
mysql |
OpenGauss/HaloDB 兼容 MySQL 协议 |
polar |
阿里 PolarDB(基于 pg polar 发行) |
ivory |
IvorySQL(Oracle 兼容语法) |
pgtde |
Percona PostgreSQL + pg_tde,使用 /usr/pgtde-$v |
oriole |
OrioleDB 存储引擎 |
agens |
AgensGraph 图数据库内核 |
pgedge |
pgEdge 分布式复制内核 |
pg_mode 决定二进制路径、Patroni 集成方式及部分内核特定逻辑;它本身不会自动替你补齐所有软件包、扩展与业务数据库。实际部署时应使用匹配的 conf/*.yml 配置模板,或显式配置 pg_packages、pg_extensions、pg_libs 与 pg_databases。以下是一个精简的 Citus 示例:
conf/ha/citus.yml提供了当前完整样例;上面的精简配置显式安装 Citus 包,并在citus数据库中创建扩展。
扩展与预置对象
除了系统包,你还可以通过以下参数控制数据库启动后自动加载的组件:
pg_libs:写入shared_preload_libraries的列表。例如pg_libs: 'timescaledb, pg_stat_statements, auto_explain'。pg_default_extensions/pg_default_schemas:控制初始化脚本对template1与postgres预创建的 schema、扩展。pg_parameters:由 Pigsty 在配置阶段渲染进postgresql.auto.conf;不要再手工执行ALTER SYSTEM管理同一批参数。
示例:启用 TimescaleDB、pgvector 并自定义一些系统参数。
效果:初始化时
template1与postgres会创建默认扩展;新建且使用template1的业务库会继承这些对象。pg_parameters则直接写入postgresql.auto.conf。
调优模板 (pg_conf)
pg_conf 指向 roles/pgsql/templates/*.yml 中的 Patroni 模板。Pigsty 内置四套通用模板:
| 模板 | 适用场景 |
|---|---|
oltp.yml |
默认模板,面向 4–128 核的 TP 负载 |
olap.yml |
针对分析场景优化 |
crit.yml |
强调同步提交/最小延迟,适合金融等零丢失场景 |
tiny.yml |
轻量机 / 边缘场景 / 资源受限环境 |
你可以直接替换模板或自定义一个 YAML 文件放在 templates/ 下,然后在集群 vars 里指定。
效果:拷贝
crit.yml作为 Patroni 配置,叠加pg_parameters写入postgresql.auto.conf,使实例立即以同步提交模式运行。
组合实例:一个完整示例
- 第一台主库 + 一台 replica,使用
olap.yml调优。 - 安装 PG18 + RAG 常用扩展;只有需要预加载的库才应写入
pg_libs。 - Patroni/pgbouncer/pgbackrest 由 Pigsty 生成,无需手工干预。
根据业务需要替换上述参数即可完成内核层的全部定制。
3 - 别名翻译
PostgreSQL 在不同操作系统上的软件包命名规则存在显著差异:
- EL 系统(RHEL/Rocky/Alma/…)使用
pgvector_18,postgis36_18*这样的格式 - Debian/Ubuntu 系统 使用
postgresql-18-pgvector,postgresql-18-postgis-3这样的格式
这种差异给用户带来了额外的认知负担:您需要记住不同系统的包名规则,还要处理 PostgreSQL 版本号嵌入的问题。
软件包别名
Pigsty 通过 软件包别名(Package Alias) 机制解决了这个问题:您只需使用统一的别名,Pigsty 会处理好所有细节:
别名翻译
别名还可以将一组软件包归类为一个整体,例如 Pigsty 默认安装的软件包 —— pg_packages 的默认值是:
Pigsty 将查询当前的操作系统别名清单(假设为 el10.x86_64),将其翻译为 PGSQL 内核,扩展,以及工具包:
接下来,Pigsty 又进一步通过当前指定的 PG 大版本(假设 pg_version = 18),将 pgsql-main 翻译为:
通过这种方式,Pigsty 屏蔽了软件包的复杂性,让用户可以简单的指定自己想要的功能组件。
哪些变量可以使用别名?
您可以在以下四个参数中使用包别名,别名会根据翻译流程自动转换为实际的软件包名称:
pg_extensions- PG 扩展软件包pg_packages- PG 内核/基础工具软件包repo_packages- 软件包下载参数:下载到本地软件仓库的软件包repo_extra_packages- 扩展安装参数:额外下载到本地软件仓库的软件包
别名列表
你可以在 Pigsty 项目源代码的 roles/node_id/vars/ 目录下,找到各操作系统与架构对应的别名映射文件:
el10.x86_64el10.aarch64el9.x86_64el9.aarch64el8.x86_64el8.aarch64u24.x86_64u24.aarch64u22.x86_64u22.aarch64d13.x86_64d13.aarch64d12.x86_64d12.aarch64
工作原理
别名翻译流程
版本占位符
Pigsty 的别名系统使用 $v 作为 PostgreSQL 版本号的占位符。当您使用 pg_version 指定了 PostgreSQL 版本后,所有别名中的 $v 都会被替换为实际版本号。
例如,当 pg_version: 18 时:
| 别名定义 (EL) | 展开结果 |
|---|---|
postgresql$v* |
postgresql18* |
pgvector_$v* |
pgvector_18* |
timescaledb-tsl_$v* |
timescaledb-tsl_18* |
| 别名定义 (Debian/Ubuntu) | 展开结果 |
|---|---|
postgresql-$v |
postgresql-18 |
postgresql-$v-pgvector |
postgresql-18-pgvector |
postgresql-$v-timescaledb-tsl |
postgresql-18-timescaledb-tsl |
通配符匹配
在 EL 系统上,许多别名使用 * 通配符来匹配相关的子包。例如:
postgis36_18*会匹配postgis36_18、postgis36_18-client、postgis36_18-utils等postgresql18*会匹配postgresql18、postgresql18-server、postgresql18-libs、postgresql18-contrib等
这种设计确保您无需逐一列出每个子包,一个别名即可安装完整的扩展。
4 - 用户/角色
在本文中,“用户”(User) 指的是使用 SQL 命令
CREATE USER/ROLE创建的,数据库集簇内的逻辑对象。
在 PostgreSQL 中,用户直接隶属于数据库集簇而非某个具体的数据库。因此在创建业务数据库和业务用户时,应当遵循"先用户,后数据库"的原则。
Pigsty 通过两个配置参数定义数据库集群中的角色与用户:
pg_default_roles:定义全局统一使用的角色和用户pg_users:在数据库集群层面定义业务用户和角色
前者用于定义整套环境中共用的角色与用户,后者定义单个集群中特有的业务角色与用户。二者形式相同,均为用户定义对象的数组。 用户/角色按数组顺序逐一创建,因此后定义的用户可以属于先定义的角色。
默认情况下,所有带有 pgbouncer: true 标记的用户都会被添加到 Pgbouncer 连接池用户列表中。
定义用户
下面是 Pigsty 演示环境中默认集群 pg-meta 中的业务用户定义:
每个用户/角色定义都是一个复杂对象,可能包括以下字段,除了 name 字段外,其他字段均为可选字段:
用户级连接池限额字段统一使用
pool_connlimit(对应 Pgbouncermax_user_connections)。
参数总览
所有参数中唯一 必选 的字段是 name,它应该是当前 PostgreSQL 集群中有效且唯一的用户名,其他参数都有合理的默认值,均为可选项。
| 字段 | 分类 | 类型 | 属性 | 说明 |
|---|---|---|---|---|
name |
基本 | string |
必选 | 用户名,必须是有效且唯一的标识符 |
state |
基本 | enum |
可选 | 用户状态:create(默认)、absent |
password |
基本 | string |
可变 | 用户密码,明文或哈希 |
comment |
基本 | string |
可变 | 用户备注信息 |
login |
权限 | bool |
可变 | 是否允许登录,默认 true |
superuser |
权限 | bool |
可变 | 是否为超级用户,默认 false |
createdb |
权限 | bool |
可变 | 是否可创建数据库,默认 false |
createrole |
权限 | bool |
可变 | 是否可创建角色,默认 false |
inherit |
权限 | bool |
可变 | 是否继承所属角色权限,默认 true |
replication |
权限 | bool |
可变 | 是否可进行复制,默认 false |
bypassrls |
权限 | bool |
可变 | 是否可绕过行级安全,默认 false |
connlimit |
权限 | int |
可变 | 连接数限制,-1 表示不限制 |
expire_in |
有效期 | int |
可变 | 从当前日期起 N 天后过期(优先级高于 expire_at) |
expire_at |
有效期 | string |
可变 | 过期日期,YYYY-MM-DD 格式 |
roles |
角色 | array |
增量 | 所属角色数组,支持字符串或对象格式 |
parameters |
参数 | object |
可变 | 角色级参数 |
pgbouncer |
连接池 | bool |
可变 | 是否加入连接池,默认 false |
pool_mode |
连接池 | enum |
可变 | 池化模式:transaction(默认) |
pool_connlimit |
连接池 | int |
可变 | 连接池用户最大连接数 |
参数详情
name
字符串,必选参数,表示用户的名称,在一个数据库集群内必须唯一。
用户名必须是有效的 PostgreSQL 标识符,必须匹配正则表达式 ^[a-z_][a-z0-9_]{0,62}$:
以小写字母或下划线开头,只能包含小写字母、数字、下划线,最长 63 个字符。
state
枚举值,用于指定要对用户执行的操作,可以是 create 或 absent,默认值为 create。
| 状态 | 说明 |
|---|---|
create |
默认,创建用户,如果已存在则更新属性 |
absent |
删除用户,使用 DROP ROLE |
以下系统用户无法通过 state: absent 删除,这是为了防止误删关键系统用户导致集群故障:
postgres:数据库超级用户replicator:复制用户(或pg_replication_username配置的用户)dbuser_dba:管理员用户(或pg_admin_username配置的用户)dbuser_monitor:监控用户(或pg_monitor_username配置的用户)
password
字符串,可变参数,用于设置用户密码,不指定则用户无法使用密码登录。
密码可以是以下格式之一:
| 格式 | 示例 | 说明 |
|---|---|---|
| 明文密码 | DBUser.Meta |
不推荐,会被记录到配置文件和日志 |
| SCRAM-SHA-256 | SCRAM-SHA-256$4096:xxx$yyy:zzz |
推荐,PostgreSQL 10+ 默认认证方式 |
| MD5 哈希 | md5... |
兼容旧版本,不推荐新项目使用 |
设置密码时,Pigsty 会临时屏蔽当前会话的日志记录以避免密码泄露:
如果你不希望在配置文件中记录明文密码,可以使用 SCRAM-SHA-256 哈希字符串代替明文密码。生成 SCRAM-SHA-256 哈希的方法:
comment
字符串,可变参数,用于设置用户的备注信息,如果不指定,默认值为 business user {name}。
用户备注信息通过 COMMENT ON ROLE 语句设置,支持中文和特殊字符(Pigsty 会自动转义单引号)。
login
布尔值,可变参数,用于控制用户是否可以登录,默认值为 true。
设置为 false 则创建的是无法登陆的 角色(Role)而非用户(User),通常用于权限分组。
在 PostgreSQL 中,CREATE USER 等价于 CREATE ROLE ... LOGIN。
superuser
布尔值,可变参数,用于指定用户是否为超级用户,默认值为 false。
超级用户拥有数据库的全部权限,可以绕过所有权限检查。
Pigsty 已经提供了默认的超级用户 pg_admin_username (dbuser_dba)
除非绝对必要,否则不应创建额外的超级用户。
createdb
布尔值,可变参数,用于指定用户是否可以创建数据库,默认值为 false。
一些应用软件可能会要求自己创建数据库,例如 Gitea,Odoo 等,因此您可能需要为这些应用的管理员用户启用 CREATEDB 权限。
createrole
布尔值,可变参数,用于指定用户是否可以创建其他角色,默认值为 false。
拥有 CREATEROLE 权限的用户可以创建、修改、删除其他非超级用户角色。
inherit
布尔值,可变参数,用于控制用户是否自动继承所属角色的权限,默认值为 true。
设置为 false 时,用户需要通过 SET ROLE 显式切换角色才能使用所属角色的权限。
replication
布尔值,可变参数,用于指定用户是否可以发起流复制连接,默认值为 false。
通常只有复制用户(如 replicator)需要此权限。普通业务用户不应该拥有此权限,除非这是一个逻辑解码订阅者。
bypassrls
布尔值,可变参数,用于指定用户是否可以绕过行级安全(RLS)策略,默认值为 false。
启用此权限后,用户可以访问所有行,即使表上定义了行级安全策略。此权限通常只授予管理员用户。
connlimit
整数,可变参数,用于限制用户的最大并发连接数,默认值为 -1,表示不限制。
设置为正整数时,会限制该用户同时建立的最大数据库连接数。此限制不影响超级用户。
expire_in
整数,可变参数,用于指定用户从当前日期起多少天后过期。
此参数优先级高于 expire_at,如果同时指定两者,只有 expire_in 生效。
每次执行剧本时会根据当前日期重新计算过期时间,适合用于临时用户或需要定期续期的场景。
执行时会计算实际过期日期并生成对应的 SQL:
expire_at
字符串,可变参数,用于指定用户的过期日期,格式为 YYYY-MM-DD 或特殊值 infinity。
此参数优先级低于 expire_in。使用 infinity 表示用户永不过期。
roles
数组,增量参数,用于定义用户所属的角色。数组元素可以是字符串或对象。
简单格式使用字符串直接指定角色名:
完整格式使用对象定义,支持更精细的角色成员关系控制:
对象格式参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
name |
string | 角色名称(必选) |
state |
enum | grant(默认)或 absent/revoke:控制授予或撤销 |
admin |
bool | true:WITH ADMIN OPTION,false:REVOKE ADMIN |
set |
bool | PG16+:true:WITH SET TRUE,false:REVOKE SET |
inherit |
bool | PG16+:true:WITH INHERIT TRUE,false:REVOKE INHERIT |
PostgreSQL 16+ 新特性:
PostgreSQL 16 引入了更细粒度的角色成员关系控制:
- ADMIN OPTION:允许将角色授予其他用户
- SET OPTION:允许使用
SET ROLE切换到该角色 - INHERIT OPTION:是否自动继承该角色的权限
set 和 inherit 选项仅在 PostgreSQL 16+ 中有效,在早期版本会被忽略并在生成的 SQL 中添加警告注释。
parameters
对象,可变参数,用于设置角色级别的配置参数。参数通过 ALTER ROLE ... SET 设置,会对该用户的所有会话生效。
使用特殊值 DEFAULT(大小写不敏感)可以将参数重置为 PostgreSQL 默认值:
常用角色级参数:
| 参数 | 说明 | 示例值 |
|---|---|---|
work_mem |
查询工作内存 | '64MB' |
statement_timeout |
语句超时时间 | '30s' |
lock_timeout |
锁等待超时 | '10s' |
idle_in_transaction_session_timeout |
空闲事务超时 | '10min' |
search_path |
Schema 搜索路径 | 'app,public' |
log_statement |
日志记录级别 | 'ddl' |
temp_file_limit |
临时文件大小限制 | '10GB' |
您可以从数据库的 pg_db_role_setting 系统视图查询用户级别的参数设置。
pgbouncer
布尔值,可变参数,用于控制是否将用户添加到 Pgbouncer 连接池用户列表,默认值为 false。
对于需要通过连接池访问数据库的生产用户,必须显式设置 pgbouncer: true。
默认为 false 是为了避免意外将内部用户暴露给连接池。
设置 pgbouncer: true 的用户会被添加到 /etc/pgbouncer/userlist.txt 文件中。
pool_mode
枚举值,可变参数,用于设置用户级别的池化模式,可选值为 transaction、session 或 statement,默认值为 transaction。
| 模式 | 说明 | 适用场景 |
|---|---|---|
transaction |
事务结束后归还连接 | 大多数 OLTP 应用,默认推荐 |
session |
会话结束后归还连接 | 需要会话状态的应用(如 SET 命令) |
statement |
每条语句后归还连接 | 简单无状态查询,极致复用 |
用户级别的连接池参数通过 /etc/pgbouncer/useropts.txt 文件配置:
pool_connlimit
整数,可变参数,用于设置用户级别的连接池最大连接数。省略时不生成用户级覆盖项,继承 Pigsty 在 pgbouncer.ini 中设置的全局默认值 100;PgBouncer 使用 0 表示不限制。
ACL 系统
Pigsty 提供一套内置的访问控制 / ACL 模型,可以将以下默认业务角色分配给用户:
| 角色 | 权限说明 | 典型使用场景 |
|---|---|---|
dbrole_readwrite |
全局读写访问 | 主属业务的生产账号 |
dbrole_readonly |
全局只读访问 | 其他业务的只读访问 |
dbrole_admin |
拥有 DDL 权限 | 业务管理员,需要建表的场景 |
dbrole_offline |
独立只读访问;实例范围由 HBA 控制 | 个人用户,ETL/分析任务 |
dbrole_offline 本身不会把用户限制到离线实例。若需要该边界,应为对应 HBA 规则设置 role: offline;详见 离线角色与实例隔离。
如果您希望重新设计您自己的 ACL 系统,可以考虑定制以下参数和模板:
pg_default_roles:系统范围的角色和全局用户pg_default_privileges:新建对象的默认权限pg-init-roles.sql:角色创建 SQL 模板pg-init-template.sql:权限 SQL 模板
Pgbouncer 用户
默认情况下启用 Pgbouncer 作为连接池中间件。Pigsty 默认将 pg_users 中显式带有 pgbouncer: true 标志的所有用户添加到 Pgbouncer 用户列表中。
Pgbouncer 连接池中的用户在 /etc/pgbouncer/userlist.txt 中列出:
用户级别的连接池参数使用另一个单独的文件 /etc/pgbouncer/useropts.txt 进行维护:
当您 创建用户 时,Pgbouncer 的用户列表定义文件将会被刷新,并通过在线重载配置的方式生效,不会影响现有的连接。
Pgbouncer 使用和 PostgreSQL 相同的 dbsu 运行,默认为 postgres 操作系统用户。您可以使用 pgb 别名,使用 dbsu 访问 Pgbouncer 管理功能。
pgbouncer_auth_query 参数允许您使用动态查询来完成连接池用户认证,当您不想手动管理连接池中的用户时,这是一种便捷的方案。
相关资源
关于用户管理操作,请参考 用户管理 一节。
关于用户的访问权限,请参考 访问控制:角色体系。
5 - 数据库
在本文中,“数据库”(Database) 指的是使用 SQL 命令
CREATE DATABASE创建的,数据库集簇内的逻辑对象。
一组 PostgreSQL 服务器可以同时服务于多个 数据库 (Database)。在 Pigsty 中,你可以在集群配置中 定义 好所需的数据库。
Pigsty 会对默认模板数据库 template1 进行修改与定制,创建默认模式,安装默认扩展,配置默认权限,新创建的数据库默认会从 template1 继承这些设置。
您也可以通过 template 参数指定其他模板数据库,实现瞬间 数据库克隆。
默认情况下,所有业务数据库都会被 1:1 添加到 Pgbouncer 连接池 中;pg_exporter 默认会通过 自动发现 机制查找所有业务数据库并进行库内对象监控。
所有数据库也会添加到所有 INFRA节点 上的 Grafana 中,
注册为 PostgreSQL 数据源供 PGCAT 监控面板使用。
定义数据库
业务数据库定义在数据库集群参数 pg_databases 中,这是一个数据库定义构成的对象数组。
在集群初始化时,数组内的数据库按照 定义顺序 依次创建,因此后面定义的数据库可以使用先前定义的数据库作为 模板。
下面是 Pigsty 演示环境中默认集群 pg-meta 中的数据库定义:
每个数据库定义都是一个复杂对象,可能包括以下字段,除了 name 字段外,其他字段均为可选字段:
自 Pigsty
v4.1.0起,数据库连接池参数统一使用pool_reserve与pool_connlimit,旧别名pool_size_reserve/pool_max_db_conn已收敛。
参数总览
所有参数中唯一 必选 的字段是 name,它应该是当前 PostgreSQL 集群中有效且唯一的数据库名称,其他参数都有合理的默认值,均为可选项。
带有 “不可变” 标记的参数仅在数据库创建时生效,创建后无法修改,若需更改则必须删除并重建数据库。
| 字段 | 分类 | 类型 | 属性 | 说明 |
|---|---|---|---|---|
name |
基本 | string |
必选 | 数据库名称,必须是有效且唯一的标识符 |
state |
基本 | enum |
可选 | 数据库状态:create(默认)、absent、recreate |
owner |
基本 | string |
可变 | 数据库属主,不指定则为 postgres |
comment |
基本 | string |
可变 | 数据库备注信息 |
template |
模板 | string |
不可变 | 创建时使用的模板数据库,默认 template1 |
strategy |
模板 | enum |
不可变 | 克隆策略:FILE_COPY 或 WAL_LOG(PG15+) |
encoding |
编码 | string |
不可变 | 字符编码,默认继承模板(UTF8) |
locale |
编码 | string |
不可变 | 本地化规则,默认继承模板(C) |
lc_collate |
编码 | string |
不可变 | 排序规则,默认继承模板(C) |
lc_ctype |
编码 | string |
不可变 | 字符分类,默认继承模板(C) |
locale_provider |
编码 | enum |
不可变 | 本地化提供者:libc、icu、builtin(PG15+) |
icu_locale |
编码 | string |
不可变 | ICU 本地化规则(PG15+) |
icu_rules |
编码 | string |
不可变 | ICU 排序定制规则(PG16+) |
builtin_locale |
编码 | string |
不可变 | 内置本地化规则(PG17+) |
tablespace |
存储 | string |
可变 | 默认表空间,修改会触发数据迁移 |
is_template |
权限 | bool |
可变 | 是否标记为模板数据库 |
allowconn |
权限 | bool |
可变 | 是否允许连接,默认 true |
revokeconn |
权限 | bool |
可变 | 是否回收 PUBLIC 的 CONNECT 权限 |
connlimit |
权限 | int |
可变 | 连接数限制,-1 表示不限制 |
baseline |
初始化 | string |
可变 | SQL 基线文件路径,每次置备该数据库时执行 |
schemas |
初始化 | (string|object)[] |
可变 | 要创建的模式定义数组 |
extensions |
初始化 | (string|object)[] |
可变 | 要安装的扩展定义数组 |
parameters |
初始化 | object |
可变 | 数据库级参数 |
pgbouncer |
连接池 | bool |
可变 | 是否加入连接池,默认 true |
pool_mode |
连接池 | enum |
可变 | 池化模式:transaction(默认) |
pool_size |
连接池 | int |
可变 | 默认池大小,默认 50 |
pool_size_min |
连接池 | int |
可变 | 最小池大小,默认 0 |
pool_reserve |
连接池 | int |
可变 | 保留池大小,默认 30 |
pool_connlimit |
连接池 | int |
可变 | 最大数据库连接数,默认 100 |
pool_auth_user |
连接池 | string |
可变 | 认证查询用户 |
register_datasource |
监控 | bool |
可变 | 是否注册到 Grafana 数据源,默认 true |
参数详情
name
字符串,必选参数,表示数据库的名称,在一个数据库集群内必须唯一。
当前角色没有对数据库名称实施这一正则校验,SQL 中也会用双引号引用名称;但名称同时参与临时文件路径与 Shell/SQL 命令拼接。为保证整条自动化链路安全可用,建议限制为 63 字节以内,并遵循 ^[A-Za-z_][A-Za-z0-9_$]{0,62}$,不要使用空格、引号、斜杠或其他特殊字符。
state
枚举值,用于指定要对数据库执行的操作,可以是 create、absent 或 recreate,默认值为 create。
| 状态 | 说明 |
|---|---|
create |
默认,创建或修改数据库,如果已经存在,则将可变参数调整到描述的状态 |
absent |
删除数据库,使用 DROP DATABASE WITH (FORCE) |
recreate |
先删除再创建,用于重置数据库 |
owner
字符串,指定数据库的属主用户,默认不指定,不指定则为数据库 pg_dbsu,即 postgres 用户。
要指定数据库的 owner,被指定的用户必须已存在。修改 owner 会执行:旧 Owner 在数据库上的权限不会被撤回。
数据库属主具有对数据库的完全控制权限,包括创建模式、表、扩展等对象的权限,对于多租户场景尤为有用。
comment
字符串,用于设置数据库的备注信息,如果不指定,默认值为 business database {name}。
数据库备注信息通过 COMMENT ON DATABASE 语句设置,支持中文和特殊字符(Pigsty 会自动转义单引号)。
备注信息会存储在共享对象注释目录 pg_shdescription 中,可以通过 \l+ 命令查看。
template
字符串,不可变参数,用于指定创建数据库时使用的模板数据库,默认值为 template1。
PostgreSQL 的 CREATE DATABASE 本质上是对模板数据库进行复制,新数据库会继承模板中的所有对象、扩展、模式、权限设置等。
Pigsty 会在集群初始化阶段对 template1 进行定制配置,因此新建数据库默认会继承这些设置。
| 模板 | 说明 |
|---|---|
template1 |
默认模板,包含 Pigsty 预配置的扩展、模式和权限设置 |
template0 |
干净模板,使用不同于集群默认的本地化提供者时,必须使用此模板 |
| 自定义数据库 | 可以使用已有数据库作为模板进行克隆 |
使用 icu 或 builtin 本地化提供者时,必须指定 template: template0,因为 template1 已有本地化设置无法覆盖。
使用其他
使用 template0 时,监控所需的扩展与 Schema,以及角色的默认权限都不再自动创建,这允许你从一个完全干净的模板开始定制数据库。
strategy
枚举值,不可变参数,用于指定从模板克隆数据库的策略,可选值为 FILE_COPY 或 WAL_LOG,此参数在 PostgreSQL 15 及以上版本可用。
| 策略 | 说明 | 适用场景 |
|---|---|---|
FILE_COPY |
直接复制数据文件,并在前后执行检查点 | 大模板、希望减少 WAL 量 |
WAL_LOG |
逐块复制并写入 WAL,PG15+ 默认 | 小模板、不阻塞模板上的连接 |
WAL_LOG 策略的优势是复制过程中不会阻塞模板数据库上的连接,但对于较大的模板效率不如 FILE_COPY。
在 PostgreSQL 14 及更早版本中,此参数会被忽略。
encoding
字符串,不可变参数,用于指定数据库的字符编码,如果不指定则继承模板数据库的编码设置,通常为 UTF8。
如果没有特殊原因,强烈建议使用 UTF8 编码。字符编码在数据库创建后无法修改,如需更改必须重建数据库。
locale
字符串,不可变参数,用于指定数据库的本地化规则,相当于同时设置 lc_collate 和 lc_ctype,如果不指定则继承模板数据库的设置,通常为 C。
本地化规则决定了字符串的排序顺序和字符分类行为。使用 C 或 POSIX 可获得最佳性能和跨平台一致性,
使用特定语言的本地化规则(如 zh_CN.UTF-8)可以获得符合该语言习惯的排序结果。
lc_collate
字符串,不可变参数,用于指定字符串的排序规则,如果不指定则继承模板数据库的设置,通常为 C。
排序规则决定了 ORDER BY 和比较操作的结果。常用值包括:C(字节序,最快)、C.UTF-8、en_US.UTF-8、zh_CN.UTF-8。
此参数在数据库创建后无法修改。
lc_ctype
字符串,不可变参数,用于指定字符分类规则,决定字符的大小写、数字、字母等分类,如果不指定则继承模板数据库的设置,通常为 C。
字符分类规则影响 upper()、lower()、正则表达式中的 \w 等函数的行为。此参数在数据库创建后无法修改。
locale_provider
枚举值,不可变参数,用于指定本地化的实现提供者,可选值为 libc、icu 或 builtin,此参数在 PostgreSQL 15 及以上版本可用,默认值为 libc。
| 提供者 | 版本 | 说明 |
|---|---|---|
libc |
- | 使用操作系统 C 库,传统默认方式,行为因系统而异 |
icu |
PG15+ | 使用 ICU 库,跨平台一致,支持更多语言 |
builtin |
PG17+ | PostgreSQL 内置实现,最高效,仅支持 C/C.UTF-8 |
使用 icu 或 builtin 提供者时,必须指定 template: template0,并配合相应的 icu_locale 或 builtin_locale 参数。
icu_locale
字符串,不可变参数,用于指定 ICU 本地化规则标识符,此参数在 PostgreSQL 15 及以上版本、且 locale_provider 为 icu 时可用。
ICU 本地化标识符遵循 BCP 47 标准,常用值包括:
| 值 | 说明 |
|---|---|
en-US |
美式英语 |
en-GB |
英式英语 |
zh-Hans |
简体中文 |
zh-Hant |
繁体中文 |
ja-JP |
日语 |
ko-KR |
韩语 |
icu_rules
字符串,不可变参数,用于自定义 ICU 排序规则,此参数在 PostgreSQL 16 及以上版本可用。
ICU 规则允许对默认排序行为进行微调,使用 ICU 排序规则语法。
builtin_locale
字符串,不可变参数,用于指定内置本地化提供者的规则,此参数在 PostgreSQL 17 及以上版本、且 locale_provider 为 builtin 时可用,可选值为 C 或 C.UTF-8。
builtin 提供者是 PostgreSQL 17 新增的内置本地化实现,比 libc 更快,且行为跨平台完全一致。
适合只需要 C 或 C.UTF-8 排序规则的场景。
tablespace
字符串,可变参数,用于指定数据库的默认表空间,默认值为 pg_default。
修改现有数据库的表空间会触发数据物理迁移,PostgreSQL 会将数据库中的所有对象移动到新表空间,对于大数据库可能需要较长时间,慎用。
is_template
布尔值,可变参数,用于指定是否将数据库标记为模板数据库,默认值为 false。
设置为 true 后,任何拥有 CREATEDB 权限的用户都可以使用此数据库作为模板克隆新数据库。
模板数据库通常用于预装标准模式、扩展和数据,方便快速创建具有相同配置的新数据库。
删除标记为 is_template: true 的数据库时,Pigsty 会先执行 ALTER DATABASE ... IS_TEMPLATE false 取消模板标记,然后再删除。
allowconn
布尔值,可变参数,用于控制是否允许连接到此数据库,默认值为 true。
设置为 false 会在数据库层面完全禁止连接,任何用户(包括超级用户)都无法连接到此数据库。
此参数通常用于维护或归档用途。
revokeconn
布尔值,可变参数,用于控制是否回收 PUBLIC 角色的 CONNECT 权限,默认值为 false。
设置为 true 时,Pigsty 会执行以下权限变更:
- 回收 PUBLIC 的 CONNECT 权限,普通用户将无法连接
- 授予复制用户(
replicator)和监控用户(dbuser_monitor)连接权限 - 授予管理员用户(
dbuser_dba)和数据库属主连接权限,并附带WITH GRANT OPTION
设置为 false 时,会恢复 PUBLIC 的 CONNECT 权限。
connlimit
整数,可变参数,用于限制数据库的最大并发连接数,默认值为 -1,表示不限制。
设置为正整数时,会限制同时连接到此数据库的最大会话数。此限制不影响超级用户。
baseline
字符串,用于指定数据库置备时要执行的 SQL 基线文件路径。
基线文件通常包含表结构定义、初始数据、存储过程等,用于初始化新数据库。
路径是相对于 Ansible 搜索路径的相对路径,通常放在 files/ 目录下。
只要定义了 baseline,当前角色在每次为该数据库执行置备任务时都会运行该文件,即使数据库已经存在;state: recreate 时也会重新执行。因此基线 SQL 应设计为幂等脚本,或避免在现有数据库上重复执行。
schemas
数组,可变参数(支持增删),用于定义要在数据库中创建或删除的模式。数组元素可以是字符串或对象。
简单格式使用字符串直接指定模式名,仅支持创建操作:
完整格式使用对象定义,支持指定模式属主和删除操作:
创建模式时使用 IF NOT EXISTS,已存在则跳过;删除模式时使用 CASCADE,会同时删除模式内的所有对象。
extensions
数组,可变参数(支持增删),用于定义要在数据库中安装或卸载的扩展。数组元素可以是字符串或对象。
简单格式使用字符串直接指定扩展名,仅支持安装操作:
完整格式使用对象定义,支持指定安装模式、版本和卸载操作:
安装扩展时使用 IF NOT EXISTS ... CASCADE;如果扩展已存在,PostgreSQL 会给出 NOTICE 并跳过,同时可自动安装依赖扩展。卸载扩展时使用 CASCADE,会同时删除依赖此扩展的对象。
parameters
对象,可变参数,用于设置数据库级别的配置参数。参数通过 ALTER DATABASE ... SET 设置,会对连接到此数据库的所有会话生效。
使用特殊值 DEFAULT(大小写不敏感)可以将参数重置为 PostgreSQL 默认值:
pgbouncer
布尔值,可变参数,用于控制是否将数据库添加到 Pgbouncer 连接池列表,默认值为 true。
设置为 false 时,数据库不会出现在 Pgbouncer 的数据库列表中,客户端无法通过连接池访问此数据库。
适用于内部管理数据库或需要直连的特殊场景。
pool_mode
枚举值,可变参数,用于设置此数据库在 Pgbouncer 中的池化模式,可选值为 transaction、session 或 statement,默认值为 transaction。
| 模式 | 说明 | 适用场景 |
|---|---|---|
transaction |
事务结束后归还连接 | 大多数 OLTP 应用,默认推荐 |
session |
会话结束后归还连接 | 需要会话级状态的应用 |
statement |
每条语句后归还连接 | 简单无状态查询,极致复用 |
pool_size
整数,可变参数,用于设置此数据库在 Pgbouncer 中的默认连接池大小,默认值为 50。
连接池大小决定了此数据库连接池允许使用的常规后端连接上限;预热连接数由 pool_size_min 控制。请根据应用负载调整。
pool_size_min
整数,可变参数,用于设置此数据库在 Pgbouncer 中的最小连接池大小,默认值为 0。
设置大于 0 的值会让 Pgbouncer 预先创建指定数量的后端连接,用于连接预热,减少首次请求的延迟。
pool_reserve
整数,可变参数,用于设置此数据库在 Pgbouncer 中的保留连接数,默认值为 30。
当默认池不够用时,Pgbouncer 最多可以额外申请 pool_reserve 个连接来处理突发流量。
pool_connlimit
整数,可变参数,用于设置通过 Pgbouncer 连接池访问此数据库的最大连接数,默认值为 100。
此限制是 Pgbouncer 层面的限制,与数据库本身的 connlimit 参数独立。
pool_auth_user
字符串,可变参数,用于指定 Pgbouncer 认证查询使用的用户。
此参数需要配合 pgbouncer_auth_query 参数启用才生效。
设置后,所有通过 Pgbouncer 连接到此数据库的请求都会使用指定用户执行认证查询来验证密码。
register_datasource
布尔值,可变参数,用于控制是否将此数据库注册到 Grafana 作为 PostgreSQL 数据源,默认值为 true。
设置为 false 可以跳过 Grafana 数据源注册。适用于临时数据库、测试数据库,或不希望在监控系统中出现的内部数据库。
模板继承
许多参数如果不显式指定,会从模板数据库继承。默认模板是 template1,其编码设置由集群初始化参数决定:
| 集群参数 | 默认值 | 说明 |
|---|---|---|
pg_encoding |
UTF8 |
集群默认字符编码 |
pg_locale |
C / C-UTF-8 (如果支持) |
集群默认本地化 |
pg_lc_collate |
C / C-UTF-8 (如果支持) |
集群默认排序规则 |
pg_lc_ctype |
C / C-UTF-8 (如果支持) |
集群默认字符分类 |
新创建的数据库默认会从 template1 数据库 Fork 出来,这个模版数据库会在 PG_PROVISION 阶段进行定制修改:
配置好扩展、模式以及默认权限,因此新创建的数据库也会继承这些配置,除非您显式使用一个其他的数据库作为模板。
深度定制
Pigsty 提供了丰富的定制参数与配置旋钮,如果你想定制模板数据库,请参考以下资源:
pg_default_roles:postgres 集群中的默认预定义角色和系统用户pg_default_privileges:由管理员用户创建数据库内对象时的默认权限pg_default_schemas:要创建的默认模式列表pg_default_extensions:要创建的默认扩展列表pg_default_hba_rules:postgres 基于主机的认证规则,全局 PG 默认 HBApgb_default_hba_rules:pgbouncer 默认的基于主机的认证规则,全局 PGB 默认 HBA
如果上面这些配置仍然无法满足您的需求,您可以使用 pg_init 指定自定义的集群初始化脚本进行定制:
pg-init:集群初始化脚本pg-init-template.sql:模板定制 SQLpg-init-roles.sql:定制默认角色的 SQL
本地化提供者
PostgreSQL 15+ 引入了 locale_provider 参数,支持不同的本地化实现。这些属性只能在数据库创建时指定,之后无法修改。
Pigsty 在 configure 配置向导中会根据 PG 与操作系统版本,优先使用 PG 内置的 C.UTF-8/C 本地化提供者。
数据库在默认情况下继承集群的本地化设置。如果您要为数据库指定一个不同于集群默认的本地化提供者,则必须使用 template0 作为模板数据库。
使用 ICU 提供者(PG15+):
使用内置提供者(PG17+):
提供者对比:libc(传统方式,依赖操作系统)、icu(PG15+,跨平台一致,功能丰富)、builtin(PG17+,最高效的 C/C.UTF-8 排序)。
连接池
Pgbouncer 连接池可以优化短连接性能,降低并发征用,以避免过高的连接数冲垮数据库,并在数据库迁移时提供额外的灵活处理空间。
Pigsty 会默认为 PostgreSQL 实例 1:1 配置启用一个连接池,
使用和 PostgreSQL 同样的 pg_dbsu 运行,默认为 postgres 操作系统用户。
连接池与数据库使用 /var/run/postgresql Unix Socket 通信。
Pigsty 默认将 pg_databases 中的所有数据库都添加到 pgbouncer 的数据库列表中。
您可以通过在数据库定义中显式设置 pgbouncer: false 来禁用特定数据库的 pgbouncer 连接池支持。
pgbouncer 数据库列表与其配置参数在 /etc/pgbouncer/database.txt 中定义。
当您 创建数据库 时,Pgbouncer 的数据库列表定义文件将会被刷新,并通过在线重载配置的方式生效,正常不会影响现有的连接。
6 - HBA 规则
概述
HBA(Host-Based Authentication)控制“谁可以从哪里、以什么方式连接到数据库”。认证模型和默认规则说明见 身份认证。
Pigsty 通过 pg_default_hba_rules 与 pg_hba_rules 让 HBA 规则也能以声明式配置形式管理。
Pigsty 在集群初始化或 HBA 刷新时渲染以下配置文件:
| 配置文件 | 路径 | 说明 |
|---|---|---|
| PostgreSQL HBA | /pg/data/pg_hba.conf |
PostgreSQL 服务器的 HBA 规则 |
| PgBouncer HBA | /etc/pgbouncer/pgb_hba.conf |
连接池 PgBouncer 的 HBA 规则 |
HBA 规则由以下参数控制:
| 参数 | 层级 | 说明 |
|---|---|---|
pg_default_hba_rules |
G | PostgreSQL 全局默认 HBA 规则 |
pg_hba_rules |
G/C/I | PostgreSQL 集群/实例级追加规则 |
pgb_default_hba_rules |
G | PgBouncer 全局默认 HBA 规则 |
pgb_hba_rules |
G/C/I | PgBouncer 集群/实例级追加规则 |
规则支持以下特性:
- 按角色过滤:规则支持
role字段,根据实例的pg_role自动筛选生效 - 按顺序排序:规则支持
order字段,控制规则在最终配置文件中的位置 - 两种写法:支持别名形式(简化语法)和原始形式(直接 HBA 文本)
刷新 HBA
修改配置后,需要重新渲染配置文件并让服务重载:
脚本内部执行以下剧本命令:
仅刷新 PostgreSQL:./pgsql.yml -l <cls> -t pg_hba,pg_reload -e pg_reload=true
仅刷新 Pgbouncer:./pgsql.yml -l <cls> -t pgbouncer_hba,pgbouncer_reload
不要直接编辑 /pg/data/pg_hba.conf 或 /etc/pgbouncer/pgb_hba.conf,下次执行 playbook 时会被覆盖。
所有变更应在 pigsty.yml 中进行,然后执行 bin/pgsql-hba 刷新。
参数详解
pg_default_hba_rules
PostgreSQL 全局默认 HBA 规则列表,通常定义在 all.vars 中,为所有 PostgreSQL 集群提供基础访问控制。
- 类型:
rule[],层级:全局 (G)
pg_hba_rules
PostgreSQL 集群/实例级 HBA 追加规则,可在集群或实例级别覆盖,与默认规则合并后按 order 排序。
- 类型:
rule[],层级:全局/集群/实例 (G/C/I),默认值:[]
pgb_default_hba_rules
Pgbouncer 全局默认 HBA 规则列表,通常定义在 all.vars 中。
- 类型:
rule[],层级:全局 (G)
pgb_hba_rules
Pgbouncer 集群/实例级 HBA 追加规则。
- 类型:
rule[],层级:全局/集群/实例 (G/C/I),默认值:[]
注意:Pgbouncer HBA 不支持
db: replication。
规则字段
每条 HBA 规则是一个 YAML 字典,支持以下字段:
| 字段 | 类型 | 必需 | 默认值 | 说明 |
|---|---|---|---|---|
user |
string | 否 | all |
用户名,支持 all、变量占位符、+rolename 等 |
db |
string | 否 | all |
数据库名,支持 all、replication、具体库名 |
addr |
string | 是* | - | 地址别名或 CIDR,见 地址别名 |
auth |
string | 否 | pwd |
认证方式别名,见 认证方式 |
title |
string | 否 | - | 规则说明/注释,会渲染为配置文件中的注释 |
role |
string | 否 | common |
实例角色过滤,见 角色过滤 |
order |
int | 否 | 1000 |
排序权重,数字小的排前面,见 排序机制 |
rules |
list | 是* | - | 原始 HBA 文本行列表,与 addr 二选一 |
addr和rules必须指定其一。使用rules时可以直接写原始 HBA 格式。
地址别名
Pigsty 提供地址别名,简化 HBA 规则编写:
| 别名 | 展开为 | 说明 |
|---|---|---|
local |
Unix socket | 本地 Unix 套接字连接 |
localhost |
Unix socket + 127.0.0.1/32 + ::1/128 |
本地回环地址 |
admin |
${admin_ip}/32 |
管理员 IP 地址 |
infra |
所有 infra 组节点 IP | 基础设施节点列表 |
cluster |
当前集群所有成员 IP | 同一集群内的所有实例 |
intra / intranet |
10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 |
内网 CIDR 网段 |
world / all |
0.0.0.0/0 + ::/0 |
任意地址(IPv4 + IPv6) |
<CIDR> |
直接使用 | 如 192.168.1.0/24、10.1.1.100/32 |
内网 CIDR 可通过 node_firewall_intranet 参数自定义:
认证方式
Pigsty 提供认证方式别名,简化配置:
| 别名 | 实际方式 | 连接类型 | 说明 |
|---|---|---|---|
pwd |
scram-sha-256 或 md5 |
host |
根据 pg_pwd_enc 自动选择 |
ssl |
scram-sha-256 或 md5 |
hostssl |
强制 SSL + 密码 |
ssl-sha |
scram-sha-256 |
hostssl |
强制 SSL + SCRAM-SHA-256 |
ssl-md5 |
md5 |
hostssl |
强制 SSL + MD5 |
cert |
cert |
hostssl |
客户端证书认证 |
trust |
trust |
host |
无条件信任(危险) |
deny / reject |
reject |
host |
拒绝连接 |
ident |
ident |
host |
OS 用户映射(PostgreSQL) |
peer |
peer |
local |
OS 用户映射(Pgbouncer/本地) |
pg_pwd_enc默认为scram-sha-256,可设为md5以兼容老客户端。
用户变量
HBA 规则支持以下用户占位符,渲染时自动替换为实际用户名:
| 占位符 | 默认值 | 对应参数 |
|---|---|---|
${dbsu} |
postgres |
pg_dbsu |
${repl} |
replicator |
pg_replication_username |
${monitor} |
dbuser_monitor |
pg_monitor_username |
${admin} |
dbuser_dba |
pg_admin_username |
角色过滤
HBA 规则的 role 字段控制规则在哪些实例上生效:
| 角色 | 说明 |
|---|---|
common |
默认值,所有实例都生效 |
primary |
仅主库实例生效 |
replica |
仅从库实例生效 |
offline |
仅离线实例生效(pg_role: offline 或 pg_offline_query: true) |
standby |
备库实例 |
delayed |
延迟从库实例 |
角色过滤基于实例的 pg_role 变量进行匹配,不匹配的规则会被注释掉(以 # 开头)。
排序机制
PostgreSQL HBA 是 首条匹配生效,规则顺序至关重要。Pigsty 通过 order 字段控制规则渲染顺序。
Order 区间约定
| 区间 | 用途 |
|---|---|
0 - 99 |
用户高优先规则(在所有默认规则之前) |
100 - 650 |
默认规则区(间隔 50,便于插入) |
1000+ |
用户规则默认值(不填 order 时追加到最后) |
PostgreSQL 默认规则 Order 分配
| Order | 规则说明 |
|---|---|
| 100 | dbsu local ident |
| 150 | dbsu replication local |
| 200 | replicator localhost |
| 250 | replicator intra replication |
| 300 | replicator intra postgres |
| 350 | monitor localhost |
| 400 | monitor infra |
| 450 | admin infra ssl |
| 500 | admin world ssl |
| 550 | dbrole_readonly localhost |
| 600 | dbrole_readonly intra |
| 650 | dbrole_offline intra |
Pgbouncer 默认规则 Order 分配
| Order | 规则说明 |
|---|---|
| 100 | dbsu local peer |
| 150 | all localhost pwd |
| 200 | monitor pgbouncer intra |
| 250 | monitor world deny |
| 300 | admin intra pwd |
| 350 | admin world deny |
| 400 | all intra pwd |
写法示例
别名形式:使用 Pigsty 提供的简化语法
渲染结果:
原始形式:直接使用 PostgreSQL HBA 语法
渲染结果:
常见配置场景
黑名单 IP:使用 order: 0 确保最先匹配
白名单应用服务器:高优先级允许特定 IP
管理员强制证书:覆盖默认的 SSL 密码认证
离线实例专用网络:仅在 offline 实例生效
按数据库限制访问:敏感库仅允许特定网段
Pgbouncer 专用规则:注意不支持 db: replication
完整集群示例
验证与排查
查看当前 HBA 规则
测试连接认证
常见问题排查
| 错误信息 | 可能原因 | 解决方案 |
|---|---|---|
no pg_hba.conf entry for host... |
没有匹配的 HBA 规则 | 添加对应规则并刷新 |
password authentication failed |
密码错误或加密方式不兼容 | 检查密码和 pg_pwd_enc |
| 规则不生效 | 未刷新或 order 被覆盖 | 执行 bin/pgsql-hba 并检查顺序 |
注意事项
- 顺序敏感:PostgreSQL HBA 首条匹配生效,善用
order字段 - 角色匹配:确保
role字段与目标实例的pg_role一致 - 地址格式:CIDR 必须正确,如
10.0.0.0/8而非10.0.0.0/255.0.0.0 - PgBouncer 限制:不支持
db: replication - TLS 前提:
ssl、cert要求服务端 TLS;客户端仍需使用verify-full验证服务端身份 - 测试优先:修改 HBA 前建议先在测试环境验证
- 扩缩容刷新:使用
addr: cluster的规则在集群成员变化后需要刷新
相关文档
7 - 参数配置
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(用户级生效)
8 - 访问控制
访问控制由角色、对象权限、数据库 ACL 与 HBA 共同决定。本节聚焦配置参数;设计与边界见 访问控制概念。
Pigsty 预置了一套精简的 ACL 模型,通过以下参数描述:
pg_default_roles:系统角色与系统用户。pg_users:业务用户与角色。pg_default_privileges:管理员/属主新建对象时的默认权限。pg_revoke_public、pg_default_schemas、pg_default_extensions:控制template1的默认行为。
这些参数应与 HBA 和数据库定义一起管理,形成可复现的访问控制配置。
默认角色体系(pg_default_roles)
默认包含 4 个业务角色 + 4 个系统用户:
| 名称 | 类型 | 说明 |
|---|---|---|
dbrole_readonly |
NOLOGIN |
所有业务共用,拥有 SELECT/USAGE |
dbrole_readwrite |
NOLOGIN |
继承只读角色,并拥有 INSERT/UPDATE/DELETE |
dbrole_admin |
NOLOGIN |
继承 pg_monitor + 读写角色,可建对象和触发器 |
dbrole_offline |
NOLOGIN |
独立只读角色;实例范围需要通过 HBA 显式限制 |
postgres |
用户 | 系统超级用户,与 pg_dbsu 同名 |
replicator |
用户 | 用于流复制与备份,继承监控与只读权限 |
dbuser_dba |
用户 | 主要管理员账号,同时同步到 pgbouncer |
dbuser_monitor |
用户 | 监控账号,具备 pg_monitor 权限,默认记录慢 SQL |
这些定义位于 pg_default_roles。该参数是完整列表;自定义时应复制并保留所需的默认角色和系统用户,再按依赖顺序添加新角色。更改角色名称后,还必须同步更新 HBA、默认权限和脚本中的引用。
默认用户与凭据参数
系统用户的用户名/密码由以下参数控制:
| 参数 | 默认值 | 作用 |
|---|---|---|
pg_dbsu |
postgres |
数据库/系统超级用户 |
pg_dbsu_password |
空字符串 | dbsu 密码(默认不启用) |
pg_replication_username |
replicator |
复制用户名称 |
pg_replication_password |
DBUser.Replicator |
复制用户密码 |
pg_admin_username |
dbuser_dba |
管理员用户名 |
pg_admin_password |
DBUser.DBA |
管理员密码 |
pg_monitor_username |
dbuser_monitor |
监控用户 |
pg_monitor_password |
DBUser.Monitor |
监控用户密码 |
修改这些参数后,应同步更新 pg_default_roles 中对应用户的定义,避免用户名和角色属性不一致。
业务角色与授权(pg_users)
业务用户通过 pg_users 声明(详细字段见 用户配置),其中 roles 字段控制授予的业务角色。
示例:创建只读/读写用户各一名:
业务用户通过继承 dbrole_* 获得默认对象权限;数据库 CONNECT 权限和 pg_hba_rules 继续控制可连接的数据库和来源。
需要更细粒度的 ACL 时,可在 baseline SQL 或后续剧本中使用标准 GRANT / REVOKE,并将额外授权纳入审查。
默认权限模板(pg_default_privileges)
pg_default_privileges 会应用到 pg_dbsu、pg_admin_username、dbrole_admin,并应用到每个已声明的数据库属主。默认模板如下:
由上述身份创建的对象会自动应用对应权限。其他对象创建者需要单独配置
ALTER DEFAULT PRIVILEGES。
额外提示:
pg_revoke_public默认为true,意味着自动撤销PUBLIC在数据库和publicschema 上的CREATE权限。pg_default_schemas和pg_default_extensions控制在template1/postgres中预创建的 schema/扩展,通常用于监控对象(monitorschema、pg_stat_statements等)。
常见配置场景
为合作方提供只读账号
该配置为合作方增加一条从指定网段通过 TLS 访问 analytics 的 HBA 规则。pg_hba_rules 不会删除范围更宽的默认规则;若要求该账号只能访问此数据库,还应收敛默认 HBA,并配置数据库 CONNECT 权限。
为业务管理员赋予 DDL 能力
app_admin可以继承dbrole_admin的 DDL 权限。要让新对象应用dbrole_admin的默认权限,应先执行SET ROLE dbrole_admin;如果app_admin是已声明的数据库属主,也可以直接以属主身份创建对象。
自定义默认权限
该参数会替换完整的默认权限列表。引用的角色必须先创建;变更只影响之后创建的对象,已有对象需要另行授权。
与其他组件的协同
- HBA 规则:使用
pg_hba_rules绑定角色、数据库和来源。要限制dbrole_offline,应为其规则设置role: offline。 - PgBouncer:
pgbouncer: true的用户会被写入userlist.txt,pool_mode/pool_connlimit可以控制连接池层面的配额。 - 数据库监控:
dbuser_monitor的权限来自pg_default_roles。新增监控用户时,应授予pg_monitor,并检查monitorschema 的访问权限。
这些参数可以与配置清单一起版本化;实际权限仍应通过数据库系统目录定期核对。