PIGSTY

剧本

Pigsty 提供的 Ansible 剧本

如何使用 Ansible playbook 管理 PostgreSQL 集群

Pigsty 有一系列 PostgreSQL playbook:


安全防护

如果您担心意外删除 PostgreSQL 集群,可以启用安全防护功能。

pg_safeguard 参数设置为 true 将阻止 pgsql-rm.yml 运行。

在 Pigsty v3.5 之前,pgsql.yml 可能会误删数据库,请谨慎使用!

Pigsty v3.5 从 pgsql.yml 中删除了 pg 清除逻辑, 所以现在删除 PostgreSQL 的唯一方法是运行 pgsql-rm.yml


pgsql.yml

pgsql.yml 用于初始化 HA PostgreSQL 集群或添加新副本。

asciicast

此 playbook 包含以下子任务

pg_install              : # 安装 postgres 包和扩展
  - pg_dbsu             : # 为 postgres dbsu 设置操作系统用户 sudo
    - pg_dbsu_create    : # 交换 dbsu ssh 密钥
    - pg_dbsu_sudo      : # 交换 dbsu ssh 密钥
    - pg_ssh            : # 交换 dbsu ssh 密钥
  - pg_pkg              : # 安装 postgres 包
    - pg_ext            : # 安装 postgres 扩展包
  - pg_link             : # 将 pgsql 版本 bin 链接到 /usr/pgsql
  - pg_path             : # 将 pgsql bin 添加到系统路径
  - pg_dir              : # 创建 postgres 目录并设置 fhs
  - pg_bin              : # 同步 /pg/bin 脚本
  - pg_alias            : # 写入 pgsql/psql 别名
  - pg_dummy            : # 创建虚拟占位符文件
pg_bootstrap            : # 引导 postgres 集群
  - pg_config           : # 生成 postgres 配置
    - pg_conf           : # 生成 patroni 配置
    - pg_key            : # 生成 pgsodium 密钥
  - pg_cert             : # 为 postgres 颁发证书
    - pg_cert_private   : # 检查 pg 私钥是否存在
    - pg_cert_issue     : # 签署 pg 服务器证书
    - pg_cert_copy      : # 将密钥和证书复制到 pg 节点
  - pg_launch           : # 启动 patroni 主实例和副本(patroni)
    - pg_watchdog       : # 为 postgres 授予看门狗权限
    - pg_primary        : # 启动 patroni/postgres 主实例
    - pg_init           : # 使用角色/模板初始化 pg 集群
    - pg_pass           : # 将 .pgpass 文件写入 pg 主目录
    - pg_replica        : # 启动 patroni/postgres 副本
    - pg_hba            : # 生成 pg HBA 规则
    - patroni_reload    : # 重新加载 patroni 配置
    - pg_patroni        : # 如有必要暂停或删除 patroni
pg_provision            : # 置备 postgres 业务用户和数据库
 - pg_user              : # 置备 postgres 业务用户
    - pg_user_config    : # 渲染创建用户 sql
    - pg_user_create    : # 在 postgres 上创建用户
 - pg_db                : # 置备 postgres 业务数据库
    - pg_db_config      : # 渲染创建数据库 sql
    - pg_db_create      : # 在 postgres 上创建数据库
pg_backup               : # 初始化 postgres PITR 备份
  - pgbackrest          : # 为备份设置 pgbackrest
    - pgbackrest_config : # 生成 pgbackrest 配置
    - pgbackrest_init   : # 初始化 pgbackrest 仓库
    - pgbackrest_backup : # 引导后进行初始备份
pg_access               : # 初始化 postgres 服务访问、池、dns、vip、svc
 - pgbouncer            : # 部署 pgbouncer sidecar 与 postgres
   - pgbouncer_dir      : # 创建 pgbouncer 目录
   - pgbouncer_config   : # 生成 pgbouncer 配置
     -  pgbouncer_hba   : # 生成 pgbouncer hba 配置
     -  pgbouncer_user  : # 生成 pgbouncer 用户列表
   -  pgbouncer_launch  : # 启动 pgbouncer 池化服务
   -  pgbouncer_reload  : # 重新加载 pgbouncer 配置
 - pg_vip               : # 使用 vip-manager 将 vip 绑定到 pgsql 主实例
   - pg_vip_config      : # 生成 vip-manager 配置
   - pg_vip_launch      : # 启动 vip-manager 以绑定 vip
 - pg_dns               : # 将 dns 名称注册到基础设施 dnsmasq
   - pg_dns_ins         : # 注册 pg 实例名称
   - pg_dns_cls         : # 注册 pg 集群名称
 - pg_service           : # 使用 haproxy 暴露 pgsql 服务
   - pg_service_config  : # 生成 pg 服务的本地 haproxy 配置
   - pg_service_reload  : # 使用 haproxy 暴露 postgres 服务
