Pgpool-II 日志解析指南

Pgpool-II 日志解析指南

1. 概述

Pgpool-II 生成的日志是排查问题和监控系统健康状况的重要资源。本文档提供了对 Pgpool-II 常见日志消息的详细解析,帮助管理员理解日志含义并采取适当的行动。

2. 日志格式

Pgpool-II 的标准日志格式如下:

1
pgpool [进程类型] pid 进程ID: 日志级别: 日志消息

例如:

1
pgpool [unknown] pid 179: LOG:  status_changed_time

其中:

  • 进程类型:可能是 main、child、pcp 或 unknown
  • 进程ID:生成日志的进程 ID
  • 日志级别:如 LOG、WARNING、ERROR、FATAL 等
  • 日志消息:具体的日志内容

3. 常见日志类型解析

3.1 状态变更日志

状态变更时间记录

1
pgpool [unknown] pid 179: LOG:  status_changed_time

这是一个标记,表示节点状态发生了变化。通常会伴随更详细的日志一起出现。

详细状态变更

1
pgpool [unknown] pid 179: LOG:  status_changed_time: old status:1 new status:2 node id:1

这表示节点 1 的状态从 1 (主节点) 变为 2 (备节点)。

节点状态码含义

  • 0: 节点宕机
  • 1: 节点在线,作为主节点
  • 2: 节点在线,作为备节点
  • 3: 节点在恢复中

3.2 故障转移日志

故障转移触发

1
pgpool [unknown] pid 179: LOG:  failover triggered by node 0 being down

节点 0 宕机触发了故障转移过程。

选择新主节点

1
pgpool [unknown] pid 179: LOG:  selected node 1 as new primary

选择节点 1 作为新的主节点。

故障转移过程

1
2
3
4
pgpool [unknown] pid 179: LOG:  starting failover
pgpool [unknown] pid 179: LOG:  failover command: /etc/pgpool-II/failover.sh 0 postgres-primary 5432 /var/lib/postgresql/data 1 postgres-replica 5432 /var/lib/postgresql/data 0 0
pgpool [unknown] pid 179: LOG:  failover command completed with success
pgpool [unknown] pid 179: LOG:  failover completed successfully

这组日志记录了完整的故障转移过程:

  1. 开始故障转移
  2. 执行故障转移命令
  3. 故障转移命令成功完成
  4. 故障转移成功完成

3.3 连接相关日志

新连接

1
pgpool [child0] pid 180: LOG:  connection received: host=192.168.1.10 port=45678

接收到来自 192.168.1.10:45678 的新连接。

连接认证

1
2
pgpool [child0] pid 180: LOG:  authentication failed for user "postgres"
pgpool [child0] pid 180: ERROR:  password authentication failed for user "postgres"

用户 “postgres” 的认证失败,密码错误。

连接池状态

1
2
pgpool [child0] pid 180: LOG:  pool_connection_pool: Creating pool for node 0 database:postgres user:postgres
pgpool [child0] pid 180: LOG:  pool_connection_pool: Creating pool for node 1 database:postgres user:postgres

为节点 0 和节点 1 创建连接池。

3.4 健康检查日志

健康检查开始

1
pgpool [health_check0] pid 181: LOG:  health check started for node 0

开始对节点 0 进行健康检查。

健康检查成功

1
pgpool [health_check0] pid 181: LOG:  health check succeeded for node 0

节点 0 的健康检查成功。

健康检查失败

1
2
pgpool [health_check0] pid 181: WARNING:  health check failed for node 0
pgpool [health_check0] pid 181: LOG:  health check retrying for node 0 (1/3)

节点 0 的健康检查失败,正在进行第 1 次重试(共 3 次)。

节点宕机

1
2
pgpool [health_check0] pid 181: WARNING:  health check failed for node 0 (3/3)
pgpool [health_check0] pid 181: LOG:  set node 0 status to NODE_DOWN

节点 0 的健康检查连续 3 次失败,将节点状态设置为宕机。

3.5 负载均衡日志

查询路由

1
2
pgpool [child0] pid 180: LOG:  statement: SELECT * FROM users WHERE id = 1
pgpool [child0] pid 180: LOG:  routing query to node 0

将查询 “SELECT * FROM users WHERE id = 1” 路由到节点 0。

负载均衡决策

1
pgpool [child0] pid 180: LOG:  load balancing node: 1

负载均衡选择了节点 1 处理请求。

3.6 复制延迟日志

1
2
pgpool [child0] pid 180: LOG:  replication delay for node 1 is 10 seconds
pgpool [child0] pid 180: WARNING:  replication delay for node 1 exceeds threshold (10 > 5)

节点 1 的复制延迟为 10 秒,超过了设定的阈值 5 秒。

3.7 启动和关闭日志

启动日志

1
2
3
4
pgpool [main] pid 179: LOG:  starting Pgpool-II 4.3.0
pgpool [main] pid 179: LOG:  setting up socket for 0.0.0.0:5432
pgpool [main] pid 179: LOG:  setting up socket for 0.0.0.0:9898
pgpool [main] pid 179: LOG:  Pgpool-II successfully started

