主机规划
- 主库ip: 192.168.1.100
- 备库ip: 192.168.1.101
192.168.1.100 主库的配置
修改pg_hba.conf,增加replica用户,进行同步。
host replication replica 192.168.1.101/32 md5
主库增加用户,赋予登录和备份的权限
CREATE ROLE replica login replication encrypted password 'replica'
修改主库postgresql.conf
wal_level = hot_standby # wal级别 max_wal_senders = 32 # 最多可以有几个流复制连接 wal_keep_segments = 256 # 流复制保留的最多的xlog数目 wal_sender_timeout = 60s # 设置流复制主机发送数据的超时时间 max_connections = 100 # 从库的max_connections必须要大于主库
重启主库
pg_ctl stop -D /mnt/postgresql/data pg_ctl start -D /mnt/postgresql/data
备库测试连接主库 (postgres@2017)
psql -h 192.168.1.100 -p 5432 -U postgres
192.168.1.101从库的配置
创建备机数据库备份目录
mkdir -p /mnt/postgresql_standby/data
备机做基础备份
pg_basebackup -F p --progress -D $PGDATA -X stream -h 192.168.1.100 -p 5432 -U replica -W
修改recovery.conf (文件可以从pg的安装目录的share文件夹中获取)
cp /usr/pgsql-9.5/share/recovery.conf.sample /mnt/postgresql_standby/data/recovery.conf
修改recovery.conf
standby_mode = on # 这个说明这台机器为从库 primary_conninfo = 'host=192.168.1.100 port=5432 user=replica password=replica' # 这个说明这台机器对应主库的信息 recovery_target_timeline = 'latest' # 这个说明这个流复制同步到最新的数据
修改从库postgresql.conf的配置
max_connections = 1700 # 一般查多于写的应用从库的最大连接数要比较大 hot_standby = on # 说明这台机器不仅仅是用于数据归档,也用于数据查询 max_standby_streaming_delay = 30s # 数据流备份的最大延迟时间 wal_receiver_status_interval = 1s # 多久向主报告一次从的状态,当然从每次数据复制都会向主报告状态,这里只是设置最长的间隔时间 hot_standby_feedback = on # 如果有错误的数据复制,是否向主进行反馈
配置完后重启从服务器
pg_ctl stop -D $PGDATA pg_ctl start -D $PGDATA
验证是否部署成功
在主节点上执行:
select client_addr,sync_state from pg_stat_replication;
还可以分别在主、从节点上查看
ps aux | grep postgres
查看备库落后主库多少字节的WAL日志:
postgres=# select pg_xlog_location_diff(pg_current_xlog_location(),replay_location)from pg_stat_replication;
————–2017-11-25 补充—————-
- 可能会遇到”FATAL: requested WAL segment00800002A0 has already been removed”
解决方法
- 增大wal_keep_segments
- 归档,出现这样情况,从归档中拷贝过来(不适用)
- 启用replication slot (pg9.4以后才有)
在postgresql.conf中添加
max_replication_slots = 2000
在拷贝到备库之前,主库要创建一个slot:
postgres=# SELECT * FROM pg_create_physical_replication_slot('node_a_slot'); slot_name | xlog_position -------------+--------------- node_a_slot | postgres=# SELECT * FROM pg_replication_slots; slot_name | slot_type | datoid | database | active | xmin | restart_lsn -------------+-----------+--------+----------+--------+------+------------- node_a_slot | physical | | | f | | (1 row)
在备库的recovery.conf文件中添加一行:
standby_mode = 'on' primary_conninfo = 'host=192.168.4.225 port=19000 user=wslu password=xxxx' primary_slot_name = 'node_a_slot'
- 可能会遇到”FATAL: requested WAL segment00800002A0 has already been removed”
参考:
http://blog.csdn.net/prettyshuang/article/details/51777645