一、准备环境
准备两台相同环境的虚拟机,安装相同版本的pg。
pg版本:9.3
master:192.168.23.128
slave:192.168.23.129
二、主库配置
1.创建备库访问用户:
修改postgresql.conf中的参数
listen_addresses='*'(默认值是localhost,改为*代表监听所有ip)
创建用户
CREATE USER repuser replication LOGIN CONNECTION LIMIT 5 ENCRYPTED PASSWORD ’123′;
修改pg_hba.conf
增加这行意思就是允许所有地址通脱tcp/ip使用repuser连接replication,通过MD5方式。
2.修改主库其他参数
wal_level = hot_standby(这个参数是控制wal写入信息的多少,改为hot_standby备库支持read-only)
archive_mode = on(这个参数是是否开启归档记录,不开也可以用流复制,如果备库长时间停机,主库之前的wal被覆盖,备库可能无法启动,如果开了这个参数,在配了archive_command备库是可以重新读备份的wal恢复到主库的状态的)
archive_command='cp %p /home/postgres/archive/%f'(归档命令)
max_wal_senders = 3(这个参数是允许多少个复制写入连接,大于等于standby节点数就行)
wal_keep_segments = 100(这个参数是最多保留多少个wal段提供备份恢复,可以尽量大点,wal段大小由wal_buffer决定)
synchronous_standby_names = 'db1'(这个参数是用来开启同步复制的,异步复制不需要开)
三、创建主库基本备份
1.通过pg_basebackup
pg_basebackup -D data/pgdata/pg -Fp -Xs -v -P -h 192.168.23.128 -p 5432 -U repuser -W
直接从主机得到备份,将备库的$PGDATA用复制得到的覆盖就行。命令使用帮助:pg_basebackup --help
2.通过pg_start_backup()
方法就是主库select pg_start_backup();复制数据文键;select pg_stop_backup();远没第一种方便。
四、配置从库环境
1.配置从库参数
hot_standby=on(从库开启read-only)
2.设置从库的recovery.conf
standby_mode='on'(表示数据库恢复完成时,不会断开,等待接收新的wal)
primary_conninfo='host=192.168.23.128 port=5432 user=repuser password=123 application_name=db1'(连接串,application_name这个是使用同步复制的与主库的synchronous_standby_names对应)
recovery_target_timeline='latest'(指定恢复时间线)
还有个trigger_file参数,我没写,感觉这个挺鸡肋的,就是如果主库故障了,通过创建某个文件可以使备库变成主库。想想就觉得功能好蛋疼,我首先得知道主库故障了,然后再去创建这个文件,才能切换。
五、验证
1.启动主库。
2.启动从库。
3.在主库上查询pg_stat_replication:
postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid | 6570
usesysid | 16395
usename | repuser
application_name | mydb_standby1
client_addr | 192.168.23.129
client_hostname |
client_port | 57368
backend_start | 2016-04-10 07:24:57.272316+08
state | streaming
sent_location | 0/120002A8
write_location | 0/120002A8
flush_location | 0/120002A8
replay_location | 0/120002A8
sync_priority | 1
sync_state | sync (这个就是开了同步,异步的话就是async)