pgsql复制的三种模式:
1. 基于日志文件的复制
Master库向Standby库异步传输WAL日志,Standby解析日志并把日志中的操作重新回放,这种复制模式需要等待Master库将整个WAL日志填充完毕后才发送给Standby库,如果中途发生宕机,那么事物都会丢失。
2. 异步流复制模式
Master库以流模式向Standby库异步传输WAL日志,Standby解析收到的日志并把其中的操作重新回放。相比第一种,这种模式不需要等待WAL填充完毕,在Master提交事物后,会持续把数据流传输到Standby库,如果发生宕机,只会丢失掉最后一个事物。
3. 流同步复制模式(Synchronous Replication)
流复制模式的同步版本。Master库发出commit命令后,命令会被阻塞,等待所有Standby库上都提交后,才会真正提交。这种模式是最安全的模式,不过在网络繁忙或者IO繁忙的系统中,性能极其容易损耗。
准备两台服务器:
主:192.168.89.52
从:192.168.89.154
主服务器上的操作:
1、创建一个复制账号replica:
CREATE USER replica replication encrypted password 'replica';
2、配置从服务器允许访问主服务器:
修改pg_hba.cnf,在最后一行增加replica用户可以访问:
host replication replica 192.168.89.154/32 md5
3、修改postgresql.conf配置文件的REPLICATION下的Sending Server和Master Server部分:
Sending Server段:
max_wal_senders:指定来自从服务器的最大连接数
wal_keep_segments:指定从服务器在流复制的情况下,pg_xlog目录所能保留过去日志文件段的最小数
wal_sender_timeout :中断超过活动时间的连接
track_commit_timestamp:记录事物提交时间
Master Server段:
synchronous_standby_names:支持同步复制的参数,指定需要同步复制的服务器列表
vacuum_defer_cleanup_age:指定清理MVCC版本前,应推迟多少个事物
4、重启主服务器:
pg_ctl -D /usr/local/pgsql/data restart
从服务器配置:
1、如果已经初始化了数据目录,那么清空数据目录:
rm -rf data/*
2、利用pg_basebackup命令进行热备份,复制主服务器的整个数据目录到从服务器上:
pg_basebackup必须由超级用户或者具有REPLICATION权限的用户执行,切g_hba.conf必须允许该host建立连接,最后max_wal_senders必须要配置足够高以留出至少一个会话用于备份。
./pg_basebackup -F p -P -R -D /usr/local/pgsql/data -h 192.168.89.52 -p 15432 -U replica -W
参数说明:
-F:输出格式
-P:显示进程信息
-R:备份结束后自动生成recovery.conf文件
-D:指定输出的数据目录,目录需要清空
-h:指定host
-U:指定用户
-p:指定端口号
-W:强制使用密码模式
3、编辑recovery.conf文件,如果没有,可以创建一个:
cat recovery.conf
standby_mode = on #指定这是一个从服务器
primary_conninfo = 'host=192.168.89.52 port=15432 user=replica password=replica' #配置主服务器信息
recovery_target_timeline = 'latest' #指定同步到最新数据
4、修改postgresql.conf配置文件的REPLICATION下的Standby Servers部分:
Standby Servers段:
hot_standby = on # 说明这台机器不仅仅是用于数据归档,也用于数据查询
max_standby_streaming_delay = 30s # 数据流备份的最大延迟时间
wal_receiver_status_interval = 1s # 多久向主报告一次从的状态
hot_standby_feedback = on # 如果有错误的数据复制,是否向主进行反馈
5、启动从服务器:
pg_ctl -D /usr/local/pgsql/data start
查看复制状态:
在主库查询:
select * from pg_stat_replication;