Ubuntu环境下PostgreSQL数据同步策略
主从复制是PostgreSQL最核心的同步策略,通过WAL(Write-Ahead Logging)日志实现主库数据向备库的传输,分为异步复制(默认)和同步复制两种模式,适用于高可用、读写分离等场景。
sudo apt-get install postgresql-15 postgresql-contrib安装最新稳定版(以15为例)。listen_addresses = '*' # 监听所有IP地址
wal_level = replica # 设置WAL级别为replica(支持复制)
max_wal_senders = 10 # 允许最多10个复制连接
wal_keep_size = 1024 # 保留WAL日志大小(MB),避免备库断开后丢失日志
archive_mode = on # 开启归档模式(可选,用于长期保存WAL)
archive_command = 'test !-f /pg_archive/%f && cp %p /pg_archive/%f' # 归档命令(可选)
host replication repl_user 192.168.1.20/32 md5
重启PostgreSQL使配置生效:sudo systemctl restart postgresql-15。CREATE ROLE repl_user WITH REPLICATION LOGIN PASSWORD 'YourStrongPassword123!' CONNECTION LIMIT 1;
sudo systemctl stop postgresql-15。rm -rf /var/lib/pgsql/15/data/*
pg_basebackup工具从主库同步数据(推荐-R参数自动生成standby配置):sudo -u postgres pg_basebackup -h 192.168.1.10 -U repl_user -D /var/lib/pgsql/15/data/ -Fp -Xs -P -R
若未使用-R,需手动创建standby.signal文件(touch /var/lib/pgsql/15/data/standby.signal)并配置postgresql.auto.conf:primary_conninfo = 'host=192.168.1.10 port=5432 user=repl_user password=YourStrongPassword123!'
sudo systemctl start postgresql-15。pg_stat_replication视图,确认备库是否连接并同步:SELECT application_name, client_addr, state, sync_state
FROM pg_stat_replication;
正常结果应显示state=streaming(正在流式传输)、sync_state=async(异步同步)。SELECT pg_is_in_recovery(); -- 返回t表示备库正常
为避免主库宕机导致服务中断,需引入自动故障转移和集群管理工具,提升系统可靠性。
sudo apt-get install patroni。/etc/patroni.yml(以etcd为协调服务):scope: postgres_cluster
namespace: /db/
name: postgres-primary
restapi:
listen: 0.0.0.0:8008
connect_address: 192.168.1.10:8008
etcd:
hosts:
- 192.168.1.10:2379
- 192.168.1.20:2379
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
wal_level: replica
max_wal_senders: 10
wal_keep_size: 1024
hot_standby: on
initdb:
- encoding: UTF8
- locale: en_US.UTF-8
pg_hba:
- host replication repl_user 192.168.1.20/32 md5
- host all all 0.0.0.0/0 md5
postgresql:
listen: 0.0.0.0:5432
connect_address: 192.168.1.10:5432
data_dir: /var/lib/pgsql/15/data
bin_dir: /usr/pgsql-15/bin
authentication:
replication:
username: repl_user
password: YourStrongPassword123!
superuser:
username: postgres
password: YourSuperUserPassword123!
parameters:
unix_socket_directories: '/var/run/postgresql'
tags:
nofailover: false
noloadbalance: false
sudo patroni /etc/patroni.yml。逻辑复制允许按表级别同步数据,支持不同PostgreSQL版本之间的同步,适用于数据分发、跨数据库集成等场景。
postgresql.conf启用逻辑复制:wal_level = logical # 设置WAL级别为logical
max_replication_slots = 10 # 允许的最大复制槽数量
max_wal_senders = 10 # 允许的最大复制连接数
修改pg_hba.conf允许备库连接:host replication repl_user 192.168.1.20/32 md5
重启PostgreSQL:sudo systemctl restart postgresql-15。CREATE PUBLICATION my_pub FOR TABLE my_table;
CREATE SUBSCRIPTION my_sub
CONNECTION 'host=192.168.1.10 port=5432 user=repl_user password=YourStrongPassword123!'
PUBLICATION my_pub;
pgsync是一款现代化的PostgreSQL数据同步工具,支持零停机迁移、并行传输、模式自动适配,适用于开发和生产环境同步。
在Ubuntu上通过gem安装:
sudo apt-get install ruby-dev libpq-dev build-essential -y
sudo gem install pgsync
在项目根目录创建.pgsync.yml文件,定义源和目标数据库:
from: postgres://postgres:YourSourcePassword@192.168.1.10:5432/source_db?sslmode=require
to: postgres://postgres:YourTargetPassword@192.168.1.20:5432/target_db?sslmode=require
exclude:
- sensitive_table1
- sensitive_table2
schemas:
- public
data_rules:
email: unique_email # 自定义数据规则(如去重)
pgsync --schema-only(仅同步表结构)。pgsync(同步结构和数据)。pgsync table1,table2。pg_stat_replication视图定期检查复制延迟,设置告警(如Zabbix、Prometheus)。sslmode=require)、限制复制用户权限、使用强密码。