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库参数调整
$ 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机器上,创建 repl 用户:
postgres=# CREATE USER repl REPLICATION LOGIN ENCRYPTED PASSWORD 'pass0rd';
master库修改 pg_hba.conf 文件
$ vi pg_hba.conf
host replication repl 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();"
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 repl -c fast -X stream -v -P -R
-h, --host=HOSTNAME database server host or socket directory
-D, --pgdata=DIRECTORY receive base backup into directory
-U, --username=NAME connect as specified database user
-c, --checkpoint=fast|spread
set fast or spread checkpointing
-X, --xlog-method=fetch|stream
include required WAL files with specified method
--xlogdir=XLOGDIR location for the transaction log directory
-v, --verbose output verbose messages
-P, --progress show progress information
-R, --write-recovery-conf write recovery.conf for replication
slave 库 recovery.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=repl 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/
slave端也要修改 recovery.conf
primary_conninfo = 'host=192.168.56.201 port=5432 user=repl 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 = '*';