跳转到主要内容

这是本节的多页打印视图。 .

返回本页常规视图.

配置

使用配置描述您的环境

Pigsty 将基础设施和数据库视为代码。 您可以使用声明式配置 清单 描述一切。 通常是 YAML 格式的 Ansible 清单pigsty.yml。 但 CMDB 也可以用作动态清单。

configure 过程将根据您的环境和输入生成配置。 但这是 可选的:您始终可以直接编辑 pigsty.yml 文件,如 教程 所示。 并且有大量的 模板 供您参考。

清单
    Pigsty 的主配置文件,描述您的整个部署
配置
    根据您的输入和环境生成配置文件
教程
    根据业务需求规划您的部署
模板
    可用的配置模板和示例
安全
    生产部署的安全考虑和最佳实践
CMDB
    使用 PostgreSQL 作为 CMDB 而不是本地 YAML 配置文件

PGSQL
    具有 HA、PITR、IaC、ACL、监控、连接池的 PostgreSQL 集群
INFRA
    用于可观测性的 Nginx、仓库、DNS、NTP、Prometheus 和 Grafana 技术栈
NODE
    将节点注册到期望状态并监控它,以及 VIP、HAProxy
ETCD
    可靠的分布式共识存储 (DCS),为 PGSQL HA 提供支持
MINIO
    兼容 S3 的对象存储,可选备份存储
REDIS
    高性能内存缓存,可选数据结构服务器

1 - 清单

Pigsty 的主配置文件

每个 pigsty 部署都有一个对应的配置 清单。 它可以存储在 YAML 格式的本地配置文件中,或从 CMDB 或任何 ansible 兼容格式动态生成。 Pigsty 默认使用一个单一的 YAML 配置文件,即 pigsty.yml位于 pigsty 主目录中。

configure 脚本将根据您的环境和输入生成具有良好默认值的 pigsty.yml 文件脚手架, 但它是 可选的:您始终可以直接编辑 pigsty.yml 文件,如教程所示。


结构

清单由两部分组成:全局变量 和多个 。您可以在 all.children 中定义新集群。 并使用全局变量描述基础设施:all.vars。它可能看起来像这样:

all:                  # 顶级对象:all
  vars: {...}         # 全局参数
  children:           # 组定义
    infra:            # 组定义:'infra'
      hosts: {...}        # 组成员:'infra'
      vars:  {...}        # 组参数:'infra'
    etcd:    {...}    # 组定义:'etcd'
    pg-meta: {...}    # 组定义:'pg-meta'
    pg-test: {...}    # 组定义:'pg-test'
    redis-test: {...} # 组定义:'redis-test'
    # ...

conf/ 下有大量示例,在 configure 期间也可以用作模板。


集群

每个 ansible 组可能代表一个集群,可以是节点集群、PostgreSQL 集群、Redis 集群、Etcd 集群或 Minio 集群等…

集群定义由两部分组成:hostsvars。 您可以在 <cls>.hosts 中定义集群成员,并在 <cls>.vars 中使用参数描述集群。 这是一个 3 节点 HA PG 集群的示例:

all:
  children:    # 所有组
    pg-test:   # 组名
      hosts:   # 组主机(集群成员)
        10.10.10.11: { pg_seq: 1, pg_role: primary } # 主机 1
        10.10.10.12: { pg_seq: 2, pg_role: replica } # 主机 2
        10.10.10.13: { pg_seq: 3, pg_role: offline } # 主机 3
      vars:    # 组变量(集群参数)
        pg_cluster: pg-test

集群级别的 vars 将覆盖全局变量,主机级别的 vars 将覆盖集群变量和全局变量。


参数

参数是定义部署中所有实体的键值对。 键是字符串名称,值可以是五种类型之一:布尔值、字符串、数字、数组或对象。

参数可以在不同级别设置,具有以下优先级:

级别 位置 描述 优先级
CLI 参数 命令行 通过 -e CLI 参数 最高 (5)
主机变量 <group>.hosts.<host> 特定于单个主机的参数 高 (4)
组变量 <group>.vars 组/集群中主机共享的参数 中等 (3)
全局变量 all.vars 所有主机共享的参数 低 (2)
默认值 <roles>/default/main.yml 角色实现默认值 最低 (1)

