简单记录一下postgresql主从的实现方式之一——基于Standby的异步流复制,这是PostgreSQL9.x版本(2010.9)之后提供的一个很nice的功能,类似的功能在Oracle中是11g之后才提供的active dataguard和SQL Server 2012版本之后才提供的日志传送,此处再次为pg鼓掌,确实是一个很棒的开源数据库。废话不多说,本篇blog就详细记录一下在pg9.5中实现Hot Standby异步流复制的完整配置过程和注意事项。
Standby数据库原理
简单介绍一些基础概念与原理,首先我们做主从同步的目的就是实现db服务的高可用性,通常是一台主数据库提供读写,然后把数据同步到另一台从库,然后从库不断apply从主库接收到的数据,从库不提供写服务,只提供读服务。在postgresql中提供读写全功能的服务器称为primary database或master database,在接收主库同步数据的同时又能提供读服务的从库服务器称为hot standby server。
PostgreSQL在数据目录下的pg_xlog子目录中维护了一个WAL日志文件,该文件用于记录数据库文件的每次改变,这种日志文件机制提供了一种数据库热备份的方案,即:在把数据库使用文件系统的方式备份出来的同时也把相应的WAL日志进行备份,即使备份出来的数据块不一致,也可以重放WAL日志把备份的内容推到一致状态。这也就是基于时间点的备份(Point-in-Time Recovery),简称PITR。而把WAL日志传送到另一台服务器有两种方式,分别是:
WAL日志归档(base-file)
流复制(streaming replication)
第一种是写完一个WAL日志后,才把WAL日志文件拷贝到standby数据库中,简言之就是通过cp命令实现远程备份,这样通常备库会落后主库一个WAL日志文件。而第二种流复制是postgresql9.x之后才提供的新的传递WAL日志的方法,它的好处是只要master库一产生日志,就会马上传递到standby库,同第一种相比有更低的同步延迟,所以我们肯定也会选择流复制的方式。
在实际操作之前还有一点需要说明就是standby的搭建中最关键的一步——在standby中生成master的基础备份。postgresql9.1之后提供了一个很方便的工具—— pg_basebackup,关于它的详细介绍和参数说明可以在官网中查看(pg_basebackup tool),下面在搭建过程中再做相关具体说明,关于一些基础概念和原理先介绍到这里。
主库配置:
0 listen_address = ‘*’
1 wal_level = hot_standby
2 wal_keep_segments = 32
3 max_wal_sender = 2
4 创建一个超级用户 create user standby_user with superuser password '123456';
5 修改 pg_hba.conf 增加 host replication standby_user 0.0.0.0/0 md5
6 重启
备库配置;
1 删除原备库data目录下的所有文件,从备库执行一个备份,到主库抽取data:
./pg_basebackup -h node01 -U repl -F p -x -P -R -D /usr/local/postgresql/data/ -l backup20161122
抽取后自动生成recovery.conf,不用做任何修改。
2 使用root用户,修改data目录的权限到700.
3 启动备库,成功。
验证:
1 在主库建表并插入数据。
2 主库建表、插值、查询成功。
3 备库只能执行查询,执行写入操作,提示只读模式。