postgresql在数据目录下的pg_xlog子目录中维护了一个WAL日志文件,该文件用于记录数据库文件的每次改变,这种日志文件机制提供了一种数据库热备份的方案,即:在把数据库使用文件系统的方式备份出来的同时也把相应的WAL日志进行备份,即便备份出来的数据块不一致,也能够重放WAL日志把备份的内容推到一致状态。这也就是基于时间点的备份(Point-in-Time Recovery),简称PITR。sql
把WAL日志传送到另外一台服务器有两种方式数据库
1.WAL日志归档(base-file)vim
2.流复制(streaming replication)服务器
第一种是写完一个WAL日志后,才把WAL日志文件拷贝到standby数据库中,就是经过cp命令实现远程备份,这样一般备份会落后主库一个WAL日志文件。而第二种流复制是postgresql9.x以后才提供的新的传递WAL日志的方法,它的好处是只要master库一产生日志,就会立刻传递到standby库,同第一种相比有更低同步延迟,因此咱们确定会选择流复制的方式。并发
在实际操做以前还有一点须要说明的是standby的搭建中最关键的一步,在standby中生成master的基础上备份。postgresql9.1以后提供了一个很方便的工具,pg_basebackup,关于它的详细介绍和参数能够在官网中查看。ide
系统版本工具 |
主机名post |
IP地址测试 |
postgresql版本ui |
角色 |
10.0.0.14 |
postgresql-master |
10.0.0.14 |
9.5.14 |
主库 |
10.0.0.15 |
postgresql-slave |
10.0.0.15 |
9.5.14 |
从库 |
说明:两台服务器都已经提早用yum方式安装好了postgresql 9.5,本文档配置的是主从复制,主库能够读写,从库只能读取不能写入数据。
cat >>/var/lib/pgsql/9.5/data/postgresql.conf <<EOF
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表和插入的数据
通过测试可看出,主从复制已配置成功。