Patroni官方给出的流程图
Patroni官方给出的流程图可以将整个流程划分为以下几个主要部分:
-
节点启动流程:这是Patroni初始化和启动的过程,包括数据库的初始化以及在分布式协调服务(如etcd)中持久化节点状态。
-
节点拉起流程:当一个节点被创建或加入集群时,它会执行一系列操作以确保其能够正常运行并与其他节点同步。这包括从其他节点拉取必要的数据和配置信息。
-
处理健康集群流程:Patroni会持续监控集群的健康状态,一旦检测到主节点故障,它会自动执行故障恢复操作,将其中一个从节点晋升为主节点。
-
处理不健康集群流程:如果某个节点出现故障,Patroni会通过watchdog机制进行探测,并在必要时重置该节点的状态,以保证集群的一致性和高可用性。
此外,Patroni的处理逻辑还包括run_cycle模块,这是主循环模块,负责调用各个子模块来执行具体的任务。这些模块共同工作,确保Patroni能够在各种高可用场景下稳定运行。
Patroni在节点启动流程中具体如何初始化数据库和持久化节点状态?
Patroni在节点启动流程中初始化数据库和持久化节点状态的方式如下:
-
初始化模板:Patroni使用预定义的初始化模板来初始化数据库集群。这些模板位于
roles/postgres/templates/
目录下,有四种预定义好的初始化模板可供选择。 -
数据目录重初始化:如果需要重新初始化指定节点上的PostgreSQL数据目录,可以通过调用REST API中的
POST /reinitialize
命令来实现。该命令仅允许在副本上执行,并会删除现有的数据目录并启动pg_basebackup或其他替代的副本创建方法。 -
自动或手动恢复:当主数据库(Primary)故障时,Patroni可以将一个从库(Standby)提升为主数据库,而旧的主数据库则降级为从库。此外,如果一个故障的PostgreSQL被抢救过来,它能够重新自动或手动加入集群。
-
状态持久化与共享:Patroni利用etcd作为节点间信息共享的工具,以确保所有节点能够同步并维护一致的状态。当持有key的节点出现故障时,其他节点可以创建新的key值,从而产生新的主节点。
Patroni的节点拉起流程中,是如何确保新加入的节点能够正确同步数据和配置信息的?
在Patroni的节点拉起流程中,确保新加入的节点能够正确同步数据和配置信息主要依赖于其与etcd或Consul等分布式配置系统(DCS)的交互。具体来说:
-
使用etcd进行状态同步:Patroni会将同步的状态记录到etcd中,以确保集群中的所有节点都能保持一致的同步状态。
-
通过DCS管理关键参数:Patroni通过分布式配置系统(如etcd或Consul)来管理关键参数,例如
max_connections
、wal_level
等,这些参数需要在主库和副本间保持一致。这样可以确保新加入的节点在配置上与现有节点保持一致。 -
连接到Consul代理:每个节点上的Patroni首先连接到Consul代理以加入集群。只有在这之后,它才会决定节点是主节点还是副本节点,并开始同步数据和配置信息。
在处理健康集群流程中,Patroni是如何检测主节点故障并执行故障恢复操作的?
在处理健康集群流程中,Patroni通过检测主节点的异常状态来执行故障恢复操作。具体来说,当Patroni检测到主节点出现故障时,它会根据预设的策略进行故障转移和恢复操作。Patroni使用etcd作为分布式配置存储(DCS),其中包含集群信息,如配置、健康和当前状态。在检测到主节点故障后,Patroni会尝试重新选举一个新的主节点,并将其他节点切换为备库状态,以确保集群的高可用性。
此外,Patroni还提供了暂停模式下的功能,允许在手动操作如主版本升级或故障恢复时限制自动操作,以防止冲突。在暂停模式下,如果Patroni检测到“并行”主节点,它会发出警告,但不会在没有leader锁的情况下降级主节点。如果集群中没有leader锁,则运行中的主节点将获取该锁。如果有多个主节点,第一个获得锁的主节点获胜。
在某些情况下,如果需要恢复一个异常的数据库节点,只需重启Patroni节点并改变时间线即可。这表明Patroni具有一定的灵活性和容错能力,能够应对各种故障场景并快速恢复集群的正常运行。
对于不健康集群流程,Patroni的watchdog机制是如何工作的,以及它是如何重置故障节点状态的?
Patroni的watchdog机制在不健康集群流程中起着关键作用,其主要功能是监控和管理PostgreSQL集群的状态。当集群中的节点出现故障时,watchdog会介入并采取相应的措施来恢复系统的正常运行。
Patroni的watchdog机制通过定期更新Leader key及其TTL(生存时间)来保持集群的健康状态。默认情况下,Patroni每10秒执行一次loop_wait操作,以确保系统能够及时响应任何潜在的问题。如果Leader节点异常导致Patroni进程无法及时更新Leader key,则watchdog会在Leader key过期前的安全裕度时间内触发重启操作。这个安全裕度时间是根据配置参数设置的,例如在默认配置下,safety_margin为5秒,因此整个HA循环至少有15秒的时间来完成任务,然后系统才会被强制重置。
此外,当Patroni处于暂停状态时,watchdog会被禁用,以避免不必要的重启或干扰。正常停止Patroni服务也会禁用watchdog,以防止意外重启。
在故障转移过程中,如果由于手动故障转移或其他原因导致PostgreSQL降级,Patroni将再次禁用watchdog,以确保系统的平稳过渡。一旦选举出新的领导者,watchdog将重新启用,并继续监控集群的状态。
如果Patroni本身无法工作,watchdog将尝试重新启动系统。如果系统仍然无法正常工作,且watchdog模式被设置为required,则该节点将不能成为领导者。这种机制确保了即使在极端情况下,集群也能维持其高可用性和稳定性。
Patroni的run_cycle模块具体负责哪些任务,它是如何调用各个子模块来执行这些任务的?
Patroni的run_cycle
模块是其核心执行流程的一部分,负责在每个执行周期中定义守护进程应该执行的任务。这个模块通过调用各个子模块来完成这些任务。
具体来说,run_cycle
模块首先会调用self.ha.run _cycle
函数。这一步骤确保了Patroni能够处理高可用性相关的逻辑,比如节点的启动、健康检查以及集群状态的更新等。
此外,根据不同的情况,run_cycle
还可能调用其他子模块,如Node bootstrap模块、process_health_cluster模块和process_unhealth_cluster模块。这些模块分别负责节点的初始化、处理健康的集群状态以及处理不健康的集群状态。
在每次执行完所有逻辑后,run_cycle
会等待一段时间(由loop_wait参数配置),然后进入下一次循环。这种循环机制保证了Patroni能够持续监控和管理PostgreSQL数据库的高可用性。
总结来说,Patroni的run_cycle
模块通过调用多个子模块来执行其任务,包括但不限于高可用性管理、节点初始化、健康检查和集群状态更新等。
https://raw.githubusercontent.com/zalando/patroni/master/docs/ha_loop_diagram.png
https://zhuanlan.zhihu.com/p/159009358