PIGSTY

管理

数据库管理任务标准操作指南(SOP)

如何使用 Pigsty 维护现有的 PostgreSQL 集群?

以下是常见 PostgreSQL 管理任务的标准操作程序:


快捷命令

PGSQL 剧本和快捷命令:

bin/pgsql-add   <cls>                   # 创建 PostgreSQL 集群 <cls>
bin/pgsql-user  <cls> <username>        # 在集群 <cls> 上创建用户 <username>
bin/pgsql-db    <cls> <dbname>          # 在集群 <cls> 上创建数据库 <dbname>
bin/pgsql-svc   <cls> [...ip]           # 重载集群 <cls> 的 PostgreSQL 服务
bin/pgsql-hba   <cls> [...ip]           # 重载集群 <cls> 的 postgres/pgbouncer HBA 规则
bin/pgsql-add   <cls> [...ip]           # 为集群 <cls> 添加从库
bin/pgsql-rm    <cls> [...ip]           # 从集群 <cls> 移除从库
bin/pgsql-rm    <cls>                   # 移除 PostgreSQL 集群 <cls>

Patroni 管理命令和快捷方式:

pg list        <cls>                    # 打印集群信息
pg edit-config <cls>                    # 编辑集群配置
pg reload      <cls> [ins]              # 重载集群配置
pg restart     <cls> [ins]              # 重启 PostgreSQL 集群
pg reinit      <cls> [ins]              # 重新初始化集群成员
pg pause       <cls>                    # 进入维护模式(无自动故障转移)
pg resume      <cls>                    # 退出维护模式
pg switchover  <cls>                    # 在集群 <cls> 上执行主从切换
pg failover    <cls>                    # 在集群 <cls> 上执行故障转移

pgBackRest 备份与恢复命令和快捷方式:

pb info                                 # 打印 pgbackrest 仓库信息
pg-backup                               # 进行备份,增量备份,或在必要时进行完整备份
pg-backup full                          # 进行完整备份
pg-backup diff                          # 进行差异备份
pg-backup incr                          # 进行增量备份
pg-pitr -i                              # 恢复到最新备份完成的时间(不常用)
pg-pitr --time="2022-12-30 14:44:44+08" # 恢复到特定时间点(在删除数据库、删除表的情况下)
pg-pitr --name="my-restore-point"       # 恢复到由 pg_create_restore_point 创建的命名恢复点
pg-pitr --lsn="0/7C82CB8" -X            # 恢复到 LSN 之前
pg-pitr --xid="1234567" -X -P           # 恢复到特定事务 ID 之前,然后提升
pg-pitr --backup=latest                 # 恢复到最新备份集
pg-pitr --backup=20221108-105325        # 恢复到特定备份集,可通过 pgbackrest info 检查

Systemd 组件快速参考:

systemctl stop patroni                  # start stop restart reload
systemctl stop pgbouncer                # start stop restart reload
systemctl stop pg_exporter              # start stop restart reload
systemctl stop pgbouncer_exporter       # start stop restart reload
systemctl stop node_exporter            # start stop restart
systemctl stop haproxy                  # start stop restart reload
systemctl stop vip-manager              # start stop restart reload
systemctl stop postgres                 # 仅当 patroni_mode == 'remove' 时

创建集群

要创建新的 Postgres 集群,首先在配置清单中定义它,然后使用以下命令初始化:

bin/node-add <cls>                # 为集群 <cls> 初始化节点           # ./node.yml  -l <cls>
bin/pgsql-add <cls>               # 初始化集群 <cls> 的 PostgreSQL 实例  # ./pgsql.yml -l <cls>

注意,请先执行 bin/node-add,然后执行 bin/pgsql-add,PGSQL 只能在受管节点上工作。


创建用户

要在现有 Postgres 集群上创建新的业务用户,将用户定义添加到 all.children.<cls>.pg_users,然后按如下方式创建用户:

bin/pgsql-user <cls> <username>   # ./pgsql-user.yml -l <cls> -e username=<username>

创建数据库

要在现有 Postgres 集群上创建新的数据库用户,将数据库定义添加到 all.children.<cls>.pg_databases,然后按如下方式创建数据库:

bin/pgsql-db <cls> <dbname>       # ./pgsql-db.yml -l <cls> -e dbname=<dbname>

注意:如果数据库指定了拥有者,该用户应该已经存在,否则您需要先 创建用户


重载服务

服务是由 HAProxy 服务的暴露访问点。

此任务用于集群成员发生变化时,例如 添加/移除 从库、主从切换/故障转移或暴露新服务或更新现有服务的配置(例如负载均衡权重)。

要在整个代理集群或特定实例上创建新服务或重载现有服务:

bin/pgsql-svc <cls>               # pgsql.yml -l <cls> -t pg_service -e pg_reload=true
bin/pgsql-svc <cls> [ip...]       # pgsql.yml -l ip... -t pg_service -e pg_reload=true

重载 HBA 规则

此任务用于您的 Postgres/Pgbouncer HBA 规则发生变化时,您可能需要重载 HBA 以应用更改。

如果您有任何特定于角色的 HBA 规则,您可能也需要在主从切换/故障转移后重载 HBA。

要在整个集群或特定实例上重载 postgres 和 pgbouncer HBA 规则:

bin/pgsql-hba <cls>               # pgsql.yml -l <cls> -t pg_hba,pg_reload,pgbouncer_hba,pgbouncer_reload -e pg_reload=true
bin/pgsql-hba <cls> [ip...]       # pgsql.yml -l ip... -t pg_hba,pg_reload,pgbouncer_hba,pgbouncer_reload -e pg_reload=true

