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进程运行权限正确
- 检查配置文件语法错误
疑问
- 是什么原因导致集群无法选举Leader,所有节点显示
stopped? - 配置中有哪些特定设置需要检查或修改?
- 如何排查引导过程中阻止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: onunix_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. 引导过程故障排查步骤
- 验证etcd可用性:在每个Patroni节点执行
etcdctl命令,确认能正常读写etcd:
若无法执行,检查etcd集群状态、防火墙规则(2379端口是否开放)。etcdctl --endpoints=xxx.xxx.xx.155:2379 put /service/postgres/test "test" etcdctl --endpoints=xxx.xxx.xx.155:2379 get /service/postgres/test - 查看Patroni详细日志:启动Patroni时添加
--log-level debug参数,获取更详细的日志,重点看etcd连接、初始化流程的报错信息:patroni --log-level debug /etc/postgres0.yml - 检查PostgreSQL初始化日志:查看
data_dir目录下的pg_log日志(若已尝试初始化),确认是否有PostgreSQL启动失败的错误(如权限不足、参数错误)。 - 手动触发初始化(可选):如果确认etcd正常,且
data_dir为空,可在其中一个节点手动触发引导:
执行后观察节点状态是否切换为patronictl -c /etc/postgres0.yml bootstraprunning并成为Leader。 - 检查节点标签:当前配置中
clonefrom为false,确保没有节点被设置为禁止被克隆,否则新节点无法从Leader同步数据。
内容的提问来源于stack exchange,提问作者yeonjoo choi
相关产品推荐
相关产品推荐

