PIGSTY

答疑

常见问题解答

因 postgres 存在而中止

当您在运行 PostgreSQL 的节点上运行 pgsql.yml 时会发生这种情况。 如果有正在运行的 PostgreSQL 实例,您可以使用 pgsql-rm.yml 剧本显式移除它:

./pgsql-rm.yml -l <cls_to_remove>    # 移除集群 'cls_to_remove'

因启用 pg_safeguard 而中止

禁用 pg_safeguard 以移除 PostgreSQL 实例。

如果启用了 pg_safeguard,您无法使用 bin/pgsql-rmpgsql-rm.yml 剧本移除正在运行的 PostgreSQL 实例。

要禁用 pg_safeguard,您可以在配置清单中将 pg_safeguard 设置为 false,或将 -e pg_safeguard=false 作为命令行参数传递给剧本:

./pgsql-rm.yml -e pg_safeguard=false -l <cls_to_remove>    # 强制覆盖 pg_safeguard

等待 postgres/patroni 主库失败

这个错误有几个可能的原因,您需要 检查 系统日志来确定实际原因。

这通常发生在集群配置错误,或者之前的主库被不当移除时(例如,DCS 中有相同集群名称的垃圾元数据)。

您必须检查 /pg/log/* 以找到原因。

要从 etcd 删除垃圾元数据,您可以使用 etcdctl del --prefix /pg/<cls>,操作时请谨慎!

  • 1:配置错误。识别不正确的参数,修改它们并应用更改。
  • 2:部署中已存在同名的另一个集群
  • 3:节点上的之前集群,或同名的之前集群未正确移除。
  • 要移除过时的集群元数据,您可以使用 etcdctl del --prefix /pg/<cls> 手动删除残留数据。
  • 4:与您的 PostgreSQL 或节点相关的 RPM 包未成功安装。
  • 5:您的 Watchdog 内核模块未正确启用或加载,但是必需的。
  • 6:指定的语言环境或字符类型 pg_lc_collatepg_lc_ctype 在操作系统中不存在

请随时提交问题或寻求社区帮助。


等待 postgres/patroni 从库失败

立即失败:通常,这是由于配置错误、网络问题、DCS 元数据损坏等导致的,您必须检查 /pg/log 以找出实际原因。

一段时间后失败:这可能是由于源实例数据损坏。查看 PGSQL 常见问题:数据损坏时如何创建从库?

超时:如果 wait for postgres replica 任务需要 30 分钟或更长时间并因超时而失败,这对于大型集群(例如 1TB+,可能需要数小时才能创建从库)是常见的。在这种情况下,底层创建从库过程仍在进行。您可以使用 pg list <cls> 检查集群状态,等待从库追上主库。然后继续以下任务:

./pgsql.yml -t pg_hba,pg_param,pg_backup,pgbouncer,pg_vip,pg_dns,pg_service,pg_exporter,pg_register -l <problematic_replica>

安装 PostgreSQL 13 - 17

要安装 PostgreSQL 13 ~ 16,您必须在配置清单中将 pg_version 设置为 13141516。(通常在集群级别)

pg_version: 16                    # 在此模板中安装 PostgreSQL 16

如何为 PostgreSQL 启用大页面?

使用 node_hugepage_countnode_hugepage_ratio/pg/bin/pg-tune-hugepage

如果您计划启用大页面,请考虑使用 node_hugepage_countnode_hugepage_ratio 并使用 ./node.yml -t node_tune 应用。

在 PostgreSQL 启动之前分配足够的大页面是好的做法,然后使用 pg_tune_hugepage 稍后缩减它们。

如果您的 PostgreSQL 已经在运行,您可以使用 /pg/bin/pg-tune-hugepage 即时启用大页面。请注意,这仅适用于 PostgreSQL 15+

sync; echo 3 > /proc/sys/vm/drop_caches   # 丢弃系统缓存(准备承受性能影响)
sudo /pg/bin/pg-tune-hugepage             # 将 nr_hugepages 写入 /etc/sysctl.d/hugepage.conf
pg restart <cls>                          # 重启 PostgreSQL 以使用大页面

如何在故障转移期间保证零数据丢失?

使用 crit.yml 模板,或设置 pg_rpo0,或使用同步模式 配置集群

考虑使用 同步从库法定人数提交 来保证故障转移期间 0 数据丢失。


如何从磁盘满的情况中恢复?

rm -rf /pg/dummy 将释放一些紧急空间。

pg_dummy_filesize 默认设置为 64MB。考虑在生产环境中将其增加到 8GB 或更大。

它将被放置在与 PGSQL 主数据磁盘相同的磁盘上的 /pg/dummy 中。您可以删除该文件以释放一些紧急空间。至少您可以在该节点上运行一些 shell 脚本。


数据损坏时如何创建从库?

在坏实例上禁用 clonefrom 并重新加载 patroni 配置。

Pigsty 在所有实例的 patroni 配置上设置 cloneform: true 标签,这标记实例可用于克隆从库。

如果此实例有损坏的数据文件,您可以设置 clonefrom: false 以避免从有问题的实例拉取数据。具体操作如下:

$ vi /pg/bin/patroni.yml

tags:
  nofailover: false
  clonefrom: true      # ----------> 改为 false
  noloadbalance: false
  nosync: false
  version:  '15'
  spec: '4C.8G.50G'
  conf: 'oltp.yml'

$ systemctl reload patroni

数据损坏时如何创建从库?

在坏实例上禁用 clonefrom 并重新加载 patroni 配置。

Pigsty 在所有实例的 patroni 配置上设置 cloneform: true 标签,这标记实例可用于克隆从库。

如果此实例有损坏的数据文件,您可以设置 clonefrom: false 以避免从有问题的实例拉取数据。具体操作如下:

$ vi /pg/bin/patroni.yml

tags:
  nofailover: false
  clonefrom: true      # ----------> 改为 false
  noloadbalance: false
  nosync: false
  version:  '15'
  spec: '4C.8G.50G'
  conf: 'oltp.yml'

$ systemctl reload patroni

监控导出器的性能影响

影响不大,每 10 ~ 15 秒 200ms,不会影响数据库性能。

Pigsty 中 prometheus 的默认抓取间隔为 10 秒,确保导出器可以在该时间段内完成抓取。


如何监控现有的 PostgreSQL 实例?

详情请查看 PGSQL 监控


如何从 prometheus 中移除监控目标?

./pgsql-rm.yml -t prometheus -l <cls>     # 移除集群 'cls' 的 prometheus 目标

或者

bin/pgmon-rm <ins>     # 移除 PostgreSQL 实例 'ins' 的 prometheus 目标的快捷方式