pg_monitor              : # 设置 pgsql 监控并注册到基础设施
  - pg_exporter         : # 配置和启动 pg_exporter
  - pgbouncer_exporter  : # 配置和启动 pgbouncer_exporter
  - pgbackrest_exporter : # 配置和启动 pgbackrest_exporter
  - register_prometheus : # 将 pg 注册为 prometheus 监控目标
  - register_grafana    : # 将 pg 数据库注册为 grafana 数据源

使用此 playbook 的管理任务

先初始化主实例再初始化副本

  • 副本初始化后,您可能需要运行重新加载 HBA 规则追加副本
  • 包装脚本 pgsql-add 会执行此操作,详情请查看 SOP:添加实例
  • 如果您在整个集群上运行此操作,则无需担心此问题。

在备用集群之前初始化上游集群

  • 如果您正在初始化备用集群,您应该确保上游集群已经初始化。

pgsql-rm.yml

playbook pgsql-rm.yml 可以删除 PostgreSQL 集群,或从集群中删除特定副本。

asciicast

此 playbook 包含以下子任务

pg_monitor               : # 删除 prometheus、grafana、nginx 中的注册
  - prometheus           : # 从 prometheus 中删除监控目标
  - grafana              : # 从 grafana 中删除数据源
  - pg_exporter          : # 删除 pg_exporter(postgres 监控)
  - pgbouncer_exporter   : # 删除 pgbouncer_exporter(pgbouncer 监控)
  - pgbackrest_exporter  : # 删除 pgbackrest_exporter(pgbackrest 监控)
pg_access                : # 删除 pg 服务访问
  - dns                  : # 删除 pg dns 记录
  - vip                  : # 删除 vip-manager
  - pg_service           : # 从 haproxy 删除 pg 服务
  - pgbouncer            : # 删除 pgbouncer 连接中间件
postgres                 : # 删除 postgres 实例
  - pg_replica           : # 删除所有副本
  - pg_primary           : # 删除主实例
  - pg_meta              : # 从 dcs 删除元数据
pg_backup                : # 删除备份仓库(使用 `pg_rm_backup=false` 禁用)
pg_data                  : # 删除 postgres 数据(使用 `pg_rm_data=false` 禁用)
pg_pkg                   : # 卸载 pg 包(使用 `pg_rm_pkg=false` 禁用)
 - pg_ext                : # 单独卸载 postgres 扩展

一些参数可以影响此 playbook 的行为:

# 删除 pgsql 集群 `pg-test`
./pgsql-rm.yml                          # 删除所有 postgres 集群(非常危险)
./pgsql-rm.yml -l pg-test               # 删除集群 `pg-test`
./pgsql-rm.yml -e pg_safeguard=false    # 强制禁用安全防护,强制运行此 playbook
./pgsql-rm.yml -e keep_data=true        # 保留数据目录,不要删除它(保留数据)
./pgsql-rm.yml -e keep_backup=true      # 默认不清除 postgres 数据(保留备份仓库)
./pgsql-rm.yml -e keep_package=true     # 默认不卸载 postgres 包(保留包)

使用此 playbook 的管理任务

关于此 playbook 的一些注意事项

当仍有副本时,不要直接在单个集群主实例上运行此 playbook

  • 否则,其余副本将触发自动故障转移。
  • 如果您在删除主实例之前删除所有副本,就不会有问题。
  • 如果您在整个集群上运行此操作,则无需担心此问题。

从集群中删除副本后重新加载服务

  • 它是一个死服务器,所以不会影响集群服务。
  • 但您应该及时重新加载服务以确保环境与配置清单之间的一致性。
  • 删除副本时,它仍然在 haproxy 负载均衡器的配置文件中。

pgsql-db.yml

剧本 pgsql-db.yml 可以向现有 PostgreSQL 集群添加新业务数据库。

查看管理 SOP:创建数据库


pgsql-user.yml

剧本 pgsql-user.yml 可以向现有 PostgreSQL 集群添加新业务用户。

查看管理 SOP:创建用户


pgsql-pitr.yml

剧本 pgsql-pitr.yml 可以在现有 PostgreSQL 集群上执行 时间点恢复 (PITR)。

查看管理 SOP: 备份恢复


pgsql-pitr.yml

剧本 pgsql-pitr.yml 可以向现有 PostgreSQL 集群添加新业务用户。

查看管理 SOP:时间点恢复


pgsql-monitor.yml

剧本 pgsql-monitor.yml 可以将现有/远程 postgres / RDS 实例纳入监控。

查看管理 SOP:监控 Postgres


pgsql-migration.yml

剧本 pgsql-migration.yml 可以为现有 PostgreSQL 集群生成迁移手册和脚本。

查看管理 SOP:数据库迁移