PGSQL剧本

使用PGSQL系列剧本,拉起定义好的高可用PostgreSQL数据库集群

剧本概览

剧本功能链接
pgsql部署PostgreSQL集群,或集群扩容src
pgsql-remove下线PostgreSQL集群,或集群缩容src
pgsql-createuser创建PostgreSQL业务用户src
pgsql-createdb创建PostgreSQL业务数据库src
pgsql-monly仅监控模式,接入现存PostgreSQL实例或RDSsrc
pgsql-migration生成PostgreSQL半自动数据库迁移方案(Beta)src
pgsql-audit生成PostgreSQL审计合规报告(Beta)src
pgsql-matrix复用PG角色部署一套MatrixDB数据仓库集群(Beta)src

pgsql

完成了基础设施初始化后,用户可以pgsql.yml 完成数据库集群的初始化

首先在 Pigsty配置文件 中完成数据库集群的定义,然后通过执行pgsql.yml将变更应用至实际环境中。

  1. ./pgsql.yml # 在所有清单中的机器上执行数据库集群初始化操作(危险!)
  2. ./pgsql.yml -l pg-test # 在 pg-test 分组下的机器执行数据库集群初始化(推荐!)
  3. ./pgsql.yml -l pg-meta,pg-test # 同时初始化pg-meta与pg-test两个集群
  4. ./pgsql.yml -l 10.10.10.11 # 初始化10.10.10.11这台机器上的数据库实例

