PostgreSQL主从复制是构建高可用数据库架构的常见方案,但很多人在搭建过程中会遇到各种问题。本文将直接给出搭建步骤和常见错误的判断路径,帮助您快速定位问题。
搭建前的准备:明确复制方式与版本
PostgreSQL支持多种复制方式,如流复制(Streaming Replication)、逻辑复制(Logical Replication)等。本文以最常见的流复制为例,它基于WAL(Write-Ahead Logging)实现,适合大多数场景。在开始前,请确认主从库的版本一致(建议使用相同大版本),并确保网络连通、防火墙开放相应端口(默认5432)。
主库配置:开启归档与设置复制用户
主库需要修改postgresql.conf和pg_hba.conf两个文件。首先,在postgresql.conf中设置:
wal_level = replica
max_wal_senders = 10
wal_keep_size = 16MB # 或使用复制槽
然后,在pg_hba.conf中添加允许从库连接的规则,例如:
host replication repl_user 192.168.1.0/24 md5
创建复制用户:
CREATE USER repl_user REPLICATION LOGIN PASSWORD 'password';
重启主库使配置生效。
从库配置:基础备份与恢复
从库需要先获取主库的基础备份。使用pg_basebackup工具:
pg_basebackup -h 主库IP -U repl_user -D /var/lib/postgresql/data -P -R
-R参数会自动生成standby.signal文件并配置连接信息。然后启动从库,它会自动开始复制。
验证复制状态
在主库执行:
SELECT * FROM pg_stat_replication;
如果看到一条记录,说明复制已建立。在从库执行:
SELECT pg_is_in_recovery();
返回true表示从库处于恢复模式。
常见错误与排查路径
错误1:认证失败
如果从库连接时出现“password authentication failed”或“no pg_hba.conf entry”,请检查pg_hba.conf中复制用户的权限是否正确,并确认密码无误。注意,复制连接需要host replication条目,而不是普通的host all。
错误2:复制中断,WAL段丢失
如果从库长时间离线,主库的WAL文件可能被清理,导致复制中断。解决方法:使用复制槽(replication slot)或增大wal_keep_size。创建复制槽:
SELECT * FROM pg_create_physical_replication_slot('slot_name');
并在从库的primary_conninfo中加上slot_name参数。
错误3:时间线分歧
如果主库发生过故障切换,从库可能因时间线不匹配而无法连接。此时需要重新进行基础备份,或者使用pg_rewind工具(如果配置了hot_standby)。
错误4:复制延迟高
高延迟可能由网络带宽、从库磁盘I/O或大事务引起。可检查pg_stat_replication中的write_lag、flush_lag、replay_lag字段,并优化网络或调整参数。
常见误区与注意事项
- 误区一:认为主从复制是实时同步。实际上,从库数据存在延迟,无法保证强一致性。
- 误区二:忽略同步复制与异步复制的区别。同步复制可减少数据丢失,但会增加主库延迟。
- 注意事项:从库默认是只读的,不能写入;如果从库用于只读查询,要合理规划负载。
日志与监控:借鉴行业标准
搭建完成后,日志监控同样重要。根据OWASP日志安全速查表,应用日志应包含安全事件,并保持一致格式。PostgreSQL的日志可记录连接、错误等信息,建议开启并定期分析。同时,OpenTelemetry日志规范强调日志与其他可观测性信号的集成,您可以将PostgreSQL日志接入监控系统,便于故障排查。
总结
PostgreSQL主从复制的搭建并不复杂,但需要细心配置。遇到问题时,按照“检查认证→检查WAL→检查时间线→检查延迟”的顺序排查,通常能快速定位。如果涉及跨地域部署,可参考跨VPC挂载只读副本等实践。
参考资料
延伸阅读
