面试题答案
一键面试故障排查步骤
- 检查复制槽状态:
- 使用
pg_replication_slots
系统视图查看复制槽的基本信息,包括槽名称、插件、是否活动等。例如:
- 使用
SELECT * FROM pg_replication_slots;
- 关注 `confirmed_flush_lsn`、`restart_lsn` 等字段,判断复制进度和潜在问题。
2. 确认主从节点连接:
- 在主节点上,检查 postgresql.conf
中的 wal_level
是否设置为 replica
或更高,确保开启了复制所需的日志级别。
- 检查主从节点间网络连接,使用 ping
和 traceroute
工具确认网络是否通畅,是否存在高延迟或丢包。
- 在从节点上,检查 recovery.conf
(或 postgresql.auto.conf
中关于复制的配置),确保连接字符串正确,如 primary_conninfo
配置项。
3. 分析复制延迟原因:
- 查看主节点的 WAL 生成速率,通过 pg_stat_activity
视图检查长时间运行的事务,这些事务可能会阻止 WAL 归档和复制。例如:
SELECT pid, query, state FROM pg_stat_activity WHERE state = 'active' AND query NOT ILIKE '%pg_stat_activity%';
- 检查从节点的复制应用速率,通过 `pg_stat_replication` 视图(在主节点上)查看从节点的 `write_lag`、`flush_lag` 和 `replay_lag` 等字段,判断延迟情况。例如:
SELECT * FROM pg_stat_replication;
- 检查从节点的系统资源,如 CPU、内存、磁盘 I/O 等,高负载可能导致复制延迟。使用 `top`、`iostat` 等系统工具进行分析。
4. 排查复制中断问题:
- 查看主从节点的日志文件(postgresql.log
),搜索与复制相关的错误信息,如认证失败、连接断开等。
- 检查主节点上是否有 WAL 归档失败的情况,查看归档日志目录和相关配置,确保 WAL 归档正常进行。
- 在从节点上,检查 pg_xlog
(或 pg_wal
从 PostgreSQL 10 开始)目录,确认 WAL 文件是否正常接收和应用。
可能用到的工具
- SQL 命令:如上述提到的
pg_replication_slots
、pg_stat_activity
、pg_stat_replication
等系统视图相关的 SQL 查询命令,用于获取复制相关的状态信息。 - 系统工具:
ping
用于检测网络连通性,traceroute
用于跟踪网络路由,top
用于查看系统资源使用情况,iostat
用于分析磁盘 I/O 性能。 - 日志分析工具:文本编辑器(如
vim
、nano
)用于查看postgresql.log
日志文件,分析其中的错误信息。
恢复复制槽正常工作并保证数据一致性和完整性
- 处理复制延迟:
- 如果是长时间运行的事务导致 WAL 生成缓慢,尝试与应用团队沟通,优化或回滚这些事务。
- 如果从节点系统资源不足,考虑增加资源(如 CPU、内存)或优化从节点上其他进程的资源使用。
- 可以尝试在从节点上使用
pg_replication_slot_advance
函数(如果适用),手动推进复制进度,但需谨慎操作,确保数据一致性。
- 处理复制中断:
- 如果是网络问题,修复网络连接后,从节点通常会自动尝试重新连接主节点并恢复复制。
- 如果是认证问题,检查并修复主从节点间的认证配置,如
pg_hba.conf
文件中的相关配置项。 - 如果从节点数据损坏或 WAL 应用出现错误,可以尝试使用
pg_basebackup
工具重新创建从节点。首先在主节点上创建一个新的复制槽(如果需要),然后在从节点上停止 PostgreSQL 服务,删除数据目录(确保备份重要数据),使用pg_basebackup
重新获取主节点的数据,并重新配置从节点的复制相关参数,启动服务恢复复制。例如:
pg_basebackup -h master_host -U replication_user -D /var/lib/postgresql/data -X stream -P
在整个恢复过程中,为了不影响业务,可采取以下措施:
- 在应用层面,使用读写分离架构,将读请求导向从节点,在恢复从节点时,可暂时减少或停止从节点的读负载。
- 对于关键业务数据,可在恢复操作前进行备份,确保在出现意外情况时能够快速恢复数据。
- 操作尽量选择在业务低峰期进行,以减少对业务的影响。