FAQ(常见问题解答)
在本节中,您将找到关于Patroni的最常见问题的答案。每个小节都试图关注不同类型的问题。
我们希望这能帮助您澄清大部分问题。如果您仍然有进一步的疑虑或遇到意外问题,请参考“聊天和报告错误”部分,了解如何获取帮助或报告问题。
与其他高可用性解决方案的比较
为什么Patroni需要一个单独的DCS(分布式配置存储)节点集群,而其他解决方案(如repmgr)则不需要?
实现高可用性解决方案的方法有多种,每种方法都有其优缺点。
像repmgr这样的软件通过节点之间的通信来决定何时采取行动。
另一方面,Patroni依赖于存储在DCS中的状态。DCS作为Patroni决定应该做什么的真实信息来源。
虽然拥有一个单独的DCS集群可能会使您的架构变得臃肿,但这种方法也使得在您的Postgres集群中出现脑裂场景的可能性降低。
在Postgres管理方面,Patroni与其他高可用性解决方案有何不同?
Patroni不仅管理Postgres集群的高可用性,还管理Postgres本身。
如果Postgres节点尚不存在,它会负责引导主节点和备用节点,并管理节点的Postgres配置。如果Postgres节点已经存在,Patroni将接管集群的管理。
除了上述功能外,Patroni还具有自我修复能力。换句话说,如果主节点出现故障,Patroni不仅会故障转移到副本,还会尝试将原来的主节点重新加入为新主节点的副本。同样,如果副本出现故障,Patroni会尝试重新加入该副本。
因此我们称Patroni为“高可用性解决方案的模板”。它不仅管理物理复制,还管理整个Postgres。
DCS(分布式配置存储)
我可以使用相同的etcd集群来存储来自两个或多个Patroni集群的数据吗?
可以!
关于Patroni集群的信息存储在DCS中,路径以Patroni设置的命名空间和范围作为前缀。
只要您在不同的Patroni集群之间没有冲突的命名空间和范围,您就可以使用相同的DCS集群来存储来自多个Patroni集群的信息。
如果我尝试为指向相同DCS集群的不同Patroni集群使用相同的命名空间和范围组合,会发生什么?
尝试使用相同命名空间和范围的第二个Patroni集群将无法管理Postgres,因为它将在DCS中找到与该组合相关的信息,但具有不兼容的Postgres系统标识符。系统标识符的不匹配导致Patroni中止对第二个集群的管理,因为它认为这指的是不同的集群,并且用户已错误配置了Patroni。
在处理共享相同DCS集群的不同Patroni集群时,请确保使用不同的命名空间/范围。
如果我丢失了我的DCS集群,会发生什么?
DCS主要用于存储Patroni集群的状态和动态配置。
最直接的后果是,所有依赖该DCS的Patroni集群都将进入只读模式——除非启用了DCS故障安全模式。
如果我丢失了我的DCS集群,我应该怎么做?
丢失DCS集群后,可能有三种结果:
- DCS集群完全恢复:这不需要Patroni方面的任何操作。一旦DCS集群恢复,Patroni也应该能够恢复;
- DCS集群在原地重新创建,并且端点保持不变。Patroni方面不需要进行任何更改;
- 创建了一个新的DCS集群,具有不同的端点。您需要更新每个Patroni节点Patroni配置中的DCS端点。
如果您遇到第2种或第3种情况,Patroni将根据集群的当前状态重新创建状态信息,并基于存储在Patroni集群每个成员Postgres数据目录中的名为patroni.dynamic.json的备份文件,在DCS上重新创建动态配置。
如果我在DCS集群中失去了多数节点,会发生什么?
DCS将变得无响应,这将导致Patroni将当前的读写Postgres节点降级。
请记住:Patroni依赖于DCS的状态来对集群采取行动。
您可以使用DCS故障安全模式来缓解这种情况。
patronictl
我需要在Patroni主机上运行patronictl吗?
不需要。
如果您可以访问Patroni主机,则在Patroni主机上运行patronictl很方便,因为您可以使用与patroni代理相同的配置文件来运行patronictl应用程序。
但是,patronictl基本上是一个客户端,可以从远程机器上执行。您只需要为其提供足够的配置,以便它可以访问DCS和Patroni成员的REST API。
为什么我的其中一个Patroni成员的信息从patronictl list命令的输出中消失了?
patronictl list显示的信息基于DCS的内容。
如果关于某个成员的信息从DCS中消失了,那么很可能是该节点上的Patroni代理不再运行,或者无法与DCS通信。
由于该成员无法更新信息,因此信息最终会从DCS中过期,因此该成员不再显示在patronictl list命令的输出中。
为什么我的其中一个Patroni成员的信息在patronictl list命令的输出中不是最新的?
patronictl list显示的信息基于DCS的内容。
默认情况下,该信息由Patroni大约每loop_wait秒更新一次。换句话说,即使一切正常,您也可能会在DCS中存储的信息中看到最多为loop_wait秒的“延迟”。
不过,请注意,这并不是一条规则。Patroni执行的一些操作会使其立即更新DCS信息。
Postgres 管理
我可以直接在 Postgres 配置中更改 GUC(运行时配置参数)吗?
你可以,但应该避免这样做。
Postgres 配置由 Patroni 管理,如果你尝试编辑配置文件,Patroni 可能会最终覆盖它们,从而导致你的修改无效。
为了绕过 Patroni 的管理,有几种选择:
- 通过
$PGDATA/postgresql.base.conf
更改 Postgres GUC;或者 - 定义一个
postgresql.custom_conf
文件,该文件将替代postgresql.base.conf
,从而允许你在外部进行管理;或者 - 使用
ALTER SYSTEM
/ALTER DATABASE
/ALTER USER
来更改 GUC。
你可以在“重要规则”部分找到更多相关信息。
无论如何,我们建议你通过 Patroni 管理所有 Postgres 配置。这将集中管理并便于在需要时调试 Patroni。
我可以直接重启 Postgres 节点吗?
不,你不应该尝试直接管理 Postgres!
任何不通过 Patroni 重启 Postgres 服务器的尝试都可能导致集群面临故障转移。
如果你需要管理 Postgres 服务器,请通过 Patroni 提供的方式进行。
Patroni 能够接管已经存在的 Postgres 集群的管理吗?
可以!
请参考“将独立集群转换为 Patroni 集群”的详细指南。
Patroni 如何管理 Postgres?
Patroni 通过运行 Postgres 二进制文件(如 pg_ctl 和 postgres)来负责启动和停止 Postgres。
鉴于此,你必须禁用任何其他可能管理 Postgres 集群的来源,如 systemd 单元(例如 postgresql.service)。只有 Patroni 应该能够启动、停止和升级集群中的 Postgres 实例。不这样做可能会导致脑裂场景。例如:如果作为主节点的节点发生故障,并且启用了 postgresql.service 单元,它可能会重新启动 Postgres 并导致脑裂。
概念和要求
Patroni 包含哪些应用程序?
Patroni 主要包含两个应用程序:
- patroni:这是 Patroni 代理,负责管理一个 Postgres 节点;
- patronictl:这是一个命令行工具,用于与 Patroni 集群交互(执行切换、重启、配置更改等)。更多信息请参见 patronictl。
Patroni 中的备用集群是什么?
备用集群是指没有运行任何主 Postgres 节点的集群,即集群中没有读写成员。
这类集群用于从另一个集群复制数据,通常在需要将数据跨数据中心复制时很有用。
集群中将有一个领导者,它将是负责从远程 Postgres 节点复制更改的备用节点。然后,将有一组备用节点配置为从该领导者成员进行级联复制。
注意:备用集群不知道它正在从中复制的源集群的任何信息——它甚至可以使用 restore_command 而不是 WAL 流式传输,并且可以使用完全独立的 DCS(分布式配置存储)集群。
有关更多详细信息,请参阅备用集群。
Patroni 中的领导者是什么?
Patroni 中的领导者就像集群的协调者。
在常规的 Patroni 集群中,领导者将是读写节点。
在备用 Patroni 集群中,领导者(也称为备用领导者)将负责从远程 Postgres 节点进行复制,并将这些更改级联到备用集群的其他成员。
Patroni 是否要求集群中至少有一定数量的 Postgres 节点?
不,你可以使用任何数量的 Postgres 节点运行 Patroni。
记住:Patroni 与 DCS 是解耦的。
Patroni 中的暂停是什么意思?
暂停是 Patroni 提供的一个操作,允许用户要求 Patroni 在 Postgres 管理方面退后一步。
这在你想要对集群进行维护并希望避免 Patroni 做出与 HA(高可用性)相关的决策时特别有用,比如在停止主节点时避免其故障转移到备用节点。
你可以在“集群的暂停/恢复模式”中找到更多相关信息。
自动故障转移
Patroni的自动故障转移机制是如何工作的?
Patroni的自动故障转移基于我们称之为“领导者竞选”的机制。
Patroni在分布式配置存储(DCS)中存储集群的状态,其中包括一个领导者锁,该锁持有当前作为集群领导者的Patroni成员的名称。
这个领导者锁有一个与之关联的生存时间。如果领导者节点未能及时更新领导者锁的租约,该键最终将从DCS中过期。
当领导者锁过期时,它会触发Patroni所谓的“领导者竞选”:所有节点都开始进行检查,以确定它们是否是接管领导者角色的最佳候选者。这些检查中的一些包括对所有其他Patroni成员的REST API的调用。
所有发现自己是最适合接管领导者锁的Patroni成员都会尝试这样做。第一个能够获取领导者锁的Patroni成员会将自己提升为读写节点(或备用领导者),而其他成员将被配置为跟随它。
我可以在Patroni集群中临时禁用自动故障转移吗?
是的,你可以!
你可以通过暂时暂停集群来实现这一点。这在进行维护时特别有用。
当你想恢复集群的自动故障转移时,你只需要取消暂停它。
你可以在集群的暂停/恢复模式中找到更多相关信息。
引导程序和备用节点创建
Patroni是如何创建一个主PostgreSQL节点的?备用PostgreSQL节点呢?
默认情况下,Patroni将使用initdb来引导一个新的集群,并使用pg_basebackup从领导者成员的副本中创建备用节点。
你可以通过编写自定义的引导方法和自定义的副本创建方法来定制这种行为。
自定义方法通常在你想恢复由备份工具(如pgBackRest或Barman)创建的备份时很有用。
有关详细信息,请参阅引导和构建副本部分。
监控
我如何监控我的Patroni集群?
Patroni在其Patroni REST API中公开了一些方便的端点:
/metrics:以Prometheus可以消费的格式公开监控指标;
/patroni:以JSON格式公开集群的状态。这里显示的信息与/metrics端点显示的信息非常相似。
你可以使用这些端点来实现监控检查。