流复制通过主库发送WAL日志、备库接收并应用实现数据同步。需配置主库wal_level、max_wal_senders、pg_hba.conf允许复制连接,使用pg_basebackup创建基础备份,备库启用hot_standby并启动服务;验证通过pg_stat_replication和pg_is_in_recovery()检查状态,注意网络、权限、WAL保留策略及磁盘空间。

在PostgreSQL的世界里,流复制(Streaming Replication)无疑是构建高可用和数据冗余基石的关键技术。简单来说,它就是让你的数据有一个或多个实时备份,以防不测,或者分担读请求的压力。配置和建立流复制数据源,核心就在于主库(Primary)和备库(Standby)之间,通过传输和应用预写日志(WAL)来达到数据同步的目的。
说实话,第一次接触流复制,光是看着那些配置参数就有点头大。但一旦理解了背后的逻辑,其实也就那么回事。核心在于让主库知道它需要发送WAL日志,让备库知道它需要接收并应用这些日志。整个过程可以粗略分成几步,每一步都有其考量。
解决方案
配置和建立PostgreSQL流复制数据源,通常涉及主库的准备、基础备份的创建以及备库的配置启动。
1. 主库(Primary)配置
首先,我们需要调整主库的一些参数,使其能够支持流复制。这主要在
postgresql.conf
pg_hba.conf
修改 postgresql.conf
wal_level = replica
hot_standby
logical
replica
max_wal_senders = 10
wal_keep_size = 5GB
pg_wal
listen_addresses = '*'
hot_standby = on
# postgresql.conf (Primary) wal_level = replica max_wal_senders = 10 wal_keep_size = 5GB # 或者根据实际情况调整 listen_addresses = '*'
修改 pg_hba.conf
replication
192.168.1.100
repl_user
# pg_hba.conf (Primary) host replication repl_user 192.168.1.100/32 md5
请确保
repl_user
replication
重启主库: 所有配置更改后,需要重启PostgreSQL服务以使之生效。
2. 创建基础备份(Base Backup)
在主库配置完成后,我们需要从主库创建一个完整的数据备份,作为备库的起点。这个过程通常使用
pg_basebackup
在备库机器上执行: 选择一个空目录作为备库的数据目录,然后运行
pg_basebackup
# 假设备库数据目录是 /var/lib/postgresql/14/main_standby # -h: 主库地址 # -p: 主库端口 # -U: 复制用户 # -D: 备库数据目录 # -Fp: plain格式,非tar # -Xs: streaming模式,复制WAL日志 # -R: 自动生成 recovery.conf (或 standby.signal 和 postgresql.auto.conf) pg_basebackup -h <primary_ip> -p 5432 -U repl_user -D /var/lib/postgresql/14/main_standby -Fp -Xs -R
执行此命令时,会提示输入
repl_user
standby.signal
recovery.conf
3. 备库(Standby)配置与启动
修改 postgresql.conf
hot_standby = on
primary_conninfo = 'host=<primary_ip> port=5432 user=repl_user password=<password>'
restore_command = 'cp /path/to/archive/%f %p'
# postgresql.conf (Standby) hot_standby = on # primary_conninfo 通常由 pg_basebackup -R 自动生成在 postgresql.auto.conf 中, # 但你也可以手动添加或修改。 # primary_conninfo = 'host=<primary_ip> port=5432 user=repl_user password=<password>'
请注意,
pg_basebackup -R
postgresql.auto.conf
primary_conninfo
启动备库: 启动备库的PostgreSQL服务。它会自动读取
standby.signal
recovery.conf
systemctl start postgresql-14 # 或你的PostgreSQL服务名
流复制的核心原理是什么?为什么我们需要它?
这事儿听起来简单,但背后的原理其实挺精妙的。WAL日志,你可以理解为数据库的所有变更记录,它保证了数据的一致性和持久性。PostgreSQL在任何数据写入磁盘之前,都会先将这些变更写入到WAL日志中。流复制,就是把这些日志实时地从主库“快递”到备库,备库再按顺序“播放”这些变更,将其应用到自己的数据文件中。这个过程是物理级别的复制,效率很高。
至于为什么我们需要它,除了显而易见的数据安全,还有几个关键点:
对我来说,流复制不仅仅是一个技术配置,它更是一种风险管理策略。尤其是在生产环境中,没有流复制的数据库,就像走钢丝没有安全网,心里总是不踏实。
配置流复制时,有哪些常见的“坑”和注意事项?
我个人觉得,流复制最容易出问题的地方往往不是配置本身,而是对细节的忽略和环境的差异。比如网络延迟,有时能把人折腾疯。还有WAL日志的管理,这绝对是个重灾区。
ufw
firewalld
wal_keep_size
wal_keep_size
wal_keep_size
archive_mode
pg_hba.conf
pg_hba.conf
replication
repl_user
replication
primary_conninfo
pg_auto_failover
Patroni
如何验证流复制是否正常工作,以及故障排查的初步思路?
配置完流复制,别以为就万事大吉了。最关键的是要确认它真的在工作,而且是健康地工作。我见过太多次,配置好了,但一检查发现备库早就掉队了,或者干脆就没连上。所以,定期的检查和一套初步的排查思路是必不可少的。
验证流复制状态:
在主库上检查 pg_stat_replication
SELECT client_addr, state, sync_state, sync_priority, replay_lag, write_lag, flush_lag FROM pg_stat_replication;
client_addr
state
streaming
sync_state
sync
async
replay_lag
在备库上检查 pg_is_in_recovery()
SELECT pg_is_in_recovery();
如果返回
t
f
检查数据库日志文件: 主备库的PostgreSQL日志文件(通常在数据目录的
log
写入测试数据并验证: 如果备库设置为
hot_standby = on
故障排查的初步思路:
当发现流复制不正常时,可以按照以下步骤进行排查:
网络连通性检查: 首先确认主备库之间网络是否畅通。从备库
ping
telnet <primary_ip> 5432
主库 pg_hba.conf
pg_hba.conf
replication
repl_user
主库 postgresql.conf
wal_level = replica
max_wal_senders
备库日志文件: 仔细查看备库的PostgreSQL日志。它通常会告诉你为什么连接不上主库,或者为什么无法应用WAL。常见的错误信息包括“could not connect to server”、“FATAL: password authentication failed”、“WAL segment xxx not found”等。
wal_keep_size
wal_keep_size
restore_command
备库磁盘空间: 检查备库的数据目录所在分区是否有足够的空间。磁盘满会导致WAL无法写入,复制中断。
primary_conninfo
postgresql.auto.conf
postgresql.conf
primary_conninfo
排查问题就像侦探破案,需要耐心和细致。从最基础的网络和权限开始,逐步深入到配置参数和日志分析,通常都能找到症结所在。
以上就是PostgreSQL流复制数据源配置_PostgreSQL流复制数据源建立的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号