这组日志记录了 Pgpool-II 的启动过程。

关闭日志

1
2
3
4
pgpool [main] pid 179: LOG:  shutting down
pgpool [main] pid 179: LOG:  waiting for all children to exit
pgpool [main] pid 179: LOG:  all children have exited
pgpool [main] pid 179: LOG:  Pgpool-II shutdown complete

这组日志记录了 Pgpool-II 的关闭过程。

4. 错误日志分析

4.1 常见错误模式

连接错误

1
2
pgpool [child0] pid 180: ERROR:  connection to backend failed
pgpool [child0] pid 180: DETAIL:  host=postgres-primary port=5432 was not reachable

无法连接到后端数据库服务器。

配置错误

1
2
pgpool [main] pid 179: ERROR:  invalid value for parameter "max_pool": 0
pgpool [main] pid 179: DETAIL:  max_pool must be between 1 and 65535

配置参数 “max_pool” 的值无效。

认证错误

1
pgpool [child0] pid 180: ERROR:  pool_passwd file does not contain entry for "postgres"

pool_passwd 文件中没有用户 “postgres” 的条目。

4.2 严重错误

1
2
pgpool [main] pid 179: FATAL:  failed to bind socket: Address already in use
pgpool [main] pid 179: HINT:  Another Pgpool-II process is using the port 5432

无法绑定到端口 5432,可能是另一个 Pgpool-II 进程正在使用该端口。

5. 日志分析工具

5.1 使用 grep 分析日志

1
2
3
4
5
6
7
8
# 查找所有故障转移相关的日志
grep "failover" /var/log/pgpool/pgpool.log

# 查找特定节点的健康检查失败
grep "health check failed for node 0" /var/log/pgpool/pgpool.log

# 查找状态变更日志
grep "status_changed_time" /var/log/pgpool/pgpool.log

5.2 使用 Loki 和 Grafana 分析日志

在 Grafana 中,可以使用以下 LogQL 查询来分析 Pgpool-II 日志:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 查找所有故障转移日志
{job="pgpool"} |= "failover"

# 查找所有状态变更日志
{job="pgpool"} |= "status_changed_time"

# 查找所有错误日志
{job="pgpool"} |= "ERROR"

# 查找特定节点的健康检查失败
{job="pgpool"} |= "health check failed" |= "node 0"

6. 常见问题排查

6.1 节点频繁宕机

如果日志中频繁出现节点宕机和恢复的记录,可能的原因包括:

  1. 网络不稳定
  2. 健康检查超时设置过短
  3. 数据库服务器负载过高
  4. 数据库服务器资源不足

排查步骤

  1. 检查网络连接质量
  2. 增加健康检查超时时间和重试次数
  3. 监控数据库服务器的负载和资源使用情况
  4. 检查数据库服务器的错误日志

6.2 连接池耗尽

如果日志中出现大量连接错误,可能是连接池耗尽:

1
pgpool [child0] pid 180: ERROR:  connection pool for database "postgres" user "postgres" is full (max_pool = 4)

排查步骤

  1. 增加 max_pool 参数的值
  2. 检查应用程序是否正确关闭连接
  3. 监控连接池使用情况
  4. 考虑使用连接池中间件

6.3 复制延迟过高

如果日志中频繁出现复制延迟警告,可能的原因包括:

  1. 主节点写入负载过高
  2. 备节点硬件性能不足
  3. 网络带宽不足
  4. WAL 生成速度过快

排查步骤

  1. 监控主节点的写入负载
  2. 检查备节点的硬件资源
  3. 测试网络带宽和延迟
  4. 优化写入密集型查询

7. 最佳实践

7.1 日志配置建议

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 生产环境推荐的日志配置
log_destination = 'stderr'
logging_collector = on
log_directory = '/var/log/pgpool'
log_filename = 'pgpool-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 100MB

# 日志级别
log_min_messages = 'warning'  # 生产环境推荐 warning 级别
log_line_prefix = '%t: pid %p: '

# 关键事件日志
log_connections = on
log_disconnections = on
log_hostname = on
log_statement = 'none'  # 生产环境不建议记录所有查询
log_per_node_statement = off
log_standby_delay = 'always'

# 慢查询日志
log_min_duration_statement = 5000  # 记录执行时间超过5秒的查询

7.2 日志监控建议

  1. 设置日志聚合系统,如 ELK Stack 或 Loki
  2. 配置关键词告警,如 “failover”、“ERROR”、“FATAL”
  3. 创建日志可视化仪表板
  4. 设置日志保留策略
  5. 定期审查日志

8. 附录:日志级别说明

Pgpool-II 使用以下日志级别:

  • DEBUG:详细的调试信息,仅在排查问题时使用
  • INFO:提供信息性消息,通常不需要管理员干预
  • LOG:常规操作信息,如连接、查询路由等
  • WARNING:潜在问题的警告,可能需要关注
  • ERROR:操作失败,但 Pgpool-II 仍在运行
  • FATAL:导致特定连接终止的错误
  • PANIC:导致所有连接终止的严重错误

在生产环境中,建议将日志级别设置为 WARNING 或 LOG,以减少日志量并捕获重要事件。

0%