postgresql在数据目录下的pg_xlog子目录中维护了一个WAL日志文件,该文件用于记录数据库文件的每次改变,这种日志文件机制提供了一种数据库热备份的方案,即:在把数据库使用文件系统的方式备份出来的同时也把相应的WAL日志进行备份,即使备份出来的数据块不一致,也可以重放WAL日志把备份的内容推到一致状态。这也就是基于时间点的备份(Point-in-Time Recovery),简称PITR。
把WAL日志传送到另一台服务器有两种方式
1.WAL日志归档(base-file)
2.流复制(streaming replication)
第一种是写完一个WAL日志后,才把WAL日志文件拷贝到standby数据库中,就是通过cp命令实现远程备份,这样通常备份会落后主库一个WAL日志文件。而第二种流复制是postgresql9.x之后才提供的新的传递WAL日志的方法,它的好处是只要master库一产生日志,就会马上传递到standby库,同第一种相比有更低同步延迟,所以我们肯定会选择流复制的方式。
在实际操作之前还有一点需要说明的是standby的搭建中最关键的一步,在standby中生成master的基础上备份。postgresql9.1之后提供了一个很方便的工具,pg_basebackup,关于它的详细介绍和参数可以在官网中查看。系统版本主机名IP地址postgresql版本角色
10.0.0.14postgresql-master10.0.0.149.5.14主库
10.0.0.15postgresql-slave10.0.0.159.5.14从库
说明:两台服务器都已经提前用yum方式安装好了postgresql 9.5,本文档配置的是主从复制,主库可以读写,从库只能读取不能写入数据。
cat >>/var/lib/pgsql/9.5/data/postgresql.conf <
wal_level = hot_standby #(默认是minimal)
max_wal_senders=2 #(默认是0)
wal_keep_segments=64 #(默认是0)
EOF
说明
wal_level表示启动搭建Hot Standby,max_wal_senders则需要设置为一个大于0的数,它表示主库最多可以有多少个并发的standby数据库,而最后一个wal_keep_segments也应当设置为一个尽量大的值,以防止主库生成WAL日志太快,日志还没有来得及传送到standby就被覆盖,但是需要考虑磁盘空间允许,一个WAL日志文件的大小是16M
如上图,一个WAL日志文件是16M,如果wal_keep_segments设置为64,也就是说将为standby库保留64个WAL日志文件,那么就会占用16*64=1GB的磁盘空间,所以需要综合考虑,在磁盘空间允许的情况下设置大一些,就会减少standby重新搭建的风险。接下来还需要在主库创建一个超级用户来专门负责让standby连接去拖WAL日志
创建同步用户
postgres=# create user rep1 superuser password '123456';
修改配置文件
vim /var/lib/pgsql/9.5/data/pg_hba.conf
86 # Allow replication connections from localhost, by a user with the
87 # replication privilege.
88 #local replication postgres peer
89 #host replication postgres 127.0.0.1/32 ident
90 host replication rep1 10.0.0.0/24 md5
91 #host replication postgres ::1/128 ident
允许从库服务器连接主库去拖WAL日志数据
systemctl restart postgresql-9.5
先关闭从库
systemctl stop postgresql-9.5
清空从库数据目录
rm -rf /var/lib/pgsql/9.5/data/*
pg_basebackup -h 10.0.0.14 -U rep1 -F p -x -P -R -D /var/lib/pgsql/9.5/data/ -1 rep_backup
备份过程实际上就是从主库的data目录里物理拷贝数据的过程。
参数说明
-F 指定了输出的格式,支持p(原样输出)或者t(tar格式输出)。
-x 表示备份开始后,启动另一个流复制连接从主库接收WAL日志。
-p 表示允许在备份的过程中实时的打印备份的进度。
-R 表示会在备份结束后自动生成recovery.conf文件,这样就避免了手动创建。
-D 指定把备份写到哪个目录,注意:在做基础备份之前从库的数据目录需要手动清空。
-1 表示指定一个备份的标识。
chown -R postgres.postgres /var/lib/pgsql/9.5/data/
修改配置文件
vim /var/lib/pgsql/9.5/data/postgresql.conf
243 # - Standby Servers -
244
245 # These settings are ignored on a master server.
246
247 #hot_standby = off # "on" allows queries during recovery
248 hot_standby = on #添加此行
249 # (change requires restart)
250 #max_standby_archive_delay = 30s # max delay before canceling queries
251 # when reading WAL from archive;
252 # -1 allows indefinite delay
253 #max_standby_streaming_delay = 30s # max delay before canceling queries
systemctl start postgresql-9.5
查看流复制的进程
在主库上创建一个库wangning
登录从库查看是否有wangning库
在主库的wangning库中建一个test表并插入数据
进入从库的wangning库查看是否有test表和插入的数据
经过测试可看出,主从复制已配置成功。