1 备份原理

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,关于它的详细介绍和参数可以在官网中查看。

2 基本环境

系统版本

主机名

IP地址

postgresql版本

角色

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,本文档配置的是主从复制,主库可以读写,从库只能读取不能写入数据。

3 主库配置

3.1 修改配置文件

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 Standbymax_wal_senders则需要设置为一个大于0的数,它表示主库最多可以有多少个并发的standby数据库,而最后一个wal_keep_segments也应当设置为一个尽量大的值,以防止主库生成WAL日志太快,日志还没有来得及传送到standby就被覆盖,但是需要考虑磁盘空间允许,一个WAL日志文件的大小是16M

如上图,一个WAL日志文件是16M,如果wal_keep_segments设置为64,也就是说将为standby库保留64WAL日志文件,那么就会占用16*64=1GB的磁盘空间,所以需要综合考虑,在磁盘空间允许的情况下设置大一些,就会减少standby重新搭建的风险。接下来还需要在主库创建一个超级用户来专门负责让standby连接去拖WAL日志

3.2 创建同步用户

创建同步用户

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日志数据

3.3 重启postgresql服务

systemctl restart postgresql-9.5

4 从库配置

4.1 清空从库的数据目录

先关闭从库

systemctl stop postgresql-9.5

清空从库数据目录

rm -rf /var/lib/pgsql/9.5/data/*

4.2 从主库备份数据

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(原样输出)或者ttar格式输出)。

-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

4.3 启动从库

systemctl start postgresql-9.5

查看流复制的进程

5 测试

5.1 从库写入测试

5.2 创建库表测试

在主库上创建一个库wangning

登录从库查看是否有wangning

在主库的wangning库中建一个test表并插入数据

进入从库的wangning库查看是否有test表和插入的数据

5.3 删除库测试

经过测试可看出,主从复制已配置成功。