配置集群

要更改现有 Postgres 集群的配置,您必须在使用管理员用户的管理节点上发起控制命令:

pg edit-config <cls>              # 使用 patronictl 交互式配置集群

更改 patroni 参数和 postgresql.parameters,使用向导保存并应用更改。


添加从库

要向现有 Postgres 集群添加新的从库,您必须将其定义添加到配置清单:all.children.<cls>.hosts,然后:

bin/node-add <ip>                 # 为新从库初始化节点 <ip>
bin/pgsql-add <cls> <ip>          # 在 <ip> 上为集群 <cls> 初始化 PostgreSQL 实例

这将把节点 <ip> 添加到 pigsty 并将其初始化为集群 <cls> 的从库。

集群服务将被 重载 以采纳新成员。


移除从库

要从现有 PostgreSQL 集群中移除从库:

bin/pgsql-rm <cls> <ip...>        # ./pgsql-rm.yml -l <ip>

这将从集群 <cls> 中移除实例 <ip>。集群服务将被 重载 以从负载均衡器中踢出被移除的实例。


移除集群

要移除整个 Postgres 集群,只需运行:

bin/pgsql-rm <cls>                # ./pgsql-rm.yml -l <cls>

主从切换

您可以使用 patroni 命令执行 PostgreSQL 集群主从切换。

pg switchover <cls>   # 交互模式,您可以使用以下选项跳过
pg switchover --leader pg-test-1 --candidate=pg-test-2 --scheduled=now --force pg-test

备份集群

要使用 pgBackRest 创建备份,以本地数据库超级用户身份运行:

pg-backup                         # 进行 PostgreSQL 基础备份
pg-backup full                    # 进行完整备份
pg-backup diff                    # 进行差异备份
pg-backup incr                    # 进行增量备份
pb info                           # 检查备份信息

详情请查看 备份PITR


恢复集群

要将集群恢复到之前的时间点(PITR),以本地数据库超级用户身份运行:

pg-pitr -i                              # 恢复到最新备份完成的时间(不常用)
pg-pitr --time="2022-12-30 14:44:44+08" # 恢复到特定时间点(在删除数据库、删除表的情况下)
pg-pitr --name="my-restore-point"       # 恢复到由 pg_create_restore_point 创建的命名恢复点
pg-pitr --lsn="0/7C82CB8" -X            # 恢复到 LSN 之前
pg-pitr --xid="1234567" -X -P           # 恢复到特定事务 ID 之前,然后提升
pg-pitr --backup=latest                 # 恢复到最新备份集
pg-pitr --backup=20221108-105325        # 恢复到特定备份集,可通过 pgbackrest info 检查

然后按照指导向导操作,详情请查看备份和 PITR


添加软件包

要添加更新版本的 RPM 软件包,您必须将它们添加到 repo_packagesrepo_url_packages

然后使用 ./infra.yml -t repo_build 子任务在基础设施节点上重建仓库,然后您可以使用 ansible 模块 package 安装这些软件包:

ansible pg-test -b -m package -a "name=pg_cron_15,topn_15,pg_stat_monitor_15*"  # 安装一些软件包

安装扩展

如果您想在 PostgreSQL 集群上安装扩展,将它们添加到 pg_extensions 并确保它们被安装:

./pgsql.yml -t pg_ext     # 安装扩展

一些扩展需要在 shared_preload_libraries 中加载,您可以将它们添加到 pg_libs,或 配置 现有集群。

最后,在集群主实例上执行 CREATE EXTENSION <extname>; 来安装它。

详情请查看 PGSQL 扩展:安装


小版本升级

要执行小版本的服务器版本升级/降级,您必须首先将软件包 添加 到 yum/apt 仓库。

然后从所有从库执行滚动升级/降级,然后切换集群以升级主库。

ansible <cls> -b -a "yum upgrade/downgrade -y <pkg>"    # 升级/降级软件包
pg restart --force <cls>                                # 重启集群

大版本升级

实现大版本升级的最简单方法是使用新版本创建新集群,然后使用逻辑复制和蓝绿部署进行 迁移

您也可以执行就地大版本升级,但不建议这样做,特别是当安装了某些扩展时。但这是可能的。

假设您想将 PostgreSQL 14 升级到 15,您必须将软件包 添加 到 yum/apt 仓库,并保证扩展也具有完全相同的版本。

./pgsql.yml -t pg_pkg -e pg_version=15                         # 为 PostgreSQL 15 安装软件包
sudo su - postgres; mkdir -p /data/postgres/pg-meta-15/data/   # 为 15 准备目录
pg_upgrade -b /usr/pgsql-14/bin/ -B /usr/pgsql-15/bin/ -d /data/postgres/pg-meta-14/data/ -D /data/postgres/pg-meta-15/data/ -v -c # 预检
pg_upgrade -b /usr/pgsql-14/bin/ -B /usr/pgsql-15/bin/ -d /data/postgres/pg-meta-14/data/ -D /data/postgres/pg-meta-15/data/ --link -j8 -v -c
rm -rf /usr/pgsql; ln -s /usr/pgsql-15 /usr/pgsql;             # 修复二进制链接
mv /data/postgres/pg-meta-14 /data/postgres/pg-meta-15         # 重命名数据目录
rm -rf /pg; ln -s /data/postgres/pg-meta-15 /pg                # 修复数据目录链接