You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Patroni集群无Leader故障求助:所有节点处于stopped状态

Patroni集群所有节点处于'stopped'状态故障排查

问题现象

搭建Patroni集群时,所有节点均处于stopped状态,日志显示节点等待Leader完成引导。执行命令patronictl -c /etc/postgres0.yml list输出如下:

Cluster: postgres (7366xxxxxxxxxxxxxxx) ---------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+-------------+----------------+---------+---------+----+-----------+
| postgresql0 | xxx.xxx.xx.57 | Replica | stopped | | unknown |
| postgresql1 | xxx.xxx.xx.129 | Replica | stopped | | unknown |
+-------------+----------------+---------+---------+----+-----------+

日志信息

[postgres@patroni01 ~]$ patroni /etc/postgres0.yml
2024-05-07 13:24:24,345 INFO: No PostgreSQL configuration items changed, nothing to reload.
2024-05-07 13:24:24,401 INFO: Lock owner: None; I am postgresql0
2024-05-07 13:24:24,404 INFO: waiting for leader to bootstrap
(repeated logs)
2024-05-07 13:25:04,405 INFO: waiting for leader to bootstrap

环境与配置

  • Patroni版本:3.3.0
  • PostgreSQL版本:15
  • 节点配置文件(postgresql0):
scope: postgres
namespace: /service/
name: postgresql0

restapi:
  listen: xxx.xxx.xx.57:8008
  connect_address: xxx.xxx.xx.57:8008

etcd:
  host: xxx.xxx.xx.155:2379

bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    postgresql:
      use_pg_rewind: true
      use_slots: true
      pg_hba:
      - host replication replicator 127.0.0.1/32 trust
      - host replication replicator xxx.xxx.xx.57/0 trust
      - host replication replicator xxx.xxx.xx.129/0 trust
      - host all all 0.0.0.0/0 trust
      parameters:
  initdb:
  - encoding: UTF8
  - data-checksums

postgresql:
  listen: xxx.xxx.xx.57:5432
  connect_address: xxx.xxx.xx.57:5432
  data_dir: /data/patroni
  pgpass: /tmp/pgpass0
  authentication:
    replication:
      username: replicator
      password: replicator
    superuser:
      username: postgres
      password: postgres
  parameters:
    unix_socket_directories: '..'
tags:
    noloadbalance: false
    clonefrom: false
    nosync: false
    nostream: false

已尝试操作

  • 验证节点间网络连通性
  • 确认Patroni进程运行权限正确
  • 检查配置文件语法错误

疑问

  1. 是什么原因导致集群无法选举Leader,所有节点显示stopped?
  2. 配置中有哪些特定设置需要检查或修改?
  3. 如何排查引导过程中阻止Leader选举的错误?

故障排查思路与解决建议

1. 核心原因分析

所有节点等待Leader引导,说明没有节点触发初始化引导流程,或者分布式存储(etcd)中没有写入集群初始元数据,常见原因包括:

  • etcd集群未正常运行,或Patroni节点无法与etcd建立有效连接
  • 配置文件中bootstrap部分缺失关键参数,导致节点无法触发初始化
  • 节点的data_dir目录已有PostgreSQL数据,Patroni认为这是已存在的节点,不会触发引导
  • 权限问题:Patroni进程无权限写入data_dir或etcd

2. 配置文件检查与修正

针对当前配置,重点检查以下项:

  • bootstrap.dcs.postgresql.parameters为空:这里必须包含PostgreSQL基础参数(如listen_addresses、wal_level等),否则初始化后的PostgreSQL无法正常启动。添加必要参数:
    parameters:
      wal_level: replica
      max_wal_senders: 5
      wal_keep_size: 16MB
      hot_standby: on
    
  • unix_socket_directories设置错误:当前值为..,这会导致PostgreSQL无法创建正确的Unix套接字,Patroni无法连接本地PostgreSQL。修改为实际路径,比如/var/run/postgresql或/data/patroni/sockets,确保Patroni进程有权限访问该目录。
  • etcd连接验证:确认etcd.host配置的地址和端口正确,且Patroni节点能通过etcdctl连接到etcd集群:
    etcdctl --endpoints=xxx.xxx.xx.155:2379 member list
    
  • bootstrap触发条件:确保所有节点的data_dir为空,若已有数据,先清空(注意备份),否则Patroni不会触发初始化引导。

3. 引导过程故障排查步骤

  1. 验证etcd可用性:在每个Patroni节点执行etcdctl命令,确认能正常读写etcd:
    etcdctl --endpoints=xxx.xxx.xx.155:2379 put /service/postgres/test "test"
    etcdctl --endpoints=xxx.xxx.xx.155:2379 get /service/postgres/test
    
    若无法执行,检查etcd集群状态、防火墙规则(2379端口是否开放)。
  2. 查看Patroni详细日志:启动Patroni时添加--log-level debug参数,获取更详细的日志,重点看etcd连接、初始化流程的报错信息:
    patroni --log-level debug /etc/postgres0.yml
    
  3. 检查PostgreSQL初始化日志:查看data_dir目录下的pg_log日志(若已尝试初始化),确认是否有PostgreSQL启动失败的错误(如权限不足、参数错误)。
  4. 手动触发初始化(可选):如果确认etcd正常,且data_dir为空,可在其中一个节点手动触发引导:
    patronictl -c /etc/postgres0.yml bootstrap
    
    执行后观察节点状态是否切换为running并成为Leader。
  5. 检查节点标签:当前配置中clonefrom为false,确保没有节点被设置为禁止被克隆,否则新节点无法从Leader同步数据。

内容的提问来源于stack exchange,提问作者yeonjoo choi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:47:05