# 参数

> 使用 121 个参数定制 PostgreSQL 集群
---

`PGSQL` 模块有 **121** 个参数。


| 章节                              | 数量 | 描述                                                       |
|---------------------------------|----|----------------------------------------------------------|
| [`PG_ID`](#pg_id)               | 11 | 计算和检查 Postgres 身份 - 用于识别 PGSQL 实体（如实例和服务）的参数             |
| [`PG_BUSINESS`](#pg_business)   | 12 | Postgres 业务对象定义 - 业务用户、数据库、服务和身份验证的配置                    |
| [`PG_INSTALL`](#pg_install)     | 10 | 安装 PGSQL 包和扩展 - 数据库用户设置、版本选择和包安装的设置                      |
| [`PG_BOOTSTRAP`](#pg_bootstrap) | 35 | 使用 Patroni 初始化 HA Postgres 集群 - 包括数据目录、网络和高可用性设置的全面集群初始化 |
| [`PG_PROVISION`](#pg_provision) | 9  | 创建用户、数据库和数据库内对象 - 引导后的数据库对象置备和默认配置                       |
| [`PG_BACKUP`](#pg_backup)       | 6  | 使用 pgbackrest 设置备份仓库 - 使用 pgbackrest 的备份和恢复配置            |
| [`PG_ACCESS`](#pg_access)       | 16 | 暴露 pg 服务，绑定 VIP 和注册 DNS - 服务暴露、负载均衡、VIP 管理和 DNS 注册       |
| [`PG_MONITOR`](#pg_exporter)    | 18 | 为 PGSQL 实例添加监控 - 使用各种导出器进行指标收集的监控设置                      |
| [`PG_REMOVE`](#pg_remove)：删除 Postgres 集群

| 名称                                    | 类型     | 级别    | 注释                                  |
|---------------------------------------|--------|-------|-------------------------------------|
| [`pg_safeguard`](#pg_safeguard)      | `bool` | G/C/A | 启用时中止删除，默认为 false                  |
| [`pg_rm_data`](#pg_rm_data)           | `bool` | G/C/A | 删除 PostgreSQL 数据，默认为 true            |
| [`pg_rm_backup`](#pg_rm_backup)       | `bool` | G/C/A | 删除主实例的 pgBackRest 备份，默认为 true       |
| [`pg_rm_pkg`](#pg_rm_pkg)             | `bool` | G/C/A | 卸载 PostgreSQL 软件包，默认为 true           |


------

## `PG_ID`

以下是一些常用的参数，用于标识 PGSQL [实体](/zh/docs/pgsql/config#identity-parameters)：实例、服务等…

------

### `pg_mode`

参数名称： `pg_mode`， 类型： `enum`， 层次：`C`

pgsql 集群模式，默认为 `pgsql`，即标准 PostgreSQL 集群。

- `pgsql`: 标准 PostgreSQL 集群，默认值。
- `citus`: 使用 citus 扩展的水平分片集群。
- `mssql`: Babelfish MSSQL 线缆协议兼容内核。
- `ivory`: IvorySQL Oracle 兼容内核。
- `polar`: PolarDB for PostgreSQL 内核。
- `oracle`: PolarDB for Oracle 内核。
- `gpsql`: Greenplum / Cloudberry

如果 `pg_mode` 设置为 `citus` 或 `gpsql`，则需要 [`pg_shard`](#pg_shard) 和 [`pg_group`](#pg_group) 用于水平分片集群。

------

### `pg_cluster`

参数名称： `pg_cluster`， 类型： `string`， 层次：`C`

PostgreSQL 集群名称，必选的身份标识参数,没有默认值

集群名将用作资源的命名空间。

集群命名需要遵循特定的命名模式：`[a-z][a-z0-9-]*`，即，只使用数字与小写字母，且不以数字开头，以符合标识上的不同约束的要求。

------

### `pg_seq`

参数名称： `pg_seq`， 类型： `int`， 层次：`I`

PostgreSQL 实例序列号，必选的身份标识参数，无默认值。

此实例的序号，在其**集群**内是唯一分配的，通常使用自然数，从0或1开始分配，通常不会回收重用。

------

### `pg_role`

参数名称： `pg_role`， 类型： `enum`， 层次：`I`

pgsql 角色，必需，可以是 primary,replica,offline

PostgreSQL 实例的角色，可以是：`primary`、`replica`、`standby` 或 `offline`。

- `primary`: 主库，集群中有且仅有一个。
- `replica`: 用于承载在线只读流量的副本，可能会有轻微复制延迟（10ms~100ms, 100KB）。
- `standby`: 始终与主库同步的特殊副本，没有复制延迟和数据丢失。（目前与 `replica` 相同）
- `offline`: 用于承接离线只读流量的离线副本，如统计分析/ETL/个人查询等。

**身份参数，必需参数，实例级参数。**

------

### `pg_instances`

参数名称： `pg_instances`， 类型： `dict`， 层次：`I`

使用 `{port:ins_vars}` 的形式在一台主机上定义多个 PostgreSQL 实例。

此参数是为在单个节点上的多实例部署保留的参数，Pigsty 尚未实现此功能，并强烈建议独占节点部署。

------

### `pg_upstream`

参数名称： `pg_upstream`， 类型： `ip`， 层次：`I`

[备份集群](/zh/docs/pgsql/config/#standby-cluster)或级联从库的上游实例 IP 地址。

在集群的 `primary` 实例上设置 `pg_upstream` ，表示此集群是一个[备份集群](/zh/docs/pgsql/config/#standby-cluster)，该实例将作为 `standby leader`，从上游集群接收并应用更改。

对非 `primary` 实例设置 `pg_upstream` 参数将指定一个具体实例作为物理复制的上游，如果与主实例 ip 地址不同，此实例将成为 **级联副本** 。确保上游 IP 地址是同一集群中的另一个实例是用户的责任。

------

### `pg_shard`

参数名称： `pg_shard`， 类型： `string`， 层次：`C`

PostgreSQL 水平分片名称，对于分片集群来说（例如 citus 集群），这是的必选标识参数。

当多个标准的 PostgreSQL 集群一起以水平分片方式为同一业务提供服务时，Pigsty 将此组集群标记为 **水平分片集群**。

[`pg_shard`](#pg_shard) 是分片组名称。它通常是 [`pg_cluster`](#pg_cluster) 的前缀。

例如，如果我们有一个分片组 `pg-citus`，并且其中有4个集群，它们的标识参数将是：

```bash
cls pg_shard: pg-citus
cls pg_group = 0:   pg-citus0
cls pg_group = 1:   pg-citus1
cls pg_group = 2:   pg-citus2
cls pg_group = 3:   pg-citus3
```

------

### `pg_group`

参数名称： `pg_group`， 类型： `int`， 层次：`C`

PostgreSQL 水平分片集群的分片索引号，对于分片集群来说（例如 citus 集群），这是的必选标识参数。

此参数与 [pg_shard](#pg_shard) 配对使用，通常可以使用非负整数作为索引号。

------

### `gp_role`

参数名称： `gp_role`， 类型： `enum`， 层次：`C`

PostgreSQL 集群的 Greenplum/Matrixdb 角色，可以是 `master` 或 `segment`。

- `master`: 标记 postgres 集群为 greenplum 主实例（协调节点），这是默认值。
- `segment` 标记 postgres 集群为 greenplum 段集群（数据节点）。

此参数仅用于 Greenplum/MatrixDB 数据库 （[`pg_mode`](#pg_mode) 为 `gpsql`），对于普通的 PostgreSQL 集群没有意义。

------

### `pg_exporters`

参数名称： `pg_exporters`， 类型： `dict`， 层次：`C`

额外用于[监控](/zh/docs/pgsql/monitor/)远程 PostgreSQL 实例的 Exporter 定义，默认值：`{}`

如果您希望监控远程 PostgreSQL 实例，请在监控系统所在节点（Infra节点）集群上的 `pg_exporters` 参数中定义它们，并使用 [`pgsql-monitor.yml`](/zh/docs/pgsql/playbook/#pgsql-monitoryml) 剧本来完成部署。

```yaml
pg_exporters: # list all remote instances here, alloc a unique unused local port as k
    20001: { pg_cluster: pg-foo, pg_seq: 1, pg_host: 10.10.10.10 }
    20004: { pg_cluster: pg-foo, pg_seq: 2, pg_host: 10.10.10.11 }
    20002: { pg_cluster: pg-bar, pg_seq: 1, pg_host: 10.10.10.12 }
    20003: { pg_cluster: pg-bar, pg_seq: 1, pg_host: 10.10.10.13 }
```

------

### `pg_offline_query`

参数名称： `pg_offline_query`， 类型： `bool`， 层次：`I`

设置为 `true` 以在此实例上启用离线查询，默认为 `false`。

当某个 PostgreSQL 实例启用此参数时， 属于 `dbrole_offline` 分组的用户可以直接连接到该 PostgreSQL 实例上执行离线查询（慢查询，交互式查询，ETL/分析类查询）。

带有此标记的实例在效果上类似于为实例设置 `pg_role` = `offline` ，唯一的区别在于 `offline` 实例默认不会承载 `replica` 服务的请求，是作为专用的离线/分析从库实例而存在的。

如果您没有富余的实例可以专门用于此目的，则可以挑选一台普通的从库，在实例层次启用此参数，以便在需要时承载离线查询。

------

## `PG_BUSINESS`

定制集群模板：用户，数据库，服务，权限规则。

用户需**重点关注**此部分参数，因为这里是业务声明自己所需数据库对象的地方。

- 业务用户定义： [`pg_users`](#pg_users)
- 业务数据库定义： [`pg_databases`](#pg_databases)
- 集群专有服务定义： [`pg_services`](#pg_services) （全局定义：[`pg_default_services`](#pg_default_services)）
- PostgreSQL集群/实例特定的HBA规则： [`pg_default_services`](#pg_default_services)
- Pgbouncer连接池特定HBA规则： [`pgb_hba_rules`](#pgb_hba_rules)

[默认](/zh/docs/pgsql/acl/#默认用户)的数据库用户及其凭据，强烈建议在生产环境中修改这些用户的密码。

- PG管理员用户：[`pg_admin_username`](#pg_admin_username) / [`pg_admin_password`](#pg_admin_password)
- PG复制用户： [`pg_replication_username`](#pg_replication_username) / [`pg_replication_password`](#pg_replication_password)
- PG监控用户：[`pg_monitor_username`](#pg_monitor_username) / [`pg_monitor_password`](#pg_monitor_password)

```yaml
# postgres business object definition, overwrite in group vars
pg_users: []                      # postgres business users
pg_databases: []                  # postgres business databases
pg_services: []                   # postgres business services
pg_hba_rules: []                  # business hba rules for postgres
pgb_hba_rules: []                 # business hba rules for pgbouncer
# global credentials, overwrite in global vars
pg_dbsu_password: ''              # dbsu password, empty string means no dbsu password by default
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_users`

参数名称： `pg_users`， 类型： `user[]`， 层次：`C`

PostgreSQL 业务用户列表，需要在 PG 集群层面进行定义。默认值为：`[]` 空列表。

每一个数组元素都是一个 [用户/角色](/zh/docs/pgsql/user) 定义，例如：

```yaml
- name: dbuser_meta               # 必需，`name` 是用户定义的唯一必选字段
  password: DBUser.Meta           # 可选，密码，可以是 scram-sha-256 哈希字符串或明文
  login: true                     # 可选，默认情况下可以登录
  superuser: false                # 可选，默认为 false，是超级用户吗？
  createdb: false                 # 可选，默认为 false，可以创建数据库吗？
  createrole: false               # 可选，默认为 false，可以创建角色吗？
  inherit: true                   # 可选，默认情况下，此角色可以使用继承的权限吗？
  replication: false              # 可选，默认为 false，此角色可以进行复制吗？
  bypassrls: false                # 可选，默认为 false，此角色可以绕过行级安全吗？
  pgbouncer: true                 # 可选，默认为 false，将此用户添加到 pgbouncer 用户列表吗？（使用连接池的生产用户应该显式定义为 true）
  connlimit: -1                   # 可选，用户连接限制，默认 -1 禁用限制
  expire_in: 3650                 # 可选，此角色过期时间：从创建时 + n天计算（优先级比 expire_at 更高）
  expire_at: '2030-12-31'         # 可选，此角色过期的时间点，使用 YYYY-MM-DD 格式的字符串指定一个特定日期（优先级没 expire_in 高）
  comment: pigsty admin user      # 可选，此用户/角色的说明与备注字符串
  roles: [dbrole_admin]           # 可选，默认角色为：dbrole_{admin,readonly,readwrite,offline}
  parameters: {}                  # 可选，使用 `ALTER ROLE SET` 针对这个角色，配置角色级的数据库参数
  pool_mode: transaction          # 可选，默认为 transaction 的 pgbouncer 池模式，用户级别
  pool_connlimit: -1              # 可选，用户级别的最大数据库连接数，默认 -1 禁用限制
  search_path: public             # 可选，根据 postgresql 文档的键值配置参数（例如：使用 pigsty 作为默认 search_path）
```

------

### `pg_databases`

参数名称： `pg_databases`， 类型： `database[]`， 层次：`C`

PostgreSQL 业务数据库列表，需要在 PG 集群层面进行定义。默认值为：`[]` 空列表。

每一个数组元素都是一个 [业务数据库](/zh/docs/pgsql/db/) 定义，例如：

```yaml
- name: meta                      # 必选，`name` 是数据库定义的唯一必选字段
  baseline: cmdb.sql              # 可选，数据库 sql 的基线定义文件路径（ansible 搜索路径中的相对路径，如 files/）
  pgbouncer: true                 # 可选，是否将此数据库添加到 pgbouncer 数据库列表？默认为 true
  schemas: [pigsty]               # 可选，要创建的附加模式，由模式名称字符串组成的数组
  extensions:                     # 可选，要安装的附加扩展： 扩展对象的数组
    - { name: postgis , schema: public }  # 可以指定将扩展安装到某个模式中，也可以不指定（不指定则安装到 search_path 首位模式中）
    - { name: timescaledb }               # 例如有的扩展会创建并使用固定的模式，就不需要指定模式。
    - vector                              # 你也可以直接使用字符串指定扩展名称
  comment: pigsty meta database   # 可选，数据库的说明与备注信息
  owner: postgres                 # 可选，数据库所有者，默认为 postgres
  template: template1             # 可选，要使用的模板，默认为 template1，目标必须是一个模板数据库
  encoding: UTF8                  # 可选，数据库编码，默认为 UTF8（必须与模板数据库相同）
  locale: C                       # 可选，数据库地区设置，默认为 C（必须与模板数据库相同）
  lc_collate: C                   # 可选，数据库 collate 排序规则，默认为 C（必须与模板数据库相同），没有理由不建议更改。
  lc_ctype: C                     # 可选，数据库 ctype 字符集，默认为 C（必须与模板数据库相同）
  tablespace: pg_default          # 可选，默认表空间，默认为 'pg_default'
  allowconn: true                 # 可选，是否允许连接，默认为 true。显式设置 false 将完全禁止连接到此数据库
  revokeconn: false               # 可选，撤销公共连接权限。默认为 false，设置为 true 时，属主和管理员之外用户的 CONNECT 权限会被回收
  register_datasource: true       # 可选，是否将此数据库注册到 grafana 数据源？默认为 true，显式设置为 false 会跳过注册
  connlimit: -1                   # 可选，数据库连接限制，默认为 -1 ，不限制，设置为正整数则会限制连接数。
  pool_auth_user: dbuser_meta     # 可选，连接到此 pgbouncer 数据库的所有连接都将使用此用户进行验证（启用 pgbouncer_auth_query 才有用）
  pool_mode: transaction          # 可选，数据库级别的 pgbouncer 池化模式，默认为 transaction
  pool_size: 64                   # 可选，数据库级别的 pgbouncer 默认池子大小，默认为 64
  pool_size_reserve: 32           # 可选，数据库级别的 pgbouncer 池子保留空间，默认为 32，当默认池子不够用时，最多再申请这么多条突发连接。
  pool_size_min: 0                # 可选，数据库级别的 pgbouncer 池的最小大小，默认为 0
  pool_max_db_conn: 100           # 可选，数据库级别的最大数据库连接数，默认为 100
```

在每个数据库定义对象中，只有 `name` 是必选字段，其他的字段都是可选项。

------

### `pg_services`

参数名称： `pg_services`， 类型： `service[]`， 层次：`C`

PostgreSQL 服务列表，需要在 PG 集群层面进行定义。默认值为：`[]` ，空列表。

用于在数据库集群层面定义额外的服务，数组中的每一个对象定义了一个[服务](/zh/docs/pgsql/service/#定义服务)，一个完整的服务定义样例如下：

```yaml
- name: standby                   # 必选，服务名称，最终的 svc 名称会使用 `pg_cluster` 作为前缀，例如：pg-meta-standby
  port: 5435                      # 必选，暴露的服务端口（作为 kubernetes 服务节点端口模式）
  ip: "*"                         # 可选，服务绑定的 IP 地址，默认情况下为所有 IP 地址
  selector: "[]"                  # 必选，服务成员选择器，使用 JMESPath 来筛选配置清单
  backup: "[? pg_role == `primary`]"  # 可选，服务成员选择器（备份），也就是当默认选择器选中的实例都宕机后，服务才会由这里选中的实例成员来承载
  dest: default                   # 可选，目标端口，default|postgres|pgbouncer|<port_number>，默认为 'default'，Default的意思就是使用 pg_default_service_dest 的取值来最终决定
  check: /sync                    # 可选，健康检查 URL 路径，默认为 /，这里使用 Patroni API：/sync ，只有同步备库和主库才会返回 200 健康状态码
  maxconn: 5000                   # 可选，允许的前端连接最大数，默认为5000
  balance: roundrobin             # 可选，haproxy 负载均衡算法（默认为 roundrobin，其他选项：leastconn）
  options: 'inter 3s fastinter 1s downinter 5s rise 3 fall 3 on-marked-down shutdown-sessions slowstart 30s maxconn 3000 maxqueue 128 weight 100'
```

请注意，本参数用于在集群层面添加额外的服务。如果您想在全局定义所有 PostgreSQL 数据库都要提供的服务，可以使用 [`pg_default_services`](#pg_default_services) 参数。

------

### `pg_hba_rules`

参数名称： `pg_hba_rules`， 类型： `hba[]`， 层次：`C`

数据库集群/实例的客户端IP黑白名单规则。默认为：`[]` 空列表。

对象数组，每一个对象都代表一条规则， [hba](/zh/docs/pgsql/hba/#定义hba) 规则对象的定义形式如下：

```yaml
- title: allow intranet password access
  role: common
  rules:
    - host   all  all  10.0.0.0/8      md5
    - host   all  all  172.16.0.0/12   md5
    - host   all  all  192.168.0.0/16  md5
```

- `title`： 规则的标题名称，会被渲染为 HBA 文件中的注释。
- `rules`：规则数组，每个元素是一条标准的 HBA 规则字符串。
- `role` ：规则的应用范围，哪些实例角色会启用这条规则？
- `common`：对于所有实例生效
- `primary`, `replica`,`offline`： 只针对特定的角色 [`pg_role`](#pg_role) 实例生效。
- 特例：`role: 'offline'` 的规则除了会应用在 `pg_role : offline` 的实例上，对于带有 [`pg_offline_query`](#pg_offline_query) 标记的实例也生效。

除了上面这种原生 HBA 规则定义形式，Pigsty 还提供了另外一种更为简便的别名形式：

```yaml
- addr: 'intra'    # world|intra|infra|admin|local|localhost|cluster|<cidr>
  auth: 'pwd'      # trust|pwd|ssl|cert|deny|<official auth method>
  user: 'all'      # all|${dbsu}|${repl}|${admin}|${monitor}|<user>|<group>
  db: 'all'        # all|replication|....
  rules: []        # raw hba string precedence over above all
  title: allow intranet password access
```

[`pg_default_hba_rules`](#pg_default_hba_rules) 与本参数基本类似，但它是用于定义全局的 HBA 规则，而本参数通常用于定制某个集群/实例的 HBA 规则。

------

### `pgb_hba_rules`

参数名称： `pgb_hba_rules`， 类型： `hba[]`， 层次：`C`

Pgbouncer 业务HBA规则，默认值为： `[]`， 空数组。

此参数与 [`pg_hba_rules`](#pg_hba_rules) 基本类似，都是 [hba](/zh/docs/pgsql/hba/#定义hba) 规则对象的数组，区别在于本参数是为 Pgbouncer 准备的。

[`pgb_default_hba_rules`](#pgb_default_hba_rules) 与本参数基本类似，但它是用于定义全局连接池 HBA 规则，而本参数通常用于定制某个连接池集群/实例的 HBA 规则。

------

### `pg_replication_username`

参数名称： `pg_replication_username`， 类型： `username`， 层次：`G`

PostgreSQL 物理复制用户名，默认使用 `replicator`，不建议修改此参数。

------

### `pg_replication_password`

参数名称： `pg_replication_password`， 类型： `password`， 层次：`G`

PostgreSQL 物理复制用户密码，默认值为：`DBUser.Replicator`。

> 警告：请在生产环境中修改此密码！

------

### `pg_admin_username`

参数名称： `pg_admin_username`， 类型： `username`， 层次：`G`

PostgreSQL / Pgbouncer 管理员名称，默认为：`dbuser_dba`。

这是全局使用的数据库管理员，具有数据库的 Superuser 权限与连接池的流量管理权限，请务必控制使用范围。

------

### `pg_admin_password`

参数名称： `pg_admin_password`， 类型： `password`， 层次：`G`

PostgreSQL / Pgbouncer 管理员密码，默认为： `DBUser.DBA`。

> 警告：请在生产环境中修改此密码！

------

### `pg_monitor_username`

参数名称： `pg_monitor_username`， 类型： `username`， 层次：`G`

PostgreSQL/Pgbouncer 监控用户名，默认为：`dbuser_monitor`。

这是一个用于监控的数据库/连接池用户，不建议修改此用户名。

但如果您的现有数据库使用了不同的监控用户，可以在指定监控目标时使用此参数传入使用的监控用户名。

------

### `pg_monitor_password`

参数名称： `pg_monitor_password`， 类型： `password`， 层次：`G`

PostgreSQL/Pgbouncer 监控用户使用的密码，默认为：`DBUser.Monitor`。

请尽可能不要在密码中使用 `@:/` 这些容易与 URL 分隔符混淆的字符，减少不必要的麻烦。

> 警告：请在生产环境中修改此密码！

------

### `pg_dbsu_password`

参数名称： `pg_dbsu_password`， 类型： `password`， 层次：`G/C`

PostgreSQL [`pg_dbsu`](#pg_dbsu) 超级用户密码，默认是空字符串，即不为其设置密码。

我们不建议为 dbsu 配置密码登陆，这会增大攻击面。例外情况是：[`pg_mode`](#pg_mode) = `citus`，这时候需要为每个分片集群的 dbsu 配置密码，以便在分片集群内部进行连接。

------

## `PG_INSTALL`

本节负责安装 PostgreSQL 及其扩展。如果您希望安装不同大版本与扩展插件，修改 [`pg_version`](#pg_version) 与 [`pg_extensions`](#pg_extensions) 即可，不过请注意，并不是所有扩展都在所有大版本可用。

```yaml
pg_dbsu: postgres                 # os 数据库超级用户名称，默认为 postgres，最好不要更改
pg_dbsu_uid: 26                   # os 数据库超级用户 uid 和 gid，默认为 26，适用于默认的 postgres 用户和组
pg_dbsu_sudo: limit               # 数据库超级用户 sudo 权限，可选 none,limit,all,nopass。默认为 limit
pg_dbsu_home: /var/lib/pgsql      # postgresql 主目录，默认为 `/var/lib/pgsql`
pg_dbsu_ssh_exchange: true        # 是否在相同的 pgsql 集群中交换 postgres 数据库超级用户的 ssh 密钥
pg_version: 18                    # 要安装的 postgres 主版本，默认为 18
pg_bin_dir: /usr/pgsql/bin        # postgres 二进制目录，默认为 `/usr/pgsql/bin`
pg_log_dir: /pg/log/postgres      # postgres 日志目录，默认为 `/pg/log/postgres`
pg_packages:                      # 待安装的软件包列表，可以使用别名
  - pgsql-main pgsql-common
pg_extensions: []                 # 待安装的扩展列表，可以使用别名
```

------

### `pg_dbsu`

参数名称： `pg_dbsu`， 类型： `username`， 层次：`C`

PostgreSQL 使用的操作系统 dbsu 用户名， 默认为 `postgres`，改这个用户名是不太明智的。

不过在特定情况下，您可能会使用到不同于 `postgres` 的用户名，例如在安装配置 Greenplum / MatrixDB 时，需要使用 `gpadmin` / `mxadmin` 作为相应的操作系统超级用户。

------

### `pg_dbsu_uid`

参数名称： `pg_dbsu_uid`， 类型： `int`， 层次：`C`

操作系统数据库超级用户的 uid 和 gid，`26` 是 PGDG RPM 默认的 postgres 用户 UID/GID。

对于 Debian/Ubuntu 系统，没有默认值，且 `26` 号用户经常被占用。因此Pigsty 在检测到安装环境为 Debian 系，且 uid 为 `26` 时，会自动使用替换的 `pg_dbsu_uid = 543`。

------

### `pg_dbsu_sudo`

参数名称： `pg_dbsu_sudo`， 类型： `enum`， 层次：`C`

数据库超级用户的 sudo 权限，可以是 `none`、`limit`、`all` 或 `nopass`。默认为 `limit`

- `none`: 无 Sudo 权限
- `limit`: 有限的 sudo 权限，用于执行与数据库相关的组件的 `systemctl` 命令（默认选项）。
- `all`: 完全的 `sudo` 权限，需要密码。
- `nopass`: 不需要密码的完全 `sudo` 权限（不推荐）。
- 默认值为 `limit`，只允许执行 `sudo systemctl <start|stop|reload> <postgres|patroni|pgbouncer|...> `。

可以使用 sudo 管理的服务列表：

- patroni
- pgbouncer
- postgres
- pg_exporter
- pgbackrest
- pgbouncer_exporter
- pgbackrest_exporter
- vip-manager
- haproxy (仅限reload)

------

### `pg_dbsu_home`

参数名称： `pg_dbsu_home`， 类型： `path`， 层次：`C`

postgresql 主目录，默认为 `/var/lib/pgsql`，与官方的 pgdg RPM 保持一致。

------

### `pg_dbsu_ssh_exchange`

参数名称： `pg_dbsu_ssh_exchange`， 类型： `bool`， 层次：`C`

是否在交换操作系统 dbsu 用户的 ssh 密钥？

默认值为 `true`，意味着数据库超级用户可以互相 ssh 访问。

对于严格限制 ssh 访问的场景，您可以将其设置为 `false`。

请注意，SSH 密钥交换发生在同时执行剧本的实例之间，如果您针对一个 PostgreSQL 集群运行 `pgsql` 角色，密钥交换将发生在这个集群中的所有实例之间。
如果您针对所有 PostgreSQL 集群运行 `pgsql` 角色，密钥交换将发生在 **所有** 实例之间，对于大规模集群，O(n2) 复杂度交换可能导致严重的组合爆炸。
如果任何参与交换的实例没有 [`pg_dbsu`](#pg_dbsu) 用户，与该实例相关的密钥交换将失败，但不影响其他实例的密钥交换。

------

### `pg_version`

参数名称： `pg_version`， 类型： `enum`， 层次：`C`

要安装的 postgres 主版本，默认为 `18`。

请注意，PostgreSQL 的物理流复制不能跨主要版本，因此最好不要在实例级别上配置此项。

您可以使用 [`pg_packages`](#pg_packages) 和 [`pg_extensions`](#pg_extensions) 中的参数来为特定的 PG 大版本安装不同的软件包与扩展。

------

### `pg_bin_dir`

参数名称： `pg_bin_dir`， 类型： `path`， 层次：`C`

PostgreSQL 二进制程序目录，默认为 `/usr/pgsql/bin`。

默认值是在安装过程中手动创建的软链接，指向安装的特定的 Postgres 版本目录。

例如 `/usr/pgsql -> /usr/pgsql-17`。在 Ubuntu/Debian 上则指向 `/usr/lib/postgresql/15/bin`。

更多详细信息，请查看 [PGSQL 文件结构](https://v27.pgsty.com/zh/docs/reference/fhs/#postgres-fhs)。

------

### `pg_log_dir`

参数名称： `pg_log_dir`， 类型： `path`， 层次：`C`

PostgreSQL 日志目录，默认为：`/pg/log/postgres`，[Promtail](/zh/docs/node/param/#promtail) 会使用此变量收集 PostgreSQL 日志。

请注意，如果日志目录 [`pg_log_dir`](#pg_log_dir) 以数据库目录 [`pg_data`](#pg_data) 作为前缀，则不会显式创建（数据库目录初始化时自动创建）。

------

### `pg_packages`

参数名称： `pg_packages`， 类型： `string[]`， 层次：`C`

要安装的 PostgreSQL 软件包（rpm/deb），这是一个由软件包名组成的数组，每个元素都是逗号或空格分割的 PG 软件包名或别名（Alias）。

默认值为：`[ pgsql-main pgsql-common ]`

这里的默认值是两个别名，分通过 [**别名翻译**](https://pigsty.cc/ext/usage/download/#别名翻译) 为当前 PG 大版本对应的主要 RPM/DEB 包名，以及 PG 版本无关的通用组件（例如 Patroni，PgBackrest 等）

从 Pigsty v3 开始，您可以在本参数中使用[`roles/node_id/vars`](https://github.com/pgsty/pigsty/tree/v3.7.0/roles/node_id/vars/) 中系统对应配置指定的别名列表。

使用包别名的好处是，您无需操心 PostgreSQL 相关软件包在不同系统平台上的包名，架构，以及大版本号，从而屏蔽了不同 OS 之间的区别：

定义在这里的软件包会首先经过 `package_map` 的翻译，然后经过 PG 大版本号的替换，最后安装实际的 RPM/DEB 包。

您也可以直接指定最终安装的 RPM/DEB 包名称，包名中的 `${pg_version}` 或 `$v` 版本号占位符将被替换为具体的大版本号 [`pg_version`](#pg_version) 。

------

### `pg_extensions`

参数名称： `pg_extensions`， 类型： `string[]`， 层次：`G/C`

要安装的 PostgreSQL 扩展包（rpm/deb），这是一个由扩展包名组成的数组，每个元素都是逗号或空格分割的 PG 扩展包名。

本参数在形式上与 [`pg_packages`](#pg_packages) 一致，但是通常用于指定需要安装的扩展插件，而且在这里指定的软件包会升级到可用的最新版本。

```yaml
pg_extensions: []
```

完整可用的扩展列表，已经在 Pigsty 默认生成的配置文件中给出，用户按需使用即可。

完整列表请参考：[`roles/node_id/vars`](https://github.com/pgsty/pigsty/tree/v3.7.0/roles/node_id/vars/) 与 Pigsty [扩展目录](https://pgext.cloud/list/)

------

## `PG_BOOTSTRAP`

使用 Patroni 引导拉起 PostgreSQL 集群，并设置 1:1 对应的 Pgbouncer 连接池。

它还会使用 [`PG_PROVISION`](#pg_provision) 中定义的默认角色、用户、权限、模式、扩展来初始化数据库集群

```yaml
pg_data: /pg/data                 # postgres 数据目录，默认值为 `/pg/data`
pg_fs_main: /data/postgres        # postgres 主数据盘挂载点/路径，默认值为 `/data/postgres`
pg_fs_bkup: /data/backups         # postgres 备份数据盘挂载点/路径，默认值为 `/data/backups`
pg_storage_type: SSD              # postgres 主数据盘存储介质类型，默认值为 `SSD`
pg_dummy_filesize: 64MiB          # 紧急情况下占位符文件 `/pg/dummy` 的大小，默认值为 `64MiB`
pg_listen: '0.0.0.0'              # postgres/pgbouncer 监听地址，默认值为 `0.0.0.0`
pg_port: 5432                     # postgres 监听端口，默认值为 `5432`
pg_localhost: /var/run/postgresql # postgres 本地连接的 Unix 套接字目录，默认值为 `/var/run/postgresql`
patroni_enabled: true             # 如果禁用，在初始化期间将不会创建 postgres 集群
patroni_mode: default             # patroni 工作模式：default,pause,remove
pg_namespace: /pg                 # etcd 中的顶级键命名空间，由 patroni 和 vip 使用
patroni_port: 8008                # patroni 监听端口，默认为 8008
patroni_log_dir: /pg/log/patroni  # patroni 日志目录，默认为 `/pg/log/patroni`
patroni_ssl_enabled: false        # 是否使用 SSL 保护 patroni RestAPI 通信？
patroni_watchdog_mode: off        # patroni 看门狗模式：automatic,required,off。默认为 off
patroni_username: postgres        # patroni restapi 用户名，默认为 `postgres`
patroni_password: Patroni.API     # patroni restapi 密码，默认为 `Patroni.API`
pg_primary_db: postgres           # 主数据库名称，用于 citus 等，默认为 postgres
pg_parameters: {}                 # postgresql.auto.conf 中的额外参数
pg_files: []                      # 要复制到 postgres 数据目录的额外文件（例如许可证）
pg_conf: oltp.yml                 # 配置模板：oltp,olap,crit,tiny。默认为 `oltp.yml`
pg_max_conn: auto                 # postgres 最大连接数，`auto` 将使用推荐值
pg_shared_buffer_ratio: 0.25      # postgres 共享缓冲区比例，默认为 0.25，范围 0.1~0.4
pg_rto: 30                        # 恢复时间目标（秒），默认为 `30s`
pg_rpo: 1048576                   # 恢复点目标（字节），默认最多 `1MiB`
pg_libs: 'pg_stat_statements, auto_explain'  # 预加载库，默认为 `pg_stat_statements,auto_explain`
pg_delay: 0                       # 备用集群领导者的复制应用延迟
pg_checksum: true                 # 为 postgres 集群启用数据校验和？
pg_pwd_enc: scram-sha-256         # 密码加密算法：md5,scram-sha-256
pg_encoding: UTF8                 # 数据库集群编码，默认为 `UTF8`
pg_locale: C                      # 数据库集群区域设置，默认为 `C`
pg_lc_collate: C                  # 数据库集群排序规则，默认为 `C`
pg_lc_ctype: C                    # 数据库字符类型，默认为 `C`
#pgsodium_key: ""                 # pgsodium key, 64 hex digits, default to sha256(pg_cluster)
#pgsodium_getkey_script: ""       # pgsodium getkey script path, pgsodium_getkey by default
```


------

### `pg_data`

参数名称： `pg_data`， 类型： `path`， 层次：`C`

Postgres 数据目录，默认为 `/pg/data`。

这是一个指向底层实际数据目录的符号链接，在多处被使用，请不要修改它。参阅 [PGSQL文件结构](https://v27.pgsty.com/zh/docs/reference/fhs/) 获取详细信息。

------

### `pg_fs_main`

参数名称： `pg_fs_main`， 类型： `path`， 层次：`C`

PostgreSQL 主数据盘的挂载点/文件系统路径，默认为`/data/postgres`。

默认值：`/data/postgres`，它将被用作 PostgreSQL 主数据目录。

建议使用 NVME SSD 作为 PostgreSQL 主数据存储，Pigsty默认为SSD存储进行了优化，但是也支持HDD。

您可以更改[`pg_storage_type`](#pg_storage_type)为`HDD`以针对HDD存储进行优化。


------

### `pg_fs_bkup`

参数名称： `pg_fs_bkup`， 类型： `path`， 层次：`C`

PostgreSQL 备份数据盘的挂载点/文件系统路径，默认为`/data/backup`。

如果您使用的是默认的 [`pgbackrest_method`](#pgbackrest_method) = `local`，建议为备份存储使用一个单独的磁盘。

备份磁盘应足够大，以容纳所有的备份，至少足以容纳3个基础备份+2天的WAL归档。 通常容量不是什么大问题，因为您可以使用便宜且大的机械硬盘作为备份盘。

建议为备份存储使用一个单独的磁盘，否则 Pigsty 将回退到主数据磁盘，并占用主数据盘的容量与IO。

------

### `pg_storage_type`

参数名称： `pg_storage_type`， 类型： `enum`， 层次：`C`

PostgreSQL 数据存储介质的类型：`SSD`或`HDD`，默认为`SSD`。

默认值：`SSD`，它会影响一些调优参数，如 `random_page_cost` 和 `effective_io_concurrency` 。

------

### `pg_dummy_filesize`

参数名称： `pg_dummy_filesize`， 类型： `size`， 层次：`C`

`/pg/dummy`的大小，默认值为`64MiB`，用于紧急使用的64MB磁盘空间。

当磁盘已满时，删除占位符文件可以为紧急使用释放一些空间，建议生产使用至少`8GiB`。

------

### `pg_listen`

参数名称： `pg_listen`， 类型： `ip`， 层次：`C`

PostgreSQL / Pgbouncer 的监听地址，默认为`0.0.0.0`（所有ipv4地址）。

您可以在此变量中使用占位符，例如：`'${ip},${lo}'`或`'${ip},${vip},${lo}'`：

- `${ip}`：转换为 `inventory_hostname`，它是配置清单中定义的首要内网IP地址。
- `${vip}`：如果启用了[`pg_vip_enabled`](#pg_vip_enabled)，将使用[`pg_vip_address`](#pg_vip_address)的主机部分。
- `${lo}`：将替换为`127.0.0.1`

对于高安全性要求的生产环境，建议限制监听的IP地址。

------

### `pg_port`

参数名称： `pg_port`， 类型： `port`， 层次：`C`

PostgreSQL 服务器监听的端口，默认为 `5432`。

------

### `pg_localhost`

参数名称： `pg_localhost`， 类型： `path`， 层次：`C`

本地主机连接 PostgreSQL 使用的 Unix套接字目录，默认值为`/var/run/postgresql`。

PostgreSQL 和 Pgbouncer 本地连接的Unix套接字目录，[`pg_exporter`](#pg_exporter) 和 patroni 都会优先使用 Unix 套接字访问 PostgreSQL。

------

### `pg_namespace`

参数名称： `pg_namespace`， 类型： `path`， 层次：`C`

在 [etcd](/zh/docs/etcd/) 中使用的顶级命名空间，由 patroni 和 vip-manager 使用，默认值是：`/pg`，不建议更改。

------

### `patroni_enabled`

参数名称： `patroni_enabled`， 类型： `bool`， 层次：`C`

是否启用 Patroni ？默认值为：`true`。

如果禁用，则在初始化期间不会创建Postgres集群。Pigsty将跳过拉起 patroni的任务，当试图向现有的postgres实例添加一些组件时，可以使用此参数。

------

### `patroni_mode`

参数名称： `patroni_mode`， 类型： `enum`， 层次：`C`

Patroni 工作模式：`default`，`pause`，`remove`。默认值：`default`。

- `default`：正常使用 Patroni 引导 PostgreSQL 集群
- `pause`：与`default`相似，但在引导后进入维护模式
- `remove`：使用Patroni初始化集群，然后删除Patroni并使用原始 PostgreSQL。

------

### `patroni_port`

参数名称： `patroni_port`， 类型： `port`， 层次：`C`

patroni监听端口，默认为`8008`，不建议更改。

Patroni API服务器在此端口上监听健康检查和API请求。

------

### `patroni_log_dir`

参数名称： `patroni_log_dir`， 类型： `path`， 层次：`C`

patroni日志目录，默认为`/pg/log/patroni`，由[`promtail`](/zh/docs/node/param/#promtail)收集。

------

### `patroni_ssl_enabled`

参数名称： `patroni_ssl_enabled`， 类型： `bool`， 层次：`G`

使用SSL保护patroni RestAPI通信吗？默认值为`false`。

此参数是一个全局标志，只能在部署之前预先设置。因为如果为 patroni 启用了SSL，您将必须使用 HTTPS 而不是 HTTP 执行健康检查、获取指标，调用API。

------

### `patroni_watchdog_mode`

参数名称： `patroni_watchdog_mode`， 类型： `string`， 层次：`C`

patroni看门狗模式：`automatic`，`required`，`off`，默认值为 `off`。

在主库故障的情况下，Patroni 可以使用[看门狗](https://patroni.readthedocs.io/en/latest/watchdog.html) 来强制关机旧主库节点以避免脑裂。

- `off`：不使用`看门狗`。完全不进行 Fencing （默认行为）
- `automatic`：如果内核启用了`softdog`模块并且看门狗属于dbsu，则启用 `watchdog`。
- `required`：强制启用 `watchdog`，如果`softdog`不可用则拒绝启动 Patroni/PostgreSQL。

默认值为`off`，您不应该在 Infra节点 启用看门狗，数据一致性优先于可用性的关键系统，特别是与钱有关的业务集群可以考虑打开此选项。

请注意，如果您的所有访问流量都使用 HAproxy 健康检查[服务接入](/zh/docs/pgsql/service/#接入服务)，正常是不存在脑裂风险的。

------

### `patroni_username`

参数名称： `patroni_username`， 类型： `username`， 层次：`C`

Patroni REST API 用户名，默认为`postgres`，与[`patroni_password`](#patroni_password) 配对使用。

Patroni的危险 REST API （比如重启集群）由额外的用户名/密码保护，查看[配置集群](/zh/docs/pgsql/admin/#配置集群)和[Patroni RESTAPI](https://patroni.readthedocs.io/en/latest/rest_api.html)以获取详细信息。

------

### `patroni_password`

参数名称： `patroni_password`， 类型： `password`， 层次：`C`

Patroni REST API 密码，默认为`Patroni.API`。

> 警告：务必生产环境中修改此参数！

------

### `pg_primary_db`

参数名称： `pg_primary_db`， 类型： `string`， 层次：`C`

指定集群中的主数据库名称，用于 citus 等业务数据库，默认为 `postgres`。

例如，在使用 Patroni 管理高可用的 Citus 集群时，您必须选择一个 “主数据库”。

此外，在这里指定的数据库名称，将在 PGSQL 模块安装完成后，显示在打印的连接串中。

------

### `pg_parameters`

参数名称： `pg_parameters`， 类型： `dict`， 层次：`G/C/I`

可用于指定并管理 `postgresql.auto.conf` 中的配置参数。

当集群所有实例完成初始化后，`pg_param` 任务将会把本字典中的 key / value 键值对依次覆盖写入 `/pg/data/postgresql.auto.conf` 中。

> 注意：请不要手工修改该配置文件，或通过 `ALTER SYSTEM` 修改集群配置参数，修改会在下一次配置同步时被覆盖。

该变量的优先级大于 Patroni / DCS 中的集群配置（即优先级高于集群配置，由 Patroni `edit-config` 编辑的配置），因此通常可以在实例级别覆盖集群默认参数。

当您的集群成员有着不同的规格（不推荐的行为！）时，您可以通过本参数对每个实例的配置进行精细化管理。

```yaml
pg-test:
  hosts:
    10.10.10.11: { pg_seq: 1, pg_role: primary , pg_parameters: { shared_buffers: '5GB' } }
    10.10.10.12: { pg_seq: 2, pg_role: replica , pg_parameters: { shared_buffers: '4GB' } }
    10.10.10.13: { pg_seq: 3, pg_role: replica , pg_parameters: { shared_buffers: '3GB' } }
```

请注意，一些 [重要的集群参数](https://patroni.readthedocs.io/en/latest/patroni_configuration.html#important-rules)（对主从库参数值有要求）是 Patroni 直接通过命令行参数管理的，具有最高优先级，无法通过此方式覆盖，对于这些参数，您必须使用 Patroni `edit-config` 进行管理与配置。

在主从上必须保持一致的 PostgreSQL 参数（不一致会导致从库无法启动！）：

- `wal_level`
- `max_connections`
- `max_locks_per_transaction`
- `max_worker_processes`
- `max_prepared_transactions`
- `track_commit_timestamp`

在主从上最好保持一致的参数（考虑到主从切换的可能性）：

- `listen_addresses`
- `port`
- `cluster_name`
- `hot_standby`
- `wal_log_hints`
- `max_wal_senders`
- `max_replication_slots`
- `wal_keep_segments`
- `wal_keep_size`

您可以设置不存在的参数（例如来自扩展的 GUC，从而配置 `ALTER SYSTEM` 无法修改的“尚未存在”的参数），但将现有配置修改为非法值可能会导致 PostgreSQL 无法启动，请谨慎配置！

------

### `pg_files`

参数名称： `pg_files`， 类型： `path[]`， 层次：`C`

用于指定需要拷贝至PGDATA目录的文件列表，默认为空数组：`[]`

在本参数中指定的文件将会被拷贝至 `{{ pg_data }}` 目录下，这主要用于下发特殊商业版本 PostgreSQL 内核要求的 License 文件。

目前仅有 PolarDB （Oracle兼容）内核需要许可证文件，例如，您可以将 `license.lic` 文件放置在 `files/` 目录下，并在 `pg_files` 中指定：

```yaml
pg_files: [ license.lic ]
```

------

### `pg_conf`

参数名称： `pg_conf`， 类型： `enum`， 层次：`C`

配置模板：`{oltp,olap,crit,tiny}.yml`，默认为`oltp.yml`。

- `tiny.yml`：为小节点、虚拟机、小型演示优化（1-8核，1-16GB）
- `oltp.yml`：为OLTP工作负载和延迟敏感应用优化（4C8GB+）（默认模板）
- `olap.yml`：为OLAP工作负载和吞吐量优化（4C8G+）
- `crit.yml`：为数据一致性和关键应用优化（4C8G+）

默认值：`oltp.yml`，但是[配置](/zh/docs/install/start/#配置)程序将在当前节点为小节点时将此值设置为 `tiny.yml`。

您可以拥有自己的模板，只需将其放在`templates/<mode>.yml`下，并将此值设置为模板名称即可使用。

------

### `pg_max_conn`

参数名称： `pg_max_conn`， 类型： `int`， 层次：`C`

PostgreSQL 服务器最大连接数。你可以选择一个介于 50 到 5000 之间的值，或使用 `auto` 选择推荐值。

默认值为 `auto`，会根据 [`pg_conf`](#pg_conf) 和 [`pg_default_service_dest`](#pg_default_service_dest) 来设定最大连接数。

- tiny: 250
- olap: 500
- crit: 500 (pgbouncer) / 1000 (postgres)
- oltp: 500 (pgbouncer) / 1000 (postgres)

不建议将此值设定为超过 5000，否则你还需要手动增加 haproxy 服务的连接限制。

Pgbouncer 的事务池可以缓解过多的 OLTP 连接问题，因此默认情况下不建议设置很大的连接数。

对于 OLAP 场景， [`pg_default_service_dest`](#pg_default_service_dest) 修改为 `postgres` 可以绕过连接池。

------

### `pg_shared_buffer_ratio`

参数名称： `pg_shared_buffer_ratio`， 类型： `float`， 层次：`C`

Postgres 共享缓冲区内存比例，默认为 `0.25`，正常范围在 `0.1`~`0.4` 之间。

默认值：`0.25`，意味着节点内存的 25% 将被用作 PostgreSQL 的分片缓冲区。如果您想为 PostgreSQL 启用大页，那么此参数值应当适当小于 [`node_hugepage_ratio`](/zh/docs/node/param/#node_hugepage_ratio)。

将此值设定为大于 0.4（40%）通常不是好主意，但在极端情况下可能有用。

注意，共享缓冲区只是 PostgreSQL 中共享内存的一部分，要计算总共享内存，使用 `show shared_memory_size_in_huge_pages;`。

------

### `pg_rto`

参数名称： `pg_rto`， 类型： `int`， 层次：`C`

以秒为单位的恢复时间目标（RTO）。这将用于计算 Patroni 的 TTL 值，默认为 `30` 秒。

如果主实例在这么长时间内失踪，将触发新的领导者选举，此值并非越低越好，它涉及到利弊权衡：

减小这个值可以减少集群故障转移期间的不可用时间（无法写入）， 但会使集群对短期网络抖动更加敏感，从而增加误报触发故障转移的几率。

您需要根据网络状况和业务约束来配置这个值，在故障几率和故障影响之间做出**权衡**， 默认值是 `30s`，它将影响以下的 Patroni 参数：

```yaml
# 获取领导者租约的 TTL（以秒为单位）。将其视为启动自动故障转移过程之前的时间长度。默认值：30
ttl: {{ pg_rto }}

# 循环将休眠的秒数。默认值：10，这是 patroni 检查循环间隔
loop_wait: {{ (pg_rto / 3)|round(0, 'ceil')|int }}

# DCS 和 PostgreSQL 操作重试的超时时间（以秒为单位）。比这短的 DCS 或网络问题不会导致 Patroni 降级领导。默认值：10
retry_timeout: {{ (pg_rto / 3)|round(0, 'ceil')|int }}

# 主实例在触发故障转移之前允许从故障中恢复的时间（以秒为单位），最大 RTO：2 倍循环等待 + primary_start_timeout
primary_start_timeout: {{ (pg_rto / 3)|round(0, 'ceil')|int }}
```

------

### `pg_rpo`

参数名称： `pg_rpo`， 类型： `int`， 层次：`C`

以字节为单位的恢复点目标（RPO），默认值：`1048576`。

默认为 1MiB，这意味着在故障转移期间最多可以容忍 1MiB 的数据丢失。

当主节点宕机并且所有副本都滞后时，你必须做出一个艰难的选择，**在可用性和一致性之间进行权衡**：

- 提升一个从库成为新的主库，并尽快将系统恢复服务，但要付出可接受的数据丢失代价（例如，少于 1MB）。
- 等待主库重新上线（可能永远不会），或人工干预以避免任何数据丢失。

你可以使用 `crit.yml` [conf](#pg_conf) 模板来确保在故障转移期间没有数据丢失，但这会牺牲一些性能。

------

### `pg_libs`

参数名称： `pg_libs`， 类型： `string`， 层次：`C`

预加载的动态共享库，默认为 `pg_stat_statements,auto_explain`，这是两个 PostgreSQL 自带的扩展，强烈建议启用。

对于现有集群，您可以直接[配置集群](/zh/docs/pgsql/admin/#配置集群)的 `shared_preload_libraries` 参数并应用生效。

如果您想使用 TimescaleDB 或 Citus 扩展，您需要将 `timescaledb` 或 `citus` 添加到此列表中。`timescaledb` 和 `citus` 应当放在这个列表的最前面，例如：

```bash
citus,timescaledb,pg_stat_statements,auto_explain
```

其他需要动态加载的扩展也可以添加到这个列表中，例如 `pg_cron`， `pgml` 等，通常 `citus` 和 `timescaledb` 有着最高的优先级，应该添加到列表的最前面。

------

### `pg_delay`

参数名称： `pg_delay`， 类型： `interval`， 层次：`I`

延迟备库复制延迟，默认值：`0`。

如果此值被设置为一个正值，备用集群主库在应用 WAL 变更之前将被延迟这个时间。设置为 `1h` 意味着该集群中的数据将始终滞后原集群一个小时。

查看 [延迟备用集群](/zh/docs/pgsql/config/#延迟集群) 以获取详细信息。

------

### `pg_checksum`

参数名称： `pg_checksum`， 类型： `bool`， 层次：`C`

为 PostgreSQL 集群启用数据校验和吗？v3.7.0 默认值是 `true`。

这个参数只能在 PGSQL 部署之前设置（但你可以稍后手动启用它）。

如果使用 [`pg_conf`](#pg_conf) `crit.yml` 模板，无论此参数如何，都会始终启用数据校验和，以确保数据完整性。

------

### `pg_pwd_enc`

参数名称： `pg_pwd_enc`， 类型： `enum`， 层次：`C`

密码加密算法：`md5` 或 `scram-sha-256`，默认值：`scram-sha-256`。

前者已经不再安全，如果你与旧客户端有兼容性问题，你可以将其设置为 `md5`。

------

### `pg_encoding`

参数名称： `pg_encoding`， 类型： `enum`， 层次：`C`

数据库集群编码，默认为 `UTF8`。

除非你非常清楚自己在做什么，否则不建议使用其他非 `UTF8` 的编码。

------

### `pg_locale`

参数名称： `pg_locale`， 类型： `enum`， 层次：`C`

PostgreSQL 使用的本地化规则集，默认为 `C`。会在数据库初始化时作为参数传递给 `initdb` 命令。

当 `configure` 检测到当前 PG 版本大于等于 17，或者当前系统明确支持 `C.utf8` 时，会自动配置此参数为 `C.UTF-8`。

当 PostgreSQL 版本大于等于 17 时， `C` 与 `C.UTF-8` 配置将使用 PostgreSQL 内部自带的 Locale Providier。

除非你非常清楚自己在做什么，否则强烈建议您使用默认的 `C` 或 `C.UTF-8` 配置。

通常应当与 [`pg_lc_collate`](#pg_lc_collate) 和 [`pg_lc_ctype`](#pg_lc_ctype) 配置保持一致。

------

### `pg_lc_collate`

参数名称： `pg_lc_collate`， 类型： `enum`， 层次：`C`

PostgreSQL 使用的本地化排序规则集，默认为 `C`，一旦确定，无法在集群层面修改。

当 `configure` 检测到当前 PG 版本大于等于 17，或者当前系统明确支持 `C.utf8` 时，会自动配置此参数为 `C.UTF-8`。

配置规则与 [`pg_locale`](#pg_locale) 一致，但针对排序规则。

------

### `pg_lc_ctype`

参数名称： `pg_lc_ctype`， 类型： `enum`， 层次：`C`

PostgreSQL 使用的本地化字符集定义 CTYPE，默认为 `C`，一旦确定，无法在集群层面修改。

当 `configure` 检测到当前 PG 版本大于等于 17，或者当前系统明确支持 `C.utf8` 时，会自动配置此参数为 `C.UTF-8`。

配置规则与 [`pg_locale`](#pg_locale) 一致，但针对字符类型。

------

### `pgsodium_key`

参数名称： `pgsodium_key`， 类型： `string`， 层次：`C`

默认值未定义，将使用 [`pg_cluster`](#pg_cluster) 的 SHA256 哈希值作为密钥。

你可以提供自定义的 [pgsodium](https://github.com/michelp/pgsodium) 密钥，应该是 64 位十六进制数字字符串。

密钥将被写入 `/pg/conf/pgsodium.key`。

------

### `pgsodium_getkey_script`

参数名称： `pgsodium_getkey_script`， 类型： `path`， 层次：`C`

默认值为 `pgsodium_getkey`，它将 [`roles/pgsql/templates/pgsodium_getkey`](https://github.com/pgsty/pigsty/blob/v3.7.0/roles/pgsql/templates/pgsodium_getkey) 渲染到 `/pg/bin/pgsodium_getkey`。

默认的 getkey 脚本只是从 `/pg/conf/pgsodium.key` 读取 [`pgsodium_key`](#pgsodium_key) 并返回它。
如果你的密钥由外部系统（如 KMS、IAM 等）管理，你可以实现自己的 getkey 脚本从那里获取密钥：[示例](https://github.com/michelp/pgsodium/tree/main/getkey_scripts)。

------

## `PG_PROVISION`

如果说 [`PG_BOOTSTRAP`](#pg_bootstrap) 是创建一个新的集群，那么 PG_PROVISION 就是在集群中创建默认的对象，包括：

- [默认角色](/zh/docs/pgsql/acl/#默认角色)
- [默认用户](/zh/docs/pgsql/acl/#默认用户)
- [默认权限](/zh/docs/pgsql/acl/#默认权限)
- [默认HBA规则](/zh/docs/pgsql/hba/#默认hba)
- 默认模式
- 默认扩展

```yaml
pg_provision: true                # provision postgres cluster after bootstrap
pg_init: pg-init                  # provision init script for cluster template, `pg-init` by default
pg_default_roles:                 # default roles and users in postgres cluster
  - { name: dbrole_readonly  ,login: false ,comment: role for global read-only access     }
  - { name: dbrole_offline   ,login: false ,comment: role for restricted read-only access }
  - { name: dbrole_readwrite ,login: false ,roles: [dbrole_readonly]               ,comment: role for global read-write access }
  - { name: dbrole_admin     ,login: false ,roles: [pg_monitor, dbrole_readwrite]  ,comment: role for object creation }
  - { name: postgres     ,superuser: true                                          ,comment: system superuser }
  - { name: replicator ,replication: true  ,roles: [pg_monitor, dbrole_readonly]   ,comment: system replicator }
  - { name: dbuser_dba   ,superuser: true  ,roles: [dbrole_admin]  ,pgbouncer: true ,pool_mode: session, pool_connlimit: 16 , comment: pgsql admin user }
  - { name: dbuser_monitor   ,roles: [pg_monitor, dbrole_readonly] ,pgbouncer: true ,parameters: {log_min_duration_statement: 1000 } ,pool_mode: session ,pool_connlimit: 8 ,comment: pgsql monitor user }
pg_default_privileges:            # 管理员用户创建时的默认权限
  - GRANT USAGE      ON SCHEMAS   TO dbrole_readonly
  - GRANT SELECT     ON TABLES    TO dbrole_readonly
  - GRANT SELECT     ON SEQUENCES TO dbrole_readonly
  - GRANT EXECUTE    ON FUNCTIONS TO dbrole_readonly
  - GRANT USAGE      ON SCHEMAS   TO dbrole_offline
  - GRANT SELECT     ON TABLES    TO dbrole_offline
  - GRANT SELECT     ON SEQUENCES TO dbrole_offline
  - GRANT EXECUTE    ON FUNCTIONS TO dbrole_offline
  - GRANT INSERT     ON TABLES    TO dbrole_readwrite
  - GRANT UPDATE     ON TABLES    TO dbrole_readwrite
  - GRANT DELETE     ON TABLES    TO dbrole_readwrite
  - GRANT USAGE      ON SEQUENCES TO dbrole_readwrite
  - GRANT UPDATE     ON SEQUENCES TO dbrole_readwrite
  - GRANT TRUNCATE   ON TABLES    TO dbrole_admin
  - GRANT REFERENCES ON TABLES    TO dbrole_admin
  - GRANT TRIGGER    ON TABLES    TO dbrole_admin
  - GRANT CREATE     ON SCHEMAS   TO dbrole_admin
pg_default_schemas: [ monitor ]   # 默认模式
pg_default_extensions:            # 默认扩展
  - { name: pg_stat_statements ,schema: monitor }
  - { name: pgstattuple        ,schema: monitor }
  - { name: pg_buffercache     ,schema: monitor }
  - { name: pageinspect        ,schema: monitor }
  - { name: pg_prewarm         ,schema: monitor }
  - { name: pg_visibility      ,schema: monitor }
  - { name: pg_freespacemap    ,schema: monitor }
  - { name: postgres_fdw       ,schema: public  }
  - { name: file_fdw           ,schema: public  }
  - { name: btree_gist         ,schema: public  }
  - { name: btree_gin          ,schema: public  }
  - { name: pg_trgm            ,schema: public  }
  - { name: intagg             ,schema: public  }
  - { name: intarray           ,schema: public  }
  - { name: pg_repack }
pg_reload: true                   # HBA变化后是否重载配置？
pg_default_hba_rules:             # postgres 默认 HBA 规则集
  - {user: '${dbsu}'    ,db: all         ,addr: local     ,auth: ident ,title: 'dbsu access via local os user ident'  }
  - {user: '${dbsu}'    ,db: replication ,addr: local     ,auth: ident ,title: 'dbsu replication from local os ident' }
  - {user: '${repl}'    ,db: replication ,addr: localhost ,auth: pwd   ,title: 'replicator replication from localhost'}
  - {user: '${repl}'    ,db: replication ,addr: intra     ,auth: pwd   ,title: 'replicator replication from intranet' }
  - {user: '${repl}'    ,db: postgres    ,addr: intra     ,auth: pwd   ,title: 'replicator postgres db from intranet' }
  - {user: '${monitor}' ,db: all         ,addr: localhost ,auth: pwd   ,title: 'monitor from localhost with password' }
  - {user: '${monitor}' ,db: all         ,addr: infra     ,auth: pwd   ,title: 'monitor from infra host with password'}
  - {user: '${admin}'   ,db: all         ,addr: infra     ,auth: ssl   ,title: 'admin @ infra nodes with pwd & ssl'   }
  - {user: '${admin}'   ,db: all         ,addr: world     ,auth: ssl   ,title: 'admin @ everywhere with ssl & pwd'    }
  - {user: '+dbrole_readonly',db: all    ,addr: localhost ,auth: pwd   ,title: 'pgbouncer read/write via local socket'}
  - {user: '+dbrole_readonly',db: all    ,addr: intra     ,auth: pwd   ,title: 'read/write biz user via password'     }
  - {user: '+dbrole_offline' ,db: all    ,addr: intra     ,auth: pwd   ,title: 'allow etl offline tasks from intranet'}
pgb_default_hba_rules:            # pgbouncer 默认 HBA 规则集
  - {user: '${dbsu}'    ,db: pgbouncer   ,addr: local     ,auth: peer  ,title: 'dbsu local admin access with os ident'}
  - {user: 'all'        ,db: all         ,addr: localhost ,auth: pwd   ,title: 'allow all user local access with pwd' }
  - {user: '${monitor}' ,db: pgbouncer   ,addr: intra     ,auth: pwd   ,title: 'monitor access via intranet with pwd' }
  - {user: '${monitor}' ,db: all         ,addr: world     ,auth: deny  ,title: 'reject all other monitor access addr' }
  - {user: '${admin}'   ,db: all         ,addr: intra     ,auth: pwd   ,title: 'admin access via intranet with pwd'   }
  - {user: '${admin}'   ,db: all         ,addr: world     ,auth: deny  ,title: 'reject all other admin access addr'   }
  - {user: 'all'        ,db: all         ,addr: intra     ,auth: pwd   ,title: 'allow all user intra access with pwd' }
```

------

### `pg_provision`

参数名称： `pg_provision`， 类型： `bool`， 层次：`C`

在集群拉起后，完整本节定义的 PostgreSQL 集群置备工作。默认值为`true`。

如果禁用，不会置备 PostgreSQL 集群。对于一些特殊的 “PostgreSQL” 集群，比如 Greenplum，可以关闭此选项跳过置备阶段。

------

### `pg_init`

参数名称： `pg_init`， 类型： `string`， 层次：`G/C`

用于初始化数据库模板的Shell脚本位置，默认为 `pg-init`，该脚本会被拷贝至`/pg/bin/pg-init`后执行。

该脚本位于 [`roles/pgsql/templates/pg-init`](https://github.com/pgsty/pigsty/blob/v3.7.0/roles/pgsql/templates/pg-init)

你可以在该脚本中添加自己的逻辑，或者提供一个新的脚本放置在 `templates/` 目录下，并将 `pg_init` 设置为新的脚本名称。使用自定义脚本时请保留现有的初始化逻辑。

------

### `pg_default_roles`

参数名称： `pg_default_roles`， 类型： `role[]`， 层次：`G/C`

Postgres 集群中的默认角色和用户。

Pigsty有一个内置的角色系统，请查看[PGSQL访问控制：角色系统](/zh/docs/pgsql/acl/#角色系统)了解详情。

```yaml
pg_default_roles:                 # default roles and users in postgres cluster
  - { name: dbrole_readonly  ,login: false ,comment: role for global read-only access     }
  - { name: dbrole_offline   ,login: false ,comment: role for restricted read-only access }
  - { name: dbrole_readwrite ,login: false ,roles: [dbrole_readonly]               ,comment: role for global read-write access }
  - { name: dbrole_admin     ,login: false ,roles: [pg_monitor, dbrole_readwrite]  ,comment: role for object creation }
  - { name: postgres     ,superuser: true                                          ,comment: system superuser }
  - { name: replicator ,replication: true  ,roles: [pg_monitor, dbrole_readonly]   ,comment: system replicator }
  - { name: dbuser_dba   ,superuser: true  ,roles: [dbrole_admin]  ,pgbouncer: true ,pool_mode: session, pool_connlimit: 16 , comment: pgsql admin user }
  - { name: dbuser_monitor   ,roles: [pg_monitor, dbrole_readonly] ,pgbouncer: true ,parameters: {log_min_duration_statement: 1000 } ,pool_mode: session ,pool_connlimit: 8 ,comment: pgsql monitor user }
```

------

### `pg_default_privileges`

参数名称： `pg_default_privileges`， 类型： `string[]`， 层次：`G/C`

每个数据库中的默认权限（`DEFAULT PRIVILEGE`）设置：

```yaml
pg_default_privileges:            # 管理员用户创建时的默认权限
  - GRANT USAGE      ON SCHEMAS   TO dbrole_readonly
  - GRANT SELECT     ON TABLES    TO dbrole_readonly
  - GRANT SELECT     ON SEQUENCES TO dbrole_readonly
  - GRANT EXECUTE    ON FUNCTIONS TO dbrole_readonly
  - GRANT USAGE      ON SCHEMAS   TO dbrole_offline
  - GRANT SELECT     ON TABLES    TO dbrole_offline
  - GRANT SELECT     ON SEQUENCES TO dbrole_offline
  - GRANT EXECUTE    ON FUNCTIONS TO dbrole_offline
  - GRANT INSERT     ON TABLES    TO dbrole_readwrite
  - GRANT UPDATE     ON TABLES    TO dbrole_readwrite
  - GRANT DELETE     ON TABLES    TO dbrole_readwrite
  - GRANT USAGE      ON SEQUENCES TO dbrole_readwrite
  - GRANT UPDATE     ON SEQUENCES TO dbrole_readwrite
  - GRANT TRUNCATE   ON TABLES    TO dbrole_admin
  - GRANT REFERENCES ON TABLES    TO dbrole_admin
  - GRANT TRIGGER    ON TABLES    TO dbrole_admin
  - GRANT CREATE     ON SCHEMAS   TO dbrole_admin
```

Pigsty 基于默认角色系统提供了相应的默认权限设置，请查看[PGSQL访问控制：权限](/zh/docs/pgsql/acl/#默认权限)了解详情。

------

### `pg_default_schemas`

参数名称： `pg_default_schemas`， 类型： `string[]`， 层次：`G/C`

要创建的默认模式，默认值为：`[ monitor ]`，这将在所有数据库上创建一个`monitor`模式，用于放置各种监控扩展、表、视图、函数。

------

### `pg_default_extensions`

参数名称： `pg_default_extensions`， 类型： `extension[]`， 层次：`G/C`

要在所有数据库中默认创建启用的扩展列表，默认值：

```yaml
pg_default_extensions: # default extensions to be created
  - { name: pg_stat_statements ,schema: monitor }
  - { name: pgstattuple        ,schema: monitor }
  - { name: pg_buffercache     ,schema: monitor }
  - { name: pageinspect        ,schema: monitor }
  - { name: pg_prewarm         ,schema: monitor }
  - { name: pg_visibility      ,schema: monitor }
  - { name: pg_freespacemap    ,schema: monitor }
  - { name: postgres_fdw       ,schema: public  }
  - { name: file_fdw           ,schema: public  }
  - { name: btree_gist         ,schema: public  }
  - { name: btree_gin          ,schema: public  }
  - { name: pg_trgm            ,schema: public  }
  - { name: intagg             ,schema: public  }
  - { name: intarray           ,schema: public  }
  - { name: pg_repack }
```

唯一的三方扩展是 [`pg_repack`](https://pigsty.cc/ext/admin/pg_repack/)，这对于数据库维护很重要，所有其他扩展都是内置的 PostgreSQL Contrib 扩展插件。

监控相关的扩展默认安装在 `monitor` 模式中，该模式由[`pg_default_schemas`](#pg_default_schemas)创建。

------

### `pg_reload`

参数名称： `pg_reload`， 类型： `bool`， 层次：`A`

在hba更改后重新加载 PostgreSQL，默认值为`true`

当您想在应用HBA更改之前进行检查时，将其设置为`false`以禁用自动重新加载配置。

------

### `pg_default_hba_rules`

参数名称： `pg_default_hba_rules`， 类型： `hba[]`， 层次：`G/C`

PostgreSQL 基于主机的认证规则，全局默认规则定义。默认值为：

```yaml
pg_default_hba_rules:             # postgres default host-based authentication rules
  - {user: '${dbsu}'    ,db: all         ,addr: local     ,auth: ident ,title: 'dbsu access via local os user ident'  }
  - {user: '${dbsu}'    ,db: replication ,addr: local     ,auth: ident ,title: 'dbsu replication from local os ident' }
  - {user: '${repl}'    ,db: replication ,addr: localhost ,auth: pwd   ,title: 'replicator replication from localhost'}
  - {user: '${repl}'    ,db: replication ,addr: intra     ,auth: pwd   ,title: 'replicator replication from intranet' }
  - {user: '${repl}'    ,db: postgres    ,addr: intra     ,auth: pwd   ,title: 'replicator postgres db from intranet' }
  - {user: '${monitor}' ,db: all         ,addr: localhost ,auth: pwd   ,title: 'monitor from localhost with password' }
  - {user: '${monitor}' ,db: all         ,addr: infra     ,auth: pwd   ,title: 'monitor from infra host with password'}
  - {user: '${admin}'   ,db: all         ,addr: infra     ,auth: ssl   ,title: 'admin @ infra nodes with pwd & ssl'   }
  - {user: '${admin}'   ,db: all         ,addr: world     ,auth: ssl   ,title: 'admin @ everywhere with ssl & pwd'    }
  - {user: '+dbrole_readonly',db: all    ,addr: localhost ,auth: pwd   ,title: 'pgbouncer read/write via local socket'}
  - {user: '+dbrole_readonly',db: all    ,addr: intra     ,auth: pwd   ,title: 'read/write biz user via password'     }
  - {user: '+dbrole_offline' ,db: all    ,addr: intra     ,auth: pwd   ,title: 'allow etl offline tasks from intranet'}
```

默认值为常见场景提供了足够的安全级别，请查看[PGSQL身份验证](/zh/docs/pgsql/hba/)了解详情。

本参数为 [HBA](/zh/docs/pgsql/hba/#定义hba)规则对象组成的数组，在形式上与 [`pg_hba_rules`](#pg_hba_rules) 完全一致。 建议在全局配置统一的 [`pg_default_hba_rules`](#pg_default_hba_rules)，针对特定集群使用 [`pg_hba_rules`](#pg_hba_rules) 进行额外定制。两个参数中的规则都会依次应用，后者优先级更高。

------

### `pgb_default_hba_rules`

参数名称： `pgb_default_hba_rules`， 类型： `hba[]`， 层次：`G/C`

Pgbouncer 默认的基于主机的认证规则，数组或 [hba](/zh/docs/pgsql/hba/#定义hba) 规则对象。

默认值提供了一套对于常见场景足够的安全级别，查看 [PGSQL Authentication](/zh/docs/pgsql/hba/) 了解详情。

```yaml
pgb_default_hba_rules:            # pgbouncer default host-based authentication rules
  - {user: '${dbsu}'    ,db: pgbouncer   ,addr: local     ,auth: peer  ,title: 'dbsu local admin access with os ident'}
  - {user: 'all'        ,db: all         ,addr: localhost ,auth: pwd   ,title: 'allow all user local access with pwd' }
  - {user: '${monitor}' ,db: pgbouncer   ,addr: intra     ,auth: pwd   ,title: 'monitor access via intranet with pwd' }
  - {user: '${monitor}' ,db: all         ,addr: world     ,auth: deny  ,title: 'reject all other monitor access addr' }
  - {user: '${admin}'   ,db: all         ,addr: intra     ,auth: pwd   ,title: 'admin access via intranet with pwd'   }
  - {user: '${admin}'   ,db: all         ,addr: world     ,auth: deny  ,title: 'reject all other admin access addr'   }
  - {user: 'all'        ,db: all         ,addr: intra     ,auth: pwd   ,title: 'allow all user intra access with pwd' }
```

默认的Pgbouncer HBA规则很简单：

1. 允许从**本地**使用密码登陆
2. 允许从内网网断使用密码登陆

用户可以按照自己的需求进行定制。

本参数在形式上与 [`pgb_hba_rules`](#pgb_hba_rules) 完全一致，建议在全局配置统一的 [`pgb_default_hba_rules`](#pgb_default_hba_rules)，针对特定集群使用 [`pgb_hba_rules`](#pgb_hba_rules) 进行额外定制。两个参数中的规则都会依次应用，后者优先级更高。

------

## `PG_BACKUP`

本节定义了用于 [pgBackRest](https://pgbackrest.org/) 的变量，它被用于 PGSQL 时间点恢复 PITR 。

查看 [PGSQL 备份 & PITR](/zh/docs/pgsql/backup/) 以获取详细信息。

```yaml
pgbackrest_enabled: true          # 在 pgsql 主机上启用 pgBackRest 吗？
pgbackrest_clean: true            # 初始化时删除 pg 备份数据？
pgbackrest_log_dir: /pg/log/pgbackrest # pgbackrest 日志目录，默认为 `/pg/log/pgbackrest`
pgbackrest_method: local          # pgbackrest 仓库方法：local, minio, [用户定义...]
pgbackrest_repo:                  # pgbackrest 仓库：https://pgbackrest.org/configuration.html#section-repository
  local:                          # 默认使用本地 posix 文件系统的 pgbackrest 仓库
    path: /pg/backup              # 本地备份目录，默认为 `/pg/backup`
    retention_full_type: count    # 按计数保留完整备份
    retention_full: 2             # 使用本地文件系统仓库时，最多保留 3 个完整备份，至少保留 2 个
  minio:                          # pgbackrest 的可选 minio 仓库
    type: s3                      # minio 是与 s3 兼容的，所以使用 s3
    s3_endpoint: sss.pigsty       # minio 端点域名，默认为 `sss.pigsty`
    s3_region: us-east-1          # minio 区域，默认为 us-east-1，对 minio 无效
    s3_bucket: pgsql              # minio 桶名称，默认为 `pgsql`
    s3_key: pgbackrest            # pgbackrest 的 minio 用户访问密钥
    s3_key_secret: S3User.Backup  # pgbackrest 的 minio 用户秘密密钥
    s3_uri_style: path            # 对 minio 使用路径风格的 uri，而不是主机风格
    path: /pgbackrest             # minio 备份路径，默认为 `/pgbackrest`
    storage_port: 9000            # minio 端口，默认为 9000
    storage_ca_file: /etc/pki/ca.crt  # minio ca 文件路径，默认为 `/etc/pki/ca.crt`
    block: y                      # 启用块增量备份
    bundle: y                     # 将小文件捆绑在一起
    bundle_limit: 20MiB           # 文件捆绑限制，20MiB 用于对象存储
    bundle_size: 128MiB           # 文件捆绑目标大小，128MiB 用于对象存储
    cipher_type: aes-256-cbc      # 为远程备份仓库启用 AES 加密
    cipher_pass: pgBackRest       # AES 加密密码，默认为 'pgBackRest'
    retention_full_type: time     # 在 minio 仓库上按时间保留完整备份
    retention_full: 14            # 保留过去 14 天的完整备份
```

------

### `pgbackrest_enabled`

参数名称： `pgbackrest_enabled`， 类型： `bool`， 层次：`C`

是否在 PGSQL 节点上启用 pgBackRest？默认值为： `true`

在使用本地文件系统备份仓库（`local`）时，只有集群主库才会真正启用 `pgbackrest`。其他实例只会初始化一个空仓库。

------

### `pgbackrest_clean`

参数名称： `pgbackrest_clean`， 类型： `bool`， 层次：`C`

初始化时删除 PostgreSQL 备份数据吗？默认值为 `true`。

------

### `pgbackrest_log_dir`

参数名称： `pgbackrest_log_dir`， 类型： `path`， 层次：`C`

pgBackRest 日志目录，默认为 `/pg/log/pgbackrest`，[`promtail`](/zh/docs/node/param/#promtail) 日志代理会引用此参数收集日志。

------

### `pgbackrest_method`

参数名称： `pgbackrest_method`， 类型： `enum`， 层次：`C`

pgBackRest 仓库方法：默认可选项为：`local`、`minio` 或其他用户定义的方法，默认为 `local`。

此参数用于确定用于 pgBackRest 的仓库，所有可用的仓库方法都在 [`pgbackrest_repo`](#pgbackrest_repo) 中定义。

Pigsty 默认使用 `local` 备份仓库，这将在主实例的 `/pg/backup` 目录上创建一个备份仓库。底层存储路径由 [`pg_fs_bkup`](#pg_fs_bkup) 指定。

------

### `pgbackrest_init_backup`

name: `pgbackrest_init_backup`, type: `bool`, level: `C`

Take a full backup after pgBackRest is initialized? default value is `true`.

An initial pgbackrest backup is created after repo init if:

- `pgbackrest_init_backup` is `true` (and `pgbackrest_enabled` is `true` of course)
- The `/etc/pgbackrest/initial.done` marker file doesn't exist (will be created after the initial backup is done).

If you don't want to take an initial full backup at all, just set this parameter to`false`.


------

### `pgbackrest_repo`

参数名称： `pgbackrest_repo`， 类型： `dict`， 层次：`G/C`

pgBackRest 仓库文档：https://pgbackrest.org/configuration.html#section-repository

默认值包括两种仓库方法：`local` 和 `minio`，定义如下：

```yaml
pgbackrest_repo:                  # pgbackrest 仓库：https://pgbackrest.org/configuration.html#section-repository
  local:                          # 默认使用本地 posix 文件系统的 pgbackrest 仓库
    path: /pg/backup              # 本地备份目录，默认为 `/pg/backup`
    retention_full_type: count    # 按计数保留完整备份
    retention_full: 2             # 使用本地文件系统仓库时，最多保留 3 个完整备份，至少保留 2 个
  minio:                          # pgbackrest 的可选 minio 仓库
    type: s3                      # minio 是与 s3 兼容的，所以使用 s3
    s3_endpoint: sss.pigsty       # minio 端点域名，默认为 `sss.pigsty`
    s3_region: us-east-1          # minio 区域，默认为 us-east-1，对 minio 无效
    s3_bucket: pgsql              # minio 桶名称，默认为 `pgsql`
    s3_key: pgbackrest            # pgbackrest 的 minio 用户访问密钥
    s3_key_secret: S3User.Backup  # pgbackrest 的 minio 用户秘密密钥
    s3_uri_style: path            # 对 minio 使用路径风格的 uri，而不是主机风格
    path: /pgbackrest             # minio 备份路径，默认为 `/pgbackrest`
    storage_port: 9000            # minio 端口，默认为 9000
    storage_ca_file: /etc/pki/ca.crt  # minio ca 文件路径，默认为 `/etc/pki/ca.crt`
    block: y                      # 启用块增量备份
    bundle: y                     # 将小文件捆绑在一起
    bundle_limit: 20MiB           # 文件捆绑限制，20MiB 用于对象存储
    bundle_size: 128MiB           # 文件捆绑目标大小，128MiB 用于对象存储
    cipher_type: aes-256-cbc      # 为远程备份仓库启用 AES 加密
    cipher_pass: pgBackRest       # AES 加密密码，默认为 'pgBackRest'
    retention_full_type: time     # 在 minio 仓库上按时间保留完整备份
    retention_full: 14            # 保留过去 14 天的完整备份
```

您可以定义新的备份仓库，例如使用 AWS S3，GCP 或其他云供应商的 S3 兼容存储服务。

在备份仓库定义参数中，你可以使用 `${pg_cluster}` 变量来引用集群名称，例如作为备份路径或加密密钥的一部分。 但如果你有跨集群 PITR 的需求，则应该保持备份仓库路径与加密密钥相同。



------

## `PG_ACCESS`

本节介绍如何将PostgreSQL服务暴露给外部世界，包括：

- 使用`haproxy`在不同的端口上暴露不同的PostgreSQL服务
- 使用`vip-manager`将可选的L2 VIP绑定到主实例
- 在基础设施节点上使用`dnsmasq`注册集群/实例DNS记录

```yaml
pgbouncer_enabled: true           # if disabled, pgbouncer will not be launched on pgsql host
pgbouncer_port: 6432              # pgbouncer listen port, 6432 by default
pgbouncer_log_dir: /pg/log/pgbouncer  # pgbouncer log dir, `/pg/log/pgbouncer` by default
pgbouncer_auth_query: false       # query postgres to retrieve unlisted business users?
pgbouncer_poolmode: transaction   # pooling mode: transaction,session,statement, transaction by default
pgbouncer_sslmode: disable        # pgbouncer client ssl mode, disable by default

pg_weight: 100          #INSTANCE # relative load balance weight in service, 100 by default, 0-255
pg_default_service_dest: pgbouncer # default service destination if svc.dest='default'
pg_default_services:              # postgres default service definitions
  - { name: primary ,port: 5433 ,dest: default  ,check: /primary   ,selector: "[]" }
  - { name: replica ,port: 5434 ,dest: default  ,check: /read-only ,selector: "[]" , backup: "[? pg_role == `primary` || pg_role == `offline` ]" }
  - { name: default ,port: 5436 ,dest: postgres ,check: /primary   ,selector: "[]" }
  - { name: offline ,port: 5438 ,dest: postgres ,check: /replica   ,selector: "[? pg_role == `offline` || pg_offline_query ]" , backup: "[? pg_role == `replica` && !pg_offline_query]"}
pg_vip_enabled: false             # 为pgsql主要实例启用l2 vip吗? 默认为false
pg_vip_address: 127.0.0.1/24      # `<ipv4>/<mask>`格式的vip地址，如果启用vip则需要
pg_vip_interface: eth0            # vip网络接口监听，默认为eth0
pg_dns_suffix: ''                 # pgsql dns后缀，默认为空
pg_dns_target: auto               # auto、primary、vip、none或特定的ip
```



------

### `pgbouncer_enabled`

name: `pgbouncer_enabled`, type: `bool`, level: `C`

default value is `true`, if disabled, pgbouncer will not be launched on pgsql host

------

### `pgbouncer_port`

name: `pgbouncer_port`, type: `port`, level: `C`

pgbouncer listen port, `6432` by default

------

### `pgbouncer_log_dir`

name: `pgbouncer_log_dir`, type: `path`, level: `C`

pgbouncer log dir, `/pg/log/pgbouncer` by default, referenced by promtail the logging agent.

------

### `pgbouncer_auth_query`

name: `pgbouncer_auth_query`, type: `bool`, level: `C`

query postgres to retrieve unlisted business users? default value is `false`

If enabled, pgbouncer user will be authenticated against postgres databases with `SELECT username, password FROM monitor.pgbouncer_auth($1)`, otherwise, only the users with `pgbouncer: true` will be allowed to connect to pgbouncer.


------

### `pgbouncer_poolmode`

name: `pgbouncer_poolmode`, type: `enum`, level: `C`

Pgbouncer pooling mode: `transaction`, `session`, `statement`, `transaction` by default

- `session`: Session-level pooling with the best compatibility.
- `transaction`: Transaction-level pooling with better performance (lots of small conns), could break some session level features such as notify/listen, etc…
- `statements`: Statement-level pooling which is used for simple read-only queries.

If your application has some compatibility issues with pgbouncer, you can try to change this value to `session` instead.


------

### `pgbouncer_sslmode`

name: `pgbouncer_sslmode`, type: `enum`, level: `C`

pgbouncer client ssl mode, `disable` by default

default values: `disable`, beware that this may have a huge performance impact on your pgbouncer.

- `disable`: Plain TCP. If a client requests TLS, it’s ignored. Default.
- `allow`: If a client requests TLS, it is used. If not, plain TCP is used. If the client presents a client certificate, it is not validated.
- `prefer`: Same as allow.
- `require`: Client must use TLS. If not, the client connection is rejected. If the client presents a client certificate, it is not validated.
- `verify-ca`: Client must use TLS with valid client certificate.
- `verify-full`: Same as verify-ca.

------

### `pgbouncer_ignore_param`

name: `pgbouncer_ignore_param`, type: `string[]`, level: `G/C`

default values: `[ extra_float_digits, application_name, TimeZone, DateStyle, IntervalStyle, search_path ]`

This will be used as value of [**`ignore_startup_parameters`**](https://www.pgbouncer.org/config.html#ignore_startup_parameters) in pgbouncer.




------

### `pg_weight`

参数名称： `pg_weight`， 类型： `int`， 层次：`G`

服务中的相对负载均衡权重，默认为100，范围0-255。

默认值： `100`。您必须在实例变量中定义它，并[重载服务](/zh/docs/pgsql/admin/#重载服务)以生效。

------

### `pg_service_provider`

参数名称： `pg_service_provider`， 类型： `string`， 层次：`G/C`

专用的haproxy节点组名，或默认为本地节点的空字符串。

如果指定，PostgreSQL服务将注册到专用的haproxy节点组，而不是当下的 PGSQL 集群节点。

请记住为每个服务在专用的 haproxy 节点上分配**唯一**的端口！

例如，如果我们在3节点的 `pg-test` 集群上定义以下参数：

```yaml
pg_service_provider: infra       # use load balancer on group `infra`
pg_default_services:             # alloc port 10001 and 10002 for pg-test primary/replica service
  - { name: primary ,port: 10001 ,dest: postgres  ,check: /primary   ,selector: "[]" }
  - { name: replica ,port: 10002 ,dest: postgres  ,check: /read-only ,selector: "[]" , backup: "[? pg_role == `primary` || pg_role == `offline` ]" }
```

------

### `pg_default_service_dest`

参数名称： `pg_default_service_dest`， 类型： `enum`， 层次：`G/C`

当定义一个[服务](/zh/docs/pgsql/service/#定义服务)时，如果 `svc.dest='default'`，此参数将用作默认值。

默认值： `pgbouncer`，意味着 `5433` 读写服务和 `5434` 只读服务将默认将流量路由到 pgbouncer。

如果您不想使用 pgbouncer，将其设置为 `postgres`。流量将直接路由到 postgres。

------

### `pg_default_services`

参数名称： `pg_default_services`， 类型： `service[]`， 层次：`G/C`

postgres默认服务定义

默认值是四个默认服务定义，如[PGSQL Service](/zh/docs/pgsql/service/#服务概述)所述

```yaml
pg_default_services:               # postgres default service definitions
  - { name: primary ,port: 5433 ,dest: default  ,check: /primary   ,selector: "[]" }
  - { name: replica ,port: 5434 ,dest: default  ,check: /read-only ,selector: "[]" , backup: "[? pg_role == `primary` || pg_role == `offline` ]" }
  - { name: default ,port: 5436 ,dest: postgres ,check: /primary   ,selector: "[]" }
  - { name: offline ,port: 5438 ,dest: postgres ,check: /replica   ,selector: "[? pg_role == `offline` || pg_offline_query ]" , backup: "[? pg_role == `replica` && !pg_offline_query]"}
```

------

### `pg_vip_enabled`

参数名称： `pg_vip_enabled`， 类型： `bool`， 层次：`C`

为 PGSQL 集群启用 L2 VIP吗？默认值是`false`，表示不创建 L2 VIP。

启用 L2 VIP 后，会有一个 VIP 绑定在集群主实例节点上，由 `vip-manager` 管理，根据 `etcd` 中的数据进行判断。

L2 VIP只能在相同的L2网络中使用，这可能会对您的网络拓扑产生额外的限制。

------

### `pg_vip_address`

参数名称： `pg_vip_address`， 类型： `cidr4`， 层次：`C`

如果启用vip，则需要`<ipv4>/<mask>`格式的vip地址。

默认值： `127.0.0.1/24`。这个值由两部分组成：`ipv4`和`mask`，用`/`分隔。

------

### `pg_vip_interface`

参数名称： `pg_vip_interface`， 类型： `string`， 层次：`C/I`

vip network interface to listen, `eth0` by default.

L2 VIP 监听的网卡接口，默认为 `eth0`。

它应该是您节点的首要网卡名，即您在配置清单中使用的IP地址。

如果您的节点有多块名称不同的网卡，您可以在实例变量上进行覆盖：

```yaml
pg-test:
    hosts:
        10.10.10.11: {pg_seq: 1, pg_role: replica ,pg_vip_interface: eth0 }
        10.10.10.12: {pg_seq: 2, pg_role: primary ,pg_vip_interface: eth1 }
        10.10.10.13: {pg_seq: 3, pg_role: replica ,pg_vip_interface: eth2 }
    vars:
      pg_vip_enabled: true          # 为这个集群启用L2 VIP，默认绑定到主实例
      pg_vip_address: 10.10.10.3/24 # L2网络CIDR: 10.10.10.0/24, vip地址: 10.10.10.3
      # pg_vip_interface: eth1      # 如果您的节点有统一的接口，您可以在这里定义它
```

------

### `pg_dns_suffix`

参数名称： `pg_dns_suffix`， 类型： `string`， 层次：`C`

PostgreSQL DNS 名称后缀，默认为空字符串。

在默认情况下，PostgreQL 集群名会作为 DNS 域名注册到 Infra 节点的 `dnsmasq` 中对外提供解析。

您可以通过本参数指定一个域名后缀，这样会使用 `{{ pg_cluster }}{{ pg_dns_suffix }}` 作为集群 DNS 名称。

例如，如果您将 `pg_dns_suffix` 设置为 `.db.vip.company.tld`，那么 `pg-test` 的集群 DNS 名称将是 `pg-test.db.vip.company.tld`

------

### `pg_dns_target`

参数名称： `pg_dns_target`， 类型： `enum`， 层次：`C`

可以是：`auto`、`primary`、`vip`、`none`或一个特定的IP地址，它将是集群DNS记录的解析目标IP地址。

默认值： `auto`，如果`pg_vip_enabled`，将绑定到`pg_vip_address`，否则会回退到集群主实例的 IP 地址。

- `vip`：绑定到`pg_vip_address`
- `primary`：解析为集群主实例IP地址
- `auto`：如果 [`pg_vip_enabled`](#pg_vip_enabled)，解析为 [`pg_vip_address`](#pg_vip_address)，或回退到集群主实例ip地址。
- `none`：不绑定到任何ip地址
- `<ipv4>`：绑定到指定的IP地址

------

## `PG_EXPORTER`

PG Exporter 用于监控 PostgreSQL 数据库与 Pgbouncer 连接池的状态。

```yaml
pg_exporter_enabled: true              # 在 pgsql 主机上启用 pg_exporter 吗？
pg_exporter_config: pg_exporter.yml    # pg_exporter 配置文件名
pg_exporter_cache_ttls: '1,10,60,300'  # pg_exporter 收集器 ttl 阶段（秒），默认为 '1,10,60,300'
pg_exporter_port: 9630                 # pg_exporter 监听端口，默认为 9630
pg_exporter_params: 'sslmode=disable'  # pg_exporter dsn 的额外 url 参数
pg_exporter_url: ''                    # 如果指定，将覆盖自动生成的 pg dsn
pg_exporter_auto_discovery: true       # 启用自动数据库发现？默认启用
pg_exporter_exclude_database: 'template0,template1,postgres' # 在自动发现过程中不会被监控的数据库的 csv 列表
pg_exporter_include_database: ''       # 在自动发现过程中将被监控的数据库的 csv 列表
pg_exporter_connect_timeout: 200       # pg_exporter 连接超时（毫秒），默认为 200
pg_exporter_options: ''                # 覆盖 pg_exporter 的额外选项
pgbouncer_exporter_enabled: true       # 在 pgsql 主机上启用 pgbouncer_exporter 吗？
pgbouncer_exporter_port: 9631          # pgbouncer_exporter 监听端口，默认为 9631
pgbouncer_exporter_url: ''             # 如果指定，将覆盖自动生成的 pgbouncer dsn
pgbouncer_exporter_options: ''         # 覆盖 pgbouncer_exporter 的额外选项
pgbackrest_exporter_enabled: true      # 在 pgsql 主机上启用 pgbackrest_exporter 吗？
pgbackrest_exporter_port: 9854         # pgbackrest_exporter 监听端口，默认为 9854
pgbackrest_exporter_options: ''        # 覆盖 pgbackrest_exporter 的额外选项
```

------

### `pg_exporter_enabled`

参数名称： `pg_exporter_enabled`， 类型： `bool`， 层次：`C`

是否在 PGSQL 节点上启用 pg_exporter？默认值为：`true`。

PG Exporter 用于监控 PostgreSQL 数据库实例，如果不想安装 pg_exporter 可以设置为 `false`。

------

### `pg_exporter_config`

参数名称： `pg_exporter_config`， 类型： `string`， 层次：`C`

pg_exporter 配置文件名，PG Exporter 和 PGBouncer Exporter 都会使用这个配置文件。默认值：`pg_exporter.yml`。

如果你想使用自定义配置文件，你可以在这里定义它。你的自定义配置文件应当放置于 `files/<name>.yml`。

例如，当您希望监控一个远程的 PolarDB 数据库实例时，可以使用样例配置：`files/polar_exporter.yml`。

------

### `pg_exporter_cache_ttls`

参数名称： `pg_exporter_cache_ttls`， 类型： `string`， 层次：`C`

pg_exporter 收集器 TTL 阶梯（秒），默认为 `1,10,60,300`

默认值：`1,10,60,300`，它将为不同的度量收集器使用不同的TTL值： 1s, 10s, 60s, 300s。

PG Exporter 内置了缓存机制，避免多个 Prometheus 重复抓取对数据库产生不当影响，所有指标收集器按 TTL 分为四类：

```yaml
ttl_fast: "{{ pg_exporter_cache_ttls.split(',')[0]|int }}"         # critical queries
ttl_norm: "{{ pg_exporter_cache_ttls.split(',')[1]|int }}"         # common queries
ttl_slow: "{{ pg_exporter_cache_ttls.split(',')[2]|int }}"         # slow queries (e.g table size)
ttl_slowest: "{{ pg_exporter_cache_ttls.split(',')[3]|int }}"      # ver slow queries (e.g bloat)
```

例如，在默认配置下，存活类指标默认最多缓存 `1s`，大部分普通指标会缓存 `10s`（应当与 [`prometheus_scrape_interval`](/zh/docs/infra/param#prometheus_scrape_interval) 相同）。
少量变化缓慢的查询会有 `60s` 的TTL，极个别大开销监控查询会有 `300s` 的TTL。

------

### `pg_exporter_port`

参数名称： `pg_exporter_port`， 类型： `port`， 层次：`C`

pg_exporter 监听端口号，默认值为：`9631`

------

### `pg_exporter_params`

参数名称： `pg_exporter_params`， 类型： `string`， 层次：`C`

pg_exporter 所使用 DSN 中额外的 URL PATH 参数。

默认值：`sslmode=disable`，它将禁用用于监控连接的 SSL（因为默认使用本地 unix 套接字）。

------

### `pg_exporter_url`

参数名称： `pg_exporter_url`， 类型： `pgurl`， 层次：`C`

如果指定了本参数，将会覆盖自动生成的 PostgreSQL DSN，使用指定的 DSN 连接 PostgreSQL 。默认值为空字符串。

如果没有指定此参数，PG Exporter 默认会使用以下的连接串访问 PostgreSQL ：

```bash
postgres://{{ pg_monitor_username }}:{{ pg_monitor_password }}@{{ pg_host }}:{{ pg_port }}/postgres{% if pg_exporter_params != '' %}?{{ pg_exporter_params }}{% endif %}
```

当您想监控一个远程的 PostgreSQL 实例时，或者需要使用不同的监控用户/密码，配置选项时，可以使用这个参数。

------

### `pg_exporter_auto_discovery`

参数名称： `pg_exporter_auto_discovery`， 类型： `bool`， 层次：`C`

启用自动数据库发现吗？ 默认启用：`true`。

PG Exporter 默认会连接到 DSN 中指定的数据库 （默认为管理数据库 `postgres`） 收集全局指标，如果您希望收集所有业务数据库的指标，可以开启此选项。 PG Exporter 会自动发现目标 PostgreSQL 实例中的所有数据库，并在这些数据库中收集 **库级监控指标**。

------

### `pg_exporter_exclude_database`

参数名称： `pg_exporter_exclude_database`， 类型： `string`， 层次：`C`

如果启用了数据库自动发现（默认启用），在这个参数指定的列表中的数据库将不会被监控。 默认值为： `template0,template1,postgres`，即管理数据库 `postgres` 与模板数据库会被排除在自动监控的数据库之外。

作为例外，DSN 中指定的数据库不受此参数影响，例如，PG Exporter 如果连接的是 `postgres` 数据库，那么即使 `postgres` 在此列表中，也会被监控。

------

### `pg_exporter_include_database`

参数名称： `pg_exporter_include_database`， 类型： `string`， 层次：`C`

如果启用了数据库自动发现（默认启用），在这个参数指定的列表中的数据库才会被监控。默认值为空字符串，即不启用此功能。

参数的形式是由逗号分隔的数据库名称列表，例如：`db1,db2,db3`。

此参数相对于 [`pg_exporter_exclude_database`](#pg_exporter_exclude_database) 有更高的优先级，相当于白名单模式。如果您只希望监控特定的数据库，可以使用此参数。


------

### `pg_exporter_connect_timeout`

参数名称： `pg_exporter_connect_timeout`， 类型： `int`， 层次：`C`

pg_exporter 连接超时（毫秒），默认为 `200` （单位毫秒）

当 PG Exporter 尝试连接到 PostgreSQL 数据库时，最多会等待多长时间？超过这个时间，PG Exporter 将会放弃连接并报错。

默认值 200毫秒 对于绝大多数场景（例如：同可用区监控）都是足够的，但是如果您监控的远程 PostgreSQL 位于另一个大洲，您可能需要增加此值以避免连接超时。

------

### `pg_exporter_options`

参数名称： `pg_exporter_options`， 类型： `arg`， 层次：`C`

传给 PG Exporter 的命令行参数，默认值为：`""` 空字符串。

当使用空字符串时，会使用默认的命令参数：

```bash
{% if pg_exporter_port != '' %}
PG_EXPORTER_OPTS='--web.listen-address=:{{ pg_exporter_port }} {{ pg_exporter_options }}'
{% else %}
PG_EXPORTER_OPTS='--web.listen-address=:{{ pg_exporter_port }} --log.level=info'
{% endif %}
```

注意，请不要在本参数中覆盖 [`pg_exporter_port`](#pg_exporter_port) 的端口配置。

------

### `pgbouncer_exporter_enabled`

参数名称： `pgbouncer_exporter_enabled`， 类型： `bool`， 层次：`C`

在 PGSQL 节点上，是否启用 pgbouncer_exporter ？默认值为：`true`。



------

### `pgbouncer_exporter_port`

参数名称： `pgbouncer_exporter_port`， 类型： `port`， 层次：`C`

pgbouncer_exporter 监听端口号，默认值为：`9631`

------

### `pgbouncer_exporter_url`

参数名称： `pgbouncer_exporter_url`， 类型： `pgurl`， 层次：`C`

如果指定了本参数，将会覆盖自动生成的 pgbouncer DSN，使用指定的 DSN 连接 pgbouncer。默认值为空字符串。

如果没有指定此参数，Pgbouncer Exporter 默认会使用以下的连接串访问 Pgbouncer：

```bash
postgres://{{ pg_monitor_username }}:{{ pg_monitor_password }}@:{{ pgbouncer_port }}/pgbouncer?host={{ pg_localhost }}&sslmode=disable
```

当您想监控一个远程的 Pgbouncer 实例时，或者需要使用不同的监控用户/密码，配置选项时，可以使用这个参数。

------

### `pgbouncer_exporter_options`

参数名称： `pgbouncer_exporter_options`， 类型： `arg`， 层次：`C`

传给 Pgbouncer Exporter 的命令行参数，默认值为：`""` 空字符串。

当使用空字符串时，会使用默认的命令参数：

```bash
{% if pgbouncer_exporter_options != '' %}
PG_EXPORTER_OPTS='--web.listen-address=:{{ pgbouncer_exporter_port }} {{ pgbouncer_exporter_options }}'
{% else %}
PG_EXPORTER_OPTS='--web.listen-address=:{{ pgbouncer_exporter_port }} --log.level=info'
{% endif %}
```

注意，请不要在本参数中覆盖 [`pgbouncer_exporter_port`](#pgbouncer_exporter_port) 的端口配置。

------

### `pgbackrest_exporter_enabled`

参数名称： `pgbackrest_exporter_enabled`， 类型： `bool`， 层次：`C`

在 PGSQL 节点上，是否启用 pgbackrest_exporter ？默认值为：`true`。

如果 [`pgbackrest_enabled`](#pgbackrest_enabled) 为 `false`，则本参数因短路无效。

------

### `pgbackrest_exporter_port`

参数名称： `pgbackrest_exporter_port`， 类型： `port`， 层次：`C`

pgbackrest_exporter 监听端口号，默认值为：`9854`

------

### `pgbackrest_exporter_options`

参数名称： `pgbackrest_exporter_options`， 类型： `arg`， 层次：`C`

传给 Pgbouncer Exporter 的命令行参数，默认值为：`""` 空字符串。



------

## `PG_REMOVE`

这些参数控制 [`pgsql-rm.yml`](/zh/docs/pgsql/playbook/#pgsql-rmyml)，并与
v3.7.0 的 `roles/pg_remove/defaults/main.yml` 保持一致。

```yaml
pg_safeguard: false               # 显式启用时中止删除
pg_rm_data: true                  # 删除 PostgreSQL 数据
pg_rm_backup: true                # 删除主实例的 pgBackRest 备份
pg_rm_pkg: true                   # 卸载 PostgreSQL 软件包
```

------

### `pg_safeguard`

参数名称：`pg_safeguard`，类型：`bool`，层级：`G/C/A`

设为 `true` 时，`pgsql-rm.yml` 会在修改集群前中止。v3.7.0 默认值为 `false`。

------

### `pg_rm_data`

参数名称：`pg_rm_data`，类型：`bool`，层级：`G/C/A`

删除 PostgreSQL 数据，默认值为 `true`；设为 `false` 可保留数据目录。

------

### `pg_rm_backup`

参数名称：`pg_rm_backup`，类型：`bool`，层级：`G/C/A`

删除主实例时一并删除 pgBackRest 备份仓库，默认值为 `true`；设为 `false`
可保留备份。

------

### `pg_rm_pkg`

参数名称：`pg_rm_pkg`，类型：`bool`，层级：`G/C/A`

删除时卸载 PostgreSQL 与扩展软件包。v3.7.0 角色默认值为 `true`；设为
`false` 可保留已安装的软件包。
