PostgreSQL 9 Hot Standby简介

PostgreSQL数据库提供了类似Oracle的standby数据库的功能。PostgreSQL9.0 standby数据库在应用WAL日志的同时,也可以提供只读服务,这是PostgreSQL9.0中最激动人心的功能,这个功能在oracle数据库中也只是最新版本11g中才有的新功能。这个功能在oracle中叫active dataguard,在PostgreSQL中称为hot standby。
在利用日志恢复数据的同时可以用只读的方式打开数据库,用户可以在备用数据库上进行查询、报表等操作,也可用做读写分离。在PostgreSQL9.0之前,也可以搭建standby数据库,但standby数据库只能处于恢复状态中,不能打开,也不支持只读打开。而这种情况在9.0之后彻底改变了。
PostgreSQL 9.0中日志传送的方法有两种:
1. 基于文件(base-file)的传送方式,这种方式是PostgreSQL9.0之前就提供的方法。也就是服务器写完一个WAL日志文件后,才把WAL日志文件拷贝到standby数据库上去应用。
2. 流复制(streaming replication)的方法,这是PostgreSQL9.0才提供的新方法。这个方法就是事务提交后,就会把生成的日志异步的传送到standby数据库上应用,这比基本文件的日志传送方法有更低的数据延迟。

以下部分介绍方法2的搭建。
平台信息
Master Server:172.16.203.179
数据库版本:PostgreSQL9.1.2
端口:5432
数据库的数据目录: /var/lib/pgsql/9.1/data

Standby Server:172.16.203.178
数据库版本:PostgreSQL9.1.2
端口:5433
数据库的数据目录: /var/lib/pgsql/9.1/data/

配置
主数据库上的配置
1. 在主数据库(179上)的postgresql.conf文件中设置如下配置项:
wal_level = hot_standby
max_wal_senders = 2
wal_keep_segments = 32

2. 在主数据库(179上)的pg_hba.conf文件中添加如下配置项:
host replication postgres 172.16.203.178/32 md5

3. 重启主数据库,让配置生效:
service postgresql-9.1 restart

4. 对主数据库做一个基础备份:
使用select pg_start_backup();命令把数据库切换到备份状态,
#su – postgres
$/usr/pgsql-9.1/bin/psql -d postgres
postgres=#select pg_start_backup(‘/var/lib/pgsql/9.1/data’);

5. 拷贝主数据库(179上)的数据目录到从数据库(178上)的数据目录中

6. 拷贝完成后,结束主数据库的备份状态:
postgres=#select pg_stop_backup();

从数据库上的配置:

7. 在从数据库的配置文件postgresql.conf中,设置如下配置项:
port=5433
hot_standby = on
并注释掉wal_level max_wal_senders和wal_keep_segments的设置

8. 拷贝并配置recovery.conf
#cp /usr/pgsql-9.1/share/recovery.conf.sample /var/lib/pgsql-9.1/data/recovery.conf
配置如下内容:
standby_mode = on
primary_conninfo = ‘host=172.16.203.179 port=5432 user=postgres password=postgres’
trigger_file = ‘/var/lib/pgsql-9.1/trigger_activestandby’

9. 删除从主数据库中过来的postmaster.pid文件,然后启动从数据库:
#rm /var/lib/pgsql-9.1/data/postmaster.pid
#service postgresql-9.1 start

至此standby数据库搭建完成,可以实现主从数据库的热备,从数据库做只读数据库。