本剧本主要完成以下工作:

  • 安装、部署、初始化PostgreSQL, Pgbouncer, Patroni(postgres
  • 安装PostgreSQL监控系统(monitor
  • 安装部署Haproxy与VIP,对外暴露服务(service
  • 将数据库实例注册至基础设施,接受监管(register

该剧本使用不当存在误删数据库的风险,因为初始化数据库会抹除原有数据库的痕迹保险参数提供了避免误删的选项作为保险,以在初始化过程中,当检测到已有运行中实例时,允许自动中止或跳过高危操作,避免最坏情况发生。尽管如此,在使用pgsql.yml时,请再三检查--tags|-t--limit|-l 参数是否正确。确保自己在正确的目标上执行正确的任务。使用不带参数的pgsql.yml在生产环境中是一个高危操作,务必三思而后行。

剧本 - 图1

注意事项

  • 强烈建议在执行时添加-l参数,限制命令执行的对象范围。

  • 单独针对某一集群从库执行初始化时,用户必须自行确保主库已经完成初始化

  • 集群扩容时,如果Patroni拉起从库的时间过长,Ansible剧本可能会因为超时而中止。(但制作从库的进程会继续,例如制作从库需超过1天的场景)。

  • 您可以在从库自动制作完毕后,通过Ansible的--start-at-taskWait for patroni replica online任务继续执行后续步骤。详情请参考SOP

保护机制

pgsql.yml提供保护机制,避免误删运行中的PostgreSQL数据库,包括了两个相关参数:

  • pg_safeguard:默认关闭,只要打开,在任意情况下该数据库实例不会被清理。
  • pg_clean:默认关闭,当打开时,初始化PostgreSQL/pgsql.yml 会抹除掉现有实例(危险)

当遇到现存实例时,pgsql.yml 剧本会有以下行为表现:

pg_safeguard / pg_cleanpg_clean=truepg_clean=false
pg_safeguard=true中止执行中止执行
pg_safeguard=false抹除实例中止执行

当遇到现存实例时, pgsql-remove.yml 剧本会有以下行为表现:

pg_safeguard / pg_cleanpg_clean=truepg_clean=false
pg_safeguard=true中止执行中止执行
pg_safeguard=false抹除实例抹除实例

选择性执行

用户可以通过ansible的标签机制,可以选择执行剧本的一个子集。

举个例子,如果只想执行服务初始化的部分,则可以通过以下命令进行

  1. ./pgsql.yml --tags=service # 刷新集群的服务定义

常用的命令子集如下:

  1. # 基础设施初始化
  2. ./pgsql.yml --tags=infra # 完成基础设施的初始化,包括机器节点初始化与DCS部署
  3. # 数据库初始化
  4. ./pgsql.yml --tags=pgsql # 完成数据库部署:数据库、监控、服务
  5. ./pgsql.yml --tags=postgres # 完成数据库部署
  6. ./pgsql.yml --tags=monitor # 完成监控的部署
  7. ./pgsql.yml --tags=service # 完成负载均衡的部署,(Haproxy & VIP)
  8. ./pgsql.yml --tags=register # 将服务注册至基础设施

日常管理任务

日常管理也可以使用./pgsql.yml来修改数据库集群的状态,常用的命令子集如下:

  1. ./pgsql.yml --tags=node_admin # 在目标节点上创建管理员用户
  2. # 如果当前管理员没有ssh至目标节点的权限,可以使用其他具有ssh的用户创建管理员(输入密码)
  3. ./pgsql.yml --tags=node_admin -e ansible_user=other_admin -k
  4. ./pgsql.yml --tags=pg_scripts # 更新/pg/bin/目录脚本
  5. ./pgsql.yml --tags=pg_hba # 重新生成并应用集群HBA规则
  6. ./pgsql.yml --tags=pgbouncer # 重置Pgbouncer
  7. ./pgsql.yml --tags=pg_user # 全量刷新业务用户
  8. ./pgsql.yml --tags=pg_db # 全量刷新业务数据库
  9. ./pgsql.yml --tags=register_consul # 在目标实例本地注册Consul服务(本地执行)
  10. ./pgsql.yml --tags=register_prometheus # 在Prometheus中注册监控对象(代理至所有Meta节点执行)
  11. ./pgsql.yml --tags=register_grafana # 在Grafana中注册监控对象(只注册一次)
  12. ./pgsql.yml --tags=register_nginx # 在Nginx注册负载均衡器(代理至所有Meta节点执行)
  13. # 使用二进制安装的方式重新部署监控
  14. ./pgsql.yml --tags=monitor -e exporter_install=binary
  15. # 刷新集群的服务定义(当集群成员或服务定义发生变化时执行)
  16. ./pgsql.yml --tags=haproxy_config,haproxy_reload

pgsql-remove

数据库下线:可以移除现有的数据库集群或实例,回收节点:pgsql-remove.yml

pgsql-remove.ymlpgsql.yml的反向操作,会依次完成

  • 将数据库实例从基础设施取消注册(register
  • 停止负载均衡器,服务组件(service
  • 移除监控系统组件(monitor
  • 移除Pgbouncer,Patroni,Postgres(postgres
  • 移除数据库目录(rm_pgdata: true
  • 移除软件包(rm_pkgs: true

该剧本有两个命令行选项,可用于移除数据库目录与软件包(默认下线不会移除数据与安装包)

  1. rm_pgdata: false # remove postgres data? false by default
  2. rm_pgpkgs: false # uninstall pg_packages? false by default

剧本 - 图2

日常管理

  1. ./pgsql-remove.yml -l pg-test # 下线 pg-test 集群
  2. ./pgsql-remove.yml -l 10.10.10.13 # 下线实例 10.10.10.13 (实际上是pg-test.pg-test-3)
  3. ./pgsql-remove.yml -l 10.10.10.13 -e rm_pgdata=true # 下线,一并移除数据目录(可能较慢)
  4. ./pgsql-remove.yml -l 10.10.10.13 -e rm_pkgs=true # 下线,一并移除安装的PG相关软件包

pgsql-createdb

创建业务数据库:可以在现有集群中创建新的数据库或修改现有数据库pgsql-createdb.yml

剧本 - 图3

强烈建议通过剧本或包装脚本与工具在已有集群中创建新数据库,这样可以确保:

  • 配置文件清单与实际情况保持一致
  • Pgbouncer连接池与数据库保持一致
  • Grafana中所注册的数据源与实际情况保持一致。

日常管理

数据库的创建请参考 数据库 一节。

  1. # 在 pg-test 集群创建名为 test 的数据库
  2. ./pgsql-createdb.yml -l pg-test -e pg_database=test

可以使用包装脚本简化命令:

  1. bin/createdb <pg_cluster> <dbname>

pgsql-createuser

创建业务用户:可以在现有集群中创建新的用户或修改现有用户pgsql-createuser.yml

剧本 - 图4

日常管理

业务用户的创建请参考 用户 一节

  1. # 在 pg-test 集群创建名为 test 的用户
  2. ./pgsql-createuser.yml -l pg-test -e pg_user=test

可以使用包装脚本简化命令:

  1. bin/createuser <pg_cluster> <username>

请注意,pg_user 指定的用户,必须已经存在于集群pg_users的定义中,否则会报错。这意味着用户必须先定义,再创建。


pgsql-monly

用于执行仅监控部署的专用剧本,详情请参考:仅监控部署

剧本 - 图5


pgsql-matrix

用于部署MatrixDB的专用剧本,详情请参考:部署MatrixDB集群

剧本 - 图6


pgsql-migration

用于数据库自动化迁移的剧本,目前仍处于Beta状态,详情请参考:数据库集群迁移

剧本 - 图7

最后修改 2022-05-27: add makefile shortcuts (23d6900)