pg_basebackup 配置 stream replication 异步/同步

os :oel 6.8
postgresql: 9.6.3

PostgreSQL9.0 standby数据库在应用WAL日志的同时,也可以提供只读服务,
这是PostgreSQL9.0中最激动人心的功能,这个功能在oracle数据库中也只是最新版本11g中才有的新功能。
这个功能在oracle中叫 active dataguard,在PostgreSQL中称为 hot standby。

在利用日志恢复数据的同时可以用只读的方式打开数据库,用户可以在备用数据库上进行查询、报表等操作,也可用做读写分离。

在PostgreSQL9.0之前,也可以搭建standby数据库,但standby数据库只能处于恢复状态中,不能打开,也不支持只读打开。
而这种情况在9.0之后彻底改变了。

PostgreSQL 9.0中日志传送的方法有两种:

基于文件(base-file)的传送方式,这种方式是PostgreSQL9.0之前就提供的方法。
也就是服务器写完一个WAL日志文件后,才把WAL日志文件拷贝到standby数据库上去应用。类似于oracle dg 的 arch 方式

流复制(streaming replication)的方法,这是PostgreSQL9.0才提供的新方法。
这个方法就是事务提交后,就会把生成的日志异步的传送到standby数据库上应用,
这比基本文件的日志传送方法有更低的数据延迟。类似于oracle dg 的 lgwr sync/async 方式

master 库创建复制用户

master库参数调整

$ vi postgresql.conf

alter system set listen_addresses = '0.0.0.0';
alter system set port = '5432';

alter system set wal_level = 'logical';
alter system set fsync = on;
alter system set synchronous_commit = on;
alter system set wal_sync_method = fdatasync;
alter system set full_page_writes = on;
alter system set wal_log_hints = on;

alter system set wal_keep_segments = '100';
alter system set max_wal_senders = '10';

alter system set hot_standby = 'on';

alter system set archive_mode = 'on';
alter system set archive_command = 'cp %p /mnt/pgarchive/%f < /dev/null';
alter system set archive_timeout = '300';

listen_addresses = ‘*’ 表示在所有的ipv4、ipv6地址上添加监听
listen_addresses = ‘0.0.0.0’ 表示在所有的ipv4地址上添加监听

master库重启

$ pg_ctl stop -m fast -D /var/lib/pgsql/9.6/main/
$ pg_ctl start -D /var/lib/pgsql/9.6/main/

master机器上,创建 replicator 用户:

$ psql
CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'pass0rd';

master库修改 pg_hba.conf 文件

$ vi pg_hba.conf
host     replication     replicator        192.168.56.0/24         md5

$ psql -c "select pg_reload_conf();"

说明允许用户postgres 从192.168.56.0/24 网络上发起到本地数据库的流复制,使用md5

master切换日志

$ psql -c "select pg_switch_xlog();"

slave库参数调整

postgresql停止的前提下,删除data目录的内容:

$ rm -rf /var/lib/pgsql/9.6/main/

slave库修改参数

$ vi postgresql.conf

wal_level = 'logical'
fsync = on
synchronous_commit = on
wal_sync_method = fdatasync
full_page_writes = on
wal_log_hints = on

wal_keep_segments = '100'
max_wal_senders = '10'
hot_standby = 'on'

slave库执行 pg_basebackup 拉取文件

$ pg_basebackup -h 192.168.56.201 -D /var/lib/pgsql/9.6/main/ -U replicator -v -P -R

-D, --pgdata=DIRECTORY receive base backup into directory
-v, --verbose          output verbose messages
-P, --progress         show progress information
-R, --write-recovery-conf  write recovery.conf for replication

slave库ecovery.conf文件

$ vi /var/lib/pgsql/9.6/main/recovery.conf

#restore_command = ''
#archive_cleanup_command = ''
standby_mode = 'on'
recovery_target_timeline = 'latest'
primary_conninfo='host=192.168.56.201 port=5432 user=replicator password=pass0rd'
trigger_file = '/tmp/postgresql.trigger'

slave启动服务

$ pg_ctl start -D /var/lib/pgsql/9.6/main/

数据验证

master端查看replication状态

select * from pg_stat_replication ;
select client_addr,
           pg_xlog_location_diff(sent_location, write_location) as write_delay,
           pg_xlog_location_diff(sent_location, flush_location) as flush_delay,
           pg_xlog_location_diff(sent_location, replay_location) as replay_delay 
  from pg_stat_replication;

同步复制

alter system set synchronous_commit = 'on';
alter system set synchronous_standby_names = '*';    

pg_ctl restart -D /var/lib/pgsql/9.6/main/

pg_ctl reload -D /var/lib/pgsql/9.6/main/
select pg_reload_conf();

slave端也要修改 recovery.conf

primary_conninfo = 'host=192.168.56.201 port=5432 user=replicator password=pass0rd application_name=node2'

增加了 application_name=node2
不过采用同步的方式最好配置多台slave,防止单台slave宕机导致master上无法执行事务

alter system set synchronous_standby_names = 'node2,node3'; 
或者
alter system set synchronous_standby_names = '*'; 
原文地址:https://www.cnblogs.com/ctypyb2002/p/9792901.html