sudo -u postgres /usr/pgsql-15/bin/repmgr service status WARNING: node "node2" not found in "pg_stat_replication" WARNING: node "node3" not found in "pg_stat_replication" ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen ----+-------+---------+-----------+----------+-------------+-----+---------+-------------------- 1 | node1 | primary | * running | | not running | n/a | n/a | n/a 2 | node2 | standby | running | ! node1 | not running | n/a | n/a | n/a 3 | node3 | standby | running | ! node1 | not running | n/a | n/a | n/a WARNING: following issues were detected - node "node2" (ID: 2) is not attached to its upstream node "node1" (ID: 1) - node "node3" (ID: 3) is not attached to its upstream node "node1" (ID: 1)
时间: 2025-03-17 11:14:50 浏览: 47
<think>好的,我现在需要帮助用户解决他们遇到的PostgreSQL复制问题。用户运行了`sudo -u postgres /usr/pgsql-15/bin/repmgr service status`命令,结果显示了两个警告:node2和node3在pg_stat_replication中未找到,同时集群状态显示备节点没有正确连接到主节点。此外,repmgrd没有运行,这可能影响了监控和故障转移功能。
首先,我需要理解这些警告和状态的具体含义。`pg_stat_replication`是PostgreSQL的一个系统视图,用于显示当前活动的复制连接。如果主节点(node1)的这个视图中没有node2和node3,说明主节点没有检测到这两个备节点的复制连接。这可能意味着复制链路中断或配置错误。
接下来,用户提供的状态表中,node2和node3的Upstream列显示为“! node1”,这通常表示备节点配置中的上游节点(主节点)无法连接或存在通信问题。此外,repmgrd服务未运行,这会影响集群的自动故障转移和监控功能,可能导致问题未被及时发现。
现在需要分步骤排查可能的原因。首先,确认备节点的PostgreSQL服务是否正常运行,并且处于恢复模式。通过检查服务状态和运行`pg_is_in_recovery()`函数可以验证这一点。如果服务未启动或未正确配置,备节点无法连接到主节点。
然后,检查主节点上的复制连接。运行`SELECT * FROM pg_stat_replication;`查看是否有活跃的复制连接。如果没有,说明复制链路未建立,需要进一步排查网络和端口连通性。使用nc命令测试主节点的5432端口是否可达,以及psql连接测试,确保备节点能够成功连接到主节点。
网络问题解决后,需要检查主节点的pg_hba.conf文件,确保允许来自备节点的复制连接。正确的配置条目是必要的,否则备节点会被拒绝连接。此外,备节点的primary_conninfo参数必须正确指向主节点,包括正确的主机名、端口、用户名和密码。如果配置错误,备节点无法建立复制连接。
另一个可能的问题是复制槽的缺失。如果使用了复制槽,需要确保主节点上存在相应的复制槽,并且备节点在配置中指定了正确的`primary_slot_name`。复制槽的缺失可能导致WAL日志被过早删除,从而中断复制。
此外,用户的状态显示repmgrd未运行。repmgrd是负责监控和自动故障转移的守护进程,需要启动该服务以维持集群的健康状态。用户需要检查repmgrd的配置和日志,确保其正确运行。
如果以上步骤都确认无误,可能需要强制重新注册备节点,使用`repmgr standby follow --force`命令来重新建立复制链路。这可以解决元数据不一致的问题。
最后,用户需要验证修复后的集群状态,运行`repmgr cluster show`和检查pg_stat_replication视图,确保所有节点正常运行且复制连接已建立。同时,启动repmgrd服务以确保后续的监控和故障转移功能正常。
总结来说,用户的问题主要集中在复制链路的中断,可能由网络问题、配置错误或服务未运行引起。需要逐步排查每个环节,确认各节点的状态和配置,最终恢复复制连接并确保集群的稳定性。</think>---
当执行 `sudo -u postgres /usr/pgsql-15/bin/repmgr service status` 后出现以下警告和状态信息时:
```
WARNING: node "node2" not found in "pg_stat_replication"
WARNING: node "node3" not found in "pg_stat_replication"
```
以及集群状态表显示备节点未正确连接到主节点:
```
ID | Name | Role | Status | Upstream | repmgrd | PID | Paused? | Upstream last seen
----+-------+---------+-----------+----------+-------------+-----+---------+--------------------
1 | node1 | primary | * running | | not running | n/a | n/a | n/a
2 | node2 | standby | running | ! node1 | not running | n/a | n/a | n/a
3 | node3 | standby | running | ! node1 | not running | n/a | n/a | n/a
```
这表示 **主节点(node1)未检测到 node2 和 node3 的复制连接**,且 `repmgrd` 守护进程未运行(可能影响自动故障转移)。以下是关键问题和修复步骤:
---
### **核心问题分析**
1. **复制链路中断**
- 主节点的 `pg_stat_replication` 无备节点信息,说明复制连接未建立。
- 状态表中 `Upstream` 列的 `! node1` 表示备节点与主节点通信异常。
2. **`repmgrd` 未运行**
- `repmgrd` 是负责监控节点状态和自动故障转移的守护进程,未运行会导致集群管理功能失效。
---
### **分步解决方案**
#### **1. 启动 `repmgrd` 服务**
- **目标**:恢复集群监控和自动故障转移能力。
- **操作**:
```bash
# 在所有节点执行
sudo systemctl start repmgr15 # 根据实际版本调整服务名(如 repmgr12、repmgr14)
```
- **验证**:
```bash
repmgr service status
```
检查 `repmgrd` 列是否显示为 `running`。
---
#### **2. 修复备节点复制连接**
- **原因**:备节点无法连接到主节点,可能是网络、认证或配置错误。
- **操作步骤**:
1. **检查备节点日志**:
```bash
# 在 node2 和 node3 上执行
tail -n 100 $PGDATA/log/postgresql.log | grep -E "FATAL|ERROR"
```
关注以下错误:
- `could not connect to server`: 网络或端口不通。
- `password authentication failed`: 认证失败。
- `invalid primary_conninfo`: 配置错误。
2. **验证主节点连接**(从备节点发起):
```bash
# 在 node2 或 node3 上执行
psql "host=node1 port=5432 user=repmgr dbname=repmgr" -c "SELECT 1;"
```
- 若连接失败,检查主节点 `postgresql.conf` 的 `listen_addresses` 和防火墙规则。
3. **修正 `primary_conninfo`**:
- 在备节点的 `postgresql.auto.conf` 中检查以下配置:
```ini
primary_conninfo = 'host=node1 port=5432 user=repmgr password=xxx ...'
```
- 确保密码正确,且与主节点 `pg_hba.conf` 中配置的认证方式匹配。
4. **强制重建复制链路**:
```bash
# 在备节点执行(以 node2 为例)
repmgr standby follow -f /etc/repmgr.conf --force
```
---
#### **3. 检查主节点 `pg_hba.conf`**
- **关键配置**:确保主节点允许备节点以 `repmgr` 用户连接。
- **示例条目**:
```ini
# 允许 node2 和 node3 通过复制用户连接
host replication repmgr node2/32 scram-sha-256
host replication repmgr node3/32 scram-sha-256
```
- **重载配置**:
```bash
pg_ctl reload -D $PGDATA
```
---
#### **4. 验证复制槽(如使用)**
- **操作**:
```sql
-- 在主节点执行
SELECT slot_name, active FROM pg_replication_slots;
```
- 若复制槽未激活,需在备节点配置中添加 `primary_slot_name`:
```ini
primary_conninfo = '... primary_slot_name=repmgr_slot_2 ...'
```
---
#### **5. 最终状态验证**
1. **检查集群状态**:
```bash
repmgr cluster show
```
- 预期输出:所有节点 `Status` 为 `running`,`Upstream` 无 `!` 符号。
2. **检查主节点复制连接**:
```sql
psql -h node1 -c "SELECT application_name, state FROM pg_stat_replication;"
```
- 应显示 `node2` 和 `node3` 的复制连接状态为 `streaming`。
---
### **常见错误处理**
| 问题现象 | 解决方案 |
|------------------------------|--------------------------------------------------------------------------|
| `psql: error: connection refused` | 检查主节点 `listen_addresses` 和防火墙(确保 `5432` 端口开放)。 |
| `FATAL: no pg_hba.conf entry` | 在主节点 `pg_hba.conf` 添加备节点的复制权限条目。 |
| `repmgr: ERROR: replication slot "xxx" does not exist` | 在主节点手动创建复制槽:`SELECT pg_create_physical_replication_slot('xxx');` |
---
### **总结**
通过以上步骤,可以修复备节点与主节点的复制链路,并恢复 `repmgrd` 的监控功能。若问题持续,需结合主备节点的 PostgreSQL 日志(`$PGDATA/log/postgresql.log`)和 `repmgr` 日志(`/var/log/repmgr/repmgr.log`)进一步排查网络、配置或权限问题。
阅读全文
相关推荐












