在Debian系统上实现PostgreSQL数据库的数据同步,可以采用多种方法。以下是一些常见的方法:
这是最基本的备份和恢复方法。
pg_dump -U username -d database_name -F c -b -v -f backup_file.dump
pg_restore -U username -d database_name backup_file.dump
这种方法适用于物理复制,可以实现主从同步。
编辑postgresql.conf文件,启用归档模式和WAL日志记录:
wal_level = replica
max_wal_senders = 10
wal_keep_segments = 64
archive_mode = on
archive_command = 'test ! -f /var/lib/postgresql/9.x/main/archive/%f && cp %p /var/lib/postgresql/9.x/main/archive/%f'
编辑pg_hba.conf文件,允许从服务器连接:
host replication replica_user 192.168.1.100/32 md5
重启PostgreSQL服务:
sudo systemctl restart postgresql
创建一个基础备份:
pg_basebackup -U username -D /var/lib/postgresql/9.x/main -X stream -P --wal-method=stream
停止PostgreSQL服务:
sudo systemctl stop postgresql
删除现有的数据目录(如果有的话):
sudo rm -rf /var/lib/postgresql/9.x/main
从主服务器复制基础备份:
sudo rsync -a --progress /var/lib/postgresql/9.x/main/ replica:/var/lib/postgresql/9.x/main/
编辑postgresql.conf文件,设置primary_conninfo:
primary_conninfo = 'host=master_ip port=5432 user=replica_user password=password'
编辑pg_hba.conf文件,允许从服务器连接:
host replication replica_user 192.168.1.100/32 md5
启动PostgreSQL服务:
sudo systemctl start postgresql
pglogical是一个逻辑复制工具,适用于更复杂的场景。
sudo apt-get install pglogical
SELECT pglogical.create_node(
node_name := 'primary',
dsn := 'host=master_ip dbname=database_name user=username password=password'
);
SELECT pglogical.create_replication_set('default_set');
SELECT pglogical.replication_set_add_table(
set_name := 'default_set',
table_name := 'table_name',
if_not_exists := TRUE
);
SELECT pglogical.create_node(
node_name := 'replica',
dsn := 'host=replica_ip dbname=database_name user=username password=password'
);
SELECT pglogical.create_subscription(
subscription_name := 'default_subscription',
provider_dsn := 'host=master_ip dbname=database_name user=username password=password',
replication_sets := '{default_set}',
forward := TRUE,
create_slot := TRUE,
slot_name := 'replication_slot'
);
Patroni是一个高可用性和故障转移管理工具,可以与PostgreSQL结合使用。
sudo apt-get install patroni
创建一个patroni.yml文件,配置主服务器和从服务器。
scope: postgresql
name: master
restapi:
listen: 0.0.0.0:8008
connect_address: master_ip
etcd:
host: etcd_ip:2379
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_segments: 64
hot_standby: on
data_dir: /var/lib/postgresql/9.x/main
pg_hba:
- host replication replica_user 192.168.1.100/32 md5
- host all all 0.0.0.0/0 md5
start: true
stop: true
sudo patroni patroni.yml
以上方法可以根据具体需求选择使用。对于简单的备份和恢复,pg_dump和pg_restore是最简单的方法;对于实时同步,pglogical和Patroni是更好的选择。