以下是关于参数优先级的一些示例:

  • 使用 Playbook CLI 参数 -e pg_version=16 覆盖 PostgreSQL 主版本
  • 使用主机变量上的实例级别参数 pg_role 覆盖 pg 实例角色
  • 使用组变量上的集群级别参数 pg_cluster 覆盖 pg 集群名称。
  • 使用全局变量上的全局参数 node_ntp_servers 指定全局 NTP 服务器
  • 如果没有设置 pg_version,pigsty 将使用角色实现的默认值(默认为 18

除了强制性的 身份参数 外,每个参数都有一个适当的默认值;它们用作标识符,必须明确设置。 例如上述片段中的 pg_clusterpg_rolepg_seq

可用参数根据模块而异:


参考

Pigsty 有 290+ 个参数,查看模块参数了解详细信息。

模块 部分 描述 数量
INFRA META Pigsty 元数据 4
INFRA CA 自签名 CA 3
INFRA INFRA_ID 基础设施门户和身份 2
INFRA REPO 本地软件仓库 9
INFRA INFRA_PACKAGE 基础设施包 2
INFRA NGINX Nginx Web 服务器 7
INFRA DNS DNSMASQ 名称服务器 3
INFRA PROMETHEUS Prometheus 堆栈 18
INFRA GRAFANA Grafana 堆栈 6
INFRA LOKI Loki 日志服务 4
NODE NODE_ID 节点身份参数 5
NODE NODE_DNS 节点域名和解析器 6
NODE NODE_PACKAGE 节点仓库和包 5
NODE NODE_TUNE 节点调优和内核功能 10
NODE NODE_ADMIN 管理员用户和凭据 7
NODE NODE_TIME 节点时区、NTP、Crontabs 5
NODE NODE_VIP 节点 Keepalived L2 VIP 8
NODE HAPROXY HAProxy 负载均衡器 10
NODE NODE_EXPORTER 节点监控代理 3
NODE PROMTAIL Promtail 日志代理 4
DOCKER DOCKER Docker 守护进程 4
ETCD ETCD ETCD DCS 集群 10
MINIO MINIO MINIO S3 对象存储 15
REDIS REDIS Redis 键值 NoSQL 缓存 20
PGSQL PG_ID PG 身份参数 11
PGSQL PG_BUSINESS PG 业务对象定义 12
PGSQL PG_INSTALL 安装 PG 包和扩展 10
PGSQL PG_BOOTSTRAP 使用 Patroni 初始化 HA PG 集群 35
PGSQL PG_PROVISION 创建数据库内对象 9
PGSQL PG_BACKUP 使用 pgBackRest 设置备份仓库 5
PGSQL PG_ACCESS 暴露服务、绑定 VIP、DNS 16
PGSQL PG_MONITOR 收集 Postgres 的指标和日志 18
PGSQL PG_EXPORTER 移除 Postgres 集群 4

2 - 配置

如何配置 pigsty 清单文件?

configure 脚本将根据您的环境和输入生成具有良好默认值的 pigsty.yml 配置文件清单。 它是 可选的,您可以直接编辑 pigsty.yml,如教程所示。


用法

除非指定了 -n|--non-interactive,否则 configure 脚本是一个交互式向导。

~/pigsty/configure
./configure
    [-c|--conf <confname>   # [meta|dual|trio|full|app/supa|...]
    [-i|--ip <ip>]          # 主 IP 地址(使用 -s 跳过)
    [-v|--version <pgver>   # [18|17|16|15|14|13]
    [-r|--region <region>   # [default|china|europe]
    [-o|--output <file>]    # 输出配置文件(默认为 pigsty.yml)
    [-s|--skip]             # 跳过 IP 地址探测
    [-x|--proxy]            # 从环境变量写入代理环境
    [-n|--non-interactive]  # 非交互模式
    [-p|--port <port>]      # 指定 SSH 端口(仅在设置时使用)
选项 描述
-c|--conf 根据此参数从配置模板生成配置
-i|--ip 用给定 IP 替换 IP 地址占位符 10.10.10.10
-v|--version 指定 PostgreSQL 主版本号(13|14|15|16|17|18
-r|--region 根据 region 设置上游仓库镜像(default|china|europe
-o|--output 将生成的配置清单写入指定文件(默认为 pigsty.yml
-x|--proxy 将当前代理环境写入配置 proxy_env
-s|--skip 跳过交互式向导并使用默认/参数值
-n|--non-interactive 非交互模式
-p|--port 指定 SSH 端口(仅在设置时使用)

示例

./configure                # 如果只有一个 IP 地址,否则会要求您输入
./configure -i 10.11.12.13 # 明确告诉主 IP 地址
./configure -c rich -v 16  # 使用 conf/rich.yml 作为模板,使用 PG 16 和所有扩展
./configure -c app/supa    # 使用 app/supa 模板,运行自托管 supabase
./configure -c mssql       # 使用 babelfish 模板,运行 MSSQL 兼容的 PG 内核分支
./configure -c full -s     # 使用 4 节点沙箱配置模板,不进行 IP 替换和探测
./configure -r china       # 使用中国镜像而不是默认仓库

configure 输出示例:

./configure
[vagrant@node-1 pigsty]$ ./configure
configure pigsty v3.7.0 begin
[ OK ] region = china
[ OK ] kernel  = Linux
[ OK ] machine = x86_64
[ OK ] package = rpm,dnf
[ OK ] vendor  = rocky (Rocky Linux)
[ OK ] version = 9 (9.6)
[ OK ] sudo = vagrant ok
[ OK ] ssh = [email protected] ok
[WARN] Multiple IP address candidates found:
    (1) 192.168.121.193	    inet 192.168.121.193/24 brd 192.168.121.255 scope global dynamic noprefixroute eth0
    (2) 10.10.10.11	    inet 10.10.10.11/24 brd 10.10.10.255 scope global noprefixroute eth1
[ IN ] INPUT primary_ip address (of current meta node, e.g 10.10.10.10):
=> 10.10.10.11
[ OK ] primary_ip = 10.10.10.11 (from input)
[ OK ] admin = [email protected] ok
[ OK ] mode = meta (el9)
[ OK ] locale  = C.UTF-8
[ OK ] configure pigsty done
proceed with ./install.yml

行为

配置模板

如果指定了 -c|--conf <template>,它将从指定的模板生成配置文件。例如 metaapp/supa 等… 如果没有给出配置模板,它将使用默认的单节点配置模板 meta

IP 地址

如果指定了 -i|--ip <ipaddr>,它将用给定的 IP 地址替换配置模板中的占位符 10.10.10.10。 否则,如果当前节点只有一个 IP 地址,将使用该地址。如果有多个 IP 地址,它会要求您手动输入当前节点的主 IP 地址。

PostgreSQL 版本

如果指定了 -v|--version,它将使用指定的 PostgreSQL 主版本号,范围从 1318。 如果没有指定版本,它会保持 pg_version 不变,通常默认回退到 18

区域

如果指定了 -r|--region,它将直接使用指定的区域。在无法访问 Google 服务的地方将使用 china 镜像。

代理环境

如果指定了 -x|--proxy,它将把当前代理环境变量写入配置 proxy_env。 在安装期间将被重用。包括:HTTP_PROXYHTTPS_PROXYALL_PROXYNO_PROXY

跳过模式

如果指定了 -s|--skip,它将跳过 IP 地址替换和 ssh sudo 权限检查

非交互模式

如果指定了 -n|--non-interactive,此脚本不会询问您任何事情,但您必须使用 -i|--ip <ipaddr> 明确指定主 IP 地址。

SSH 端口

如果指定了 -p|--port,它将使用指定的 SSH 端口而不是默认的 22。 当您的本地 SSH 端口不是 22 时使用。

低端硬件优化

如果当前节点 CPU 核心数 ≤ 4,它将对 pg_confnode_tune 使用 tiny 模式以优化低端硬件。

区域设置

Pigsty 将使用 C.UTF-8 作为默认区域设置,如果:

  • PostgreSQL 主版本 ≥ 17,具有内置本地提供程序(默认)
  • 或者,您的系统支持 C.utf8 / C.utf-8 区域设置(locale -a

否则,默认将使用本地 C

3 - 教程

从零开始打造复杂配置

您可以手动从零开始编写 pigsty 配置文件,而不是使用 configure 生成配置。

这里是一个教程,帮助您从零开始构建复杂的配置文件清单


最小配置

这是一个最小的工作配置示例,您必须告诉 pigsty 管理节点和基础设施节点的 IP。

~/pigsty/pigsty.yml
all:
  children: {infra: {hosts: {10.10.10.10: { infra_seq: 1 }}}}
  vars: { admin_ip: 10.10.10.10 }

这将在 10.10.10.10(更改为您的 IP 地址)上安装 INFRANODE 模块。

~/pigsty
./install.yml

您将拥有一个完整的可观测性堆栈和节点监控。但数据库服务尚未运行。


PGSQL & ETCD

要提供 PostgreSQL 服务,您必须定义其他组并安装 PGSQLETCD 模块。

~/pigsty/pigsty.yml
all:
  children:
    infra:   { hosts: { 10.10.10.10: { infra_seq: 1 } } }
    etcd:    { hosts: { 10.10.10.10: { etcd_seq: 1 } }, vars: { etcd_cluster: etcd } }
    pg-meta: { hosts: { 10.10.10.10: { pg_seq: 1, pg_role: primary } }, vars: { pg_cluster: pg-meta } }
  vars:
    admin_ip: 10.10.10.10

我们在这里添加了两个新组:etcdpg-meta,它们定义了一个 1 节点 ETCD 集群和一个 1 节点 PGSQL 集群。 使用 ./install.yml 重新创建所有内容,或使用这些命令进行增量步骤:

~/pigsty
./etcd.yml  -l etcd      # 在 etcd 组上安装 etcd 模块
./pgsql.yml -l pg-meta   # 在 pg-meta 组上安装 pgsql 模块

PGSQL 模块依赖 ETCD 进行 HA 共识,因此请确保首先安装 ETCD 模块。


数据库和用户

现在我们要自定义我们的 postgres 数据库集群,包括用户、数据库和备份:

~/pigsty/pigsty.yml
all:
  children:
    infra:   { hosts: { 10.10.10.10: { infra_seq: 1 } } }
    etcd:    { hosts: { 10.10.10.10: { etcd_seq: 1 } }, vars: { etcd_cluster: etcd } }
    pg-meta:
      hosts: { 10.10.10.10: { pg_seq: 1, pg_role: primary } }
      vars:
        pg_cluster: pg-meta
        pg_users:
          - { name: dbuser_meta ,password: DBUser.Meta ,pgbouncer: true ,roles: [dbrole_admin] ,comment: admin user}
        pg_databases:
          - { name: meta ,baseline: cmdb.sql ,comment: pigsty meta database ,schemas: [pigsty] ,extensions: [vector]}
        node_crontab:
          - '00 01 * * * postgres /pg/bin/pg-backup full'
  vars:
    admin_ip: 10.10.10.10

我们在 pg-meta 集群级别定义一些额外的详细信息:

  • pg_users:定义一个新用户 dbuser_meta,密码为 DBUser.Meta
  • pg_databases:定义一个新数据库 meta,包含 pigsty CMDB 模式和 vector 扩展
  • node_crontab:定义在每天凌晨 1 点进行完整备份的 crontab

我们不使用 ./install.yml 重新创建所有内容,而是增量地进行更改:

~/pigsty
bin/pgsql-user pg-meta dbuser_meta      # 在 pg-meta 上创建用户 dbuser_meta
bin/pgsql-db   pg-meta meta             # 在 pg-meta 上创建数据库 meta
./node.yml -l pg-meta -t node_crontab   # 在 pg-meta 上将备份任务添加到 crontab

PG 版本和扩展

您可以安装不同的 PostgreSQL 主版本,以及 437 相应的扩展。

让我们安装 PostgreSQL 16(而不是默认的 18),包含 timescaledbpostgispgvector 扩展。

~/pigsty/pigsty.yml
all:
  children:
    infra:   { hosts: { 10.10.10.10: { infra_seq: 1 } } }
    etcd:    { hosts: { 10.10.10.10: { etcd_seq: 1 } }, vars: { etcd_cluster: etcd } }
    pg-meta:
      hosts: { 10.10.10.10: { pg_seq: 1, pg_role: primary } }
      vars:
        pg_cluster: pg-meta
        pg_users:
          - name: dbuser_meta
            password: DBUser.Meta
            pgbouncer: true
            roles: [dbrole_admin]
            comment: pigsty admin user
        pg_databases:
          - name: meta
            baseline: cmdb.sql
            comment: pigsty meta database
            schemas: [pigsty]
            extensions: [ vector, postgis, timescaledb ]           # <--- 创建扩展
        pg_libs: 'timescaledb, pg_stat_statements, auto_explain'   # <--- 加载扩展
        node_crontab:
          - '00 01 * * * postgres /pg/bin/pg-backup full'
  vars:
    admin_ip: 10.10.10.10
    region: default # 使用本地镜像以获得更快的下载速度   # <--- default|china|europe
    repo_extra_packages: [ timescaledb, postgis, pgvector, pgsql ] # <--- 下载扩展
    pg_extensions:       [ timescaledb, postgis, pgvector ]        # <--- 安装扩展
    pg_version: 16   # PG 17 是默认的最新主版本   # <--- 使用 PG 16 版本
  • repo_extra_packages:下载 timescaledbpostgis 扩展。
  • pg_libs:预加载 timescaledbpg_stat_statementsauto_explain 扩展。

让我们重新下载缺失的包(PG 16 内核和扩展),删除旧集群,并重新创建它:

make repo                   # 重新下载包
./pgsql-rm.yml -l pg-meta   # 删除旧的 pg-meta 集群(因为它是 PG18)
./pgsql.yml    -l pg-meta   # 使用 PG16 和扩展重新创建 pg-meta 集群

更多节点

我们可以向此部署添加 3 个更多节点。

bin/node-add pg-test

或者逐个添加它们:

bin/node-add 10.10.10.11
bin/node-add 10.10.10.12
bin/node-add 10.10.10.13

PGSQL HA

现在我们要添加一个新的数据库集群 pg-test,具有 3 节点 HA 设置:

~/pigsty/pigsty.yml
all:
  children:
    infra:   { hosts: { 10.10.10.10: { infra_seq: 1 } } }
    etcd:    { hosts: { 10.10.10.10: { etcd_seq: 1 } }, vars: { etcd_cluster: etcd } }
    pg-meta: { hosts: { 10.10.10.10: { pg_seq: 1, pg_role: primary } }, vars: { pg_cluster: pg-meta } }
    pg-test:
      hosts:
        10.10.10.11: { pg_seq: 1, pg_role: primary }
        10.10.10.12: { pg_seq: 2, pg_role: replica  }
        10.10.10.13: { pg_seq: 3, pg_role: replica  }
      vars: { pg_cluster: pg-test }
  vars:
    admin_ip: 10.10.10.10

Pigsty 的工作假设是每个节点上只有一个 postgres 实例。 不支持在单个节点上运行多个 postgres 实例。


Redis 启动

Pigsty 有可选的 Redis 支持,用作 PostgreSQL 前面的缓存。

bin/redis-add redis-ms
bin/redis-add redis-meta
bin/redis-add redis-test

Redis HA 设置需要集群模式或哨兵基础设施,请查看 Redis 配置了解详情。


MinIO 启动

Pigsty 有可选的 MinIO 支持,用作 PostgreSQL 的备份存储。

./minio.yml -l minio

严肃的生产 MinIO 部署通常需要至少 4 个节点,每个节点有 4 个磁盘(4N/16D)


Docker 启动

infra 组上安装 docker:

./docker.yml -l infra

运行 PgAdmin

查看 App: Pgadmin 了解如何使用 Pigsty 运行 pgAdmin 的详细信息。简短版本:

./docker.yml -l infra
./app.yml    -l infra -e app=pgadmin

自托管 Supabase

查看 App: Supabase 了解如何使用 Pigsty 运行 Supabase 的详细信息。简短版本:

./configure -c app/supa
./install.yml
./docker.yml
./app.yml

4 - 模板

Pigsty 的配置模板

这个目录 conf 包含 pigsty 配置模板,将在 configure 过程中使用。

配置模板可以使用 ./configure -c <conf> 指定,其中 conf 是到 conf 目录的相对路径(有或没有 .yml 后缀)。 例如 ~/pigsty/conf/rich.yml 可以指定为 rich

./configure                     # 默认使用 meta.yml 配置模板
./configure -c meta             # 明确使用 meta.yml 1 节点模板
./configure -c rich             # 使用包含所有扩展和 minio 的 1 节点模板
./configure -c slim             # 使用最小的 1 节点模板
./configure -c supabase         # 使用 Supabase 自建模板
./configure -c app/dify         # 使用 dify 1 节点模板

如果没有给出 -c|--conf,默认会自动选择单节点 meta 配置模板。


基本模板

这里是单节点模板,提供不同的功能和配置。

模板 节点 描述
meta.yml 1 默认 1 节点配置,pgsql、infra、node、etcd,最小扩展
rich.yml 1 meta + minio + 所有扩展
slim.yml 1 meta - infra - node 监控,最小安装
fat.yml 1 下载PG13-18 所有包,安装全部扩展

异种内核

使用异种 Postgres 内核分支:

模板 节点 描述
mssql.yml 1 WiltonDB 和 Babelfish,具有 MSSQL 协议兼容性
polar.yml 1 PolarDB for PostgreSQL,具有 Aurora RAC 特性
ivory.yml 1 IvorySQL 集群,具有 Oracle 兼容性
mysql.yml 1 Halo 集群,具有 MySQL 协议兼容性
mongo.yml 1 FerretDB 和 DocumentDB,具有 Mongo 协议兼容性
oriole.yml 1 OrioleDB 集群,具有 OLTP 增强

多节点

模板 节点 描述
dual.yml 2 半高可用部署
trio.yml 3 标准高可用部署
full.yml 4 沙箱部署
safe.yml 4 带延迟副本的安全增强
simu.yml 36 生产模拟

应用程序

模板 描述
app/supa.yml 启动 1 节点 supabase
app/odoo.yml 启动 odoo ERP 系统
app/dify.yml 启动 dify AI 工作流系统
app/electric.yml 启动 electric 同步引擎应用

演示模板

模板 描述
demo/el.yml EL 8/9 系统的包含所有默认参数的配置文件
demo/debian.yml debian/ubuntu 系统的包含所有默认参数的配置文件
demo/remote.yml 监控远程 pgsql 集群或 RDS PG 的示例配置
demo/redis.yml redis 集群的示例配置
demo/minio.yml 3 节点 minio 集群的示例配置
demo/demo.yml pigsty 公共演示 的配置文件
citus.yml Citus 集群示例:1 个协调器和 3 个数据节点(4 节点)

构建模板

模板 描述
build/oss.yml EL 8、9、Debian 12 和 Ubuntu 22.04/24.04 OSS 的构建配置
build/pro.yml EL 7-9、Ubuntu、Debian pro 版本的构建配置

5 - 安全

安全考虑和最佳实践

Pigsty 已经提供了一个默认安全的数据库身份验证访问控制模型。

只要您遵循以下安全最佳实践,它对大多数常见场景来说都足够强大。


机密性

文件

保护您的 pigsty 配置文件
  • pigsty.yml 包含非常敏感的信息,如密码
  • 限制只有管理员/DBA 用户才能访问管理员/基础设施节点
  • 如果您使用 GitOps 管理 pigsty 配置,请限制对仓库的访问
保护您的 CA 私钥
  • 默认生成在 ~/pigsty/files/pki/ca/ca.key
  • 在安全的地方备份它,不要丢弃它!
  • 还要考虑保护各种证书的其他私钥

密码

不要使用默认密码

在严肃的部署中,始终更改这些默认密码

更改 MinIO 凭据和 pgbackrest 引用

如果您使用 MinIO 作为备份存储,还要更改这些凭据:

使用 passwordcheck 扩展强制使用强密码
  • $lib/passwordcheck 添加到 pg_libs 以强制执行密码策略。
  • 更强版本:passwordcheck_cracklib
使用加密算法加密远程备份
  • 检查 pgbackrest_repo 定义 repo_cipher_type
  • 默认为 cipher_type: aes-256-cbc
为 PostgreSQL 使用高级密码加密方法
  • 使用 pg_pwd_enc 默认 scram-sha-256 而不是传统的 md5
  • 默认行为是 scram-sha-256md5 已被弃用
为业务用户密码添加过期日期

为了合规目的,您可以为每个用户设置过期日期。

- { name: dbuser_meta , password: Pleas3-ChangeThisPwd ,expire_in: 7300 ,pgbouncer: true ,roles: [ dbrole_admin ]    ,comment: pigsty admin user }
- { name: dbuser_view , password: Make.3ure-Compl1ance  ,expire_in: 7300 ,pgbouncer: true ,roles: [ dbrole_readonly ] ,comment: read-only viewer for meta database }
- { name: postgres     ,superuser: true  ,expire_in: 7300                        ,comment: system superuser }
- { name: replicator ,replication: true  ,expire_in: 7300 ,roles: [pg_monitor, dbrole_readonly]   ,comment: system replicator }
- { name: dbuser_dba   ,superuser: true  ,expire_in: 7300 ,roles: [dbrole_admin]  ,pgbouncer: true ,pool_mode: session, pool_connlimit: 16 , comment: pgsql admin user }
- { name: dbuser_monitor ,roles: [pg_monitor] ,expire_in: 7300 ,pgbouncer: true ,parameters: {log_min_duration_statement: 1000 } ,pool_mode: session ,pool_connlimit: 8 ,comment: pgsql monitor user }

不要忘记使用 pgsql-user.yml playbook 定期刷新这些过期日期

不要将密码打印到日志
SET log_statement TO 'none';
ALTER USER "{{ user.name }}" PASSWORD '{{ user.password }}';
SET log_statement TO DEFAULT;

IP 地址

为 postgres/pgbouncer/patroni 绑定特定 IP 地址
  • 默认的 pg_listen 地址是 0.0.0.0,即所有 IPv4 地址。
  • 考虑使用 pg_listen: '${ip},${vip},${lo}' 绑定到特定地址以获得更好的安全性。
不要将任何端口暴露到互联网;除了 80/443,基础设施门户
  • Grafana/Prometheus 默认绑定到所有 IP 地址以便于使用。
  • 您可以修改它们的绑定配置,使其监听 localhost/内网 IP 并通过 Nginx 暴露。
  • Redis 服务器默认绑定到所有 IP 地址以便于使用。您可以更改 redis_bind_address 以监听内网 IP。
  • 您也可以通过安全组或防火墙规则来实现。
使用 HBA 限制 postgres 客户端访问
  • 有一个安全增强配置模板:safe.yml
限制从基础设施/管理节点访问 patroni 管理

网络流量

使用 SSL 和域名访问 Nginx
使用 SSL 保护 Patroni REST API
  • patroni_ssl_enabled 默认禁用
  • 因为它会影响健康检查和 API 调用。
  • 注意这是一个全局选项,您必须在部署前决定。
使用 SSL 保护 Pgbouncer 客户端流量

完整性

一致性

为 PostgreSQL 使用一致性优先模式
  • 使用 crit.yml 模板为 pg_conf 将牺牲一些可用性以获得最佳一致性。
使用节点关键调整模板以获得更好的一致性
  • node_tune 设置为 crit 以减少脏页比率。

  • 启用数据校验和以检测静默数据损坏。

  • pg_checksum 在 v3.7.0 中默认启用

  • 这可以稍后启用,但需要完整的集群扫描/停止。

审计

启用连接日志进行审计
  • 在 pg 集群引导后启用 log_connectionslog_disconnections
  • 审计传入会话;这在 crit.yml 中默认启用。

误操作

不要重新运行 install.yml playbook

再次运行 install.yml 将销毁(覆盖)整个部署!

谨慎重新运行 pgsql.yml

在 v3.5 之前,它默认会覆盖现有的 PostgreSQL。

使用 pg_safeguard 避免误操作


可用性

冗余

为严肃的生产部署使用足够的节点
  • 您需要至少三个节点(容忍一个节点故障)才能实现生产级高可用性。
  • 如果您只有两个节点,您可以容忍特定备用节点的故障。
  • 如果您有一个节点,请使用外部 S3/MinIO 进行冷备份和 wal 归档存储。
在严肃的生产部署中使用多个基础设施节点
  • 在严肃的生产部署中使用多个基础设施节点(例如,1~3)
  • 通常,2 ~ 3 对于大型生产部署来说是足够的。
使用足够的 etcd 成员并使用奇数
  • 使用足够的 etcd 成员并使用奇数(1,3,5,7)。
  • 查看 ETCD 配置 了解详情。

容错

为 PostgreSQL 在可用性和一致性之间进行权衡
  • pg_rpo可用性和一致性之间的权衡
  • pg_rto故障概率和影响之间的权衡

访问

使用 VIP、DNS、HAProxy 而不是固定 IP
  • 不要通过固定 IP 地址直接访问数据库;使用 VIP、DNS、HAProxy 或它们的组合。
  • Haproxy 将在故障转移/切换时为客户端处理流量控制。

6 - CMDB

使用 PostgreSQL 作为配置清单

Pigsty 允许您使用 数据库(CMDB) 作为动态配置源,而不是静态配置文件。 您可以使用内置的 PostgreSQL 作为配置清单进行配置管理。

使用 Postgres CMDB,配置被组织在结构化关系表中,可以使用 SQL 轻松查询和操作。 这允许与其他系统和工具更容易地集成。


工作原理

Ansible 允许您使用动态清单脚本来即时生成清单配置。

其想法是在 ansible.cfg 中用动态 shell 脚本 inventory.sh 替换静态 pigsty.yml

~/pigsty/ansible.cfg
---
inventory = pigsty.yml
+++
inventory = inventory.sh

inventory.sh 的内容非常简单,它将查询 PostgreSQL CMDB 并检索配置。

~/pigsty/inventory.sh
psql ${METADB_URL} -AXtwc 'SELECT text FROM pigsty.inventory;'
CMDB 实用脚本

CMDB 模式

CMDB 基线模式随 pigsty 一起提供:files/cmdb.sql 大多数默认配置模板都将其用作示例基线。这意味着默认情况下可以使用它。

all:
  children:
    pg-meta:
      hosts:
        10.10.10.10: { pg_seq: 1, pg_role: primary }
      vars:
        pg_cluster: pg-meta
        pg_databases:
          - name: meta
            baseline: cmdb.sql  # <--- 使用它作为数据库模式基线

加载配置数据

CMDB 默认为空,使用 bin/inventory_load 脚本将配置文件加载到 CMDB 中。

不带参数运行 bin/inventory_load 将加载默认的 pigsty.yml 到默认 CMDB 中。

usage: inventory_load [-h] [-p PATH] [-d CMDB_URL]

load config arguments

optional arguments:
  -h, --help            show this help message and exit
  -p PATH, --path PATH  config path, ${PIGSTY_HOME}/pigsty.yml by default
  -d DATA, --data DATA  postgres cmdb pgurl, ${METADB_URL} by default

使用 -p 指定配置文件路径,使用 -d 指定 CMDB URL。

bin/inventory_load
bin/inventory_load -p conf/demo.yml
bin/inventory_load -p conf/ha/full.yml -d postgresql://dbuser_meta:[email protected]:5432/meta

切换清单

您可以通过以下方式切换到动态 CMDB 清单:

bin/inventory_cmdb

这实际上将 ansible.cfg 中的 inventory 参数更改为使用 inventory.sh 脚本。