最近给PostgreSQL搞伤了,Debian 5默认PostgreSQL是8.4,本身是不支持Primary/Standby集群的。在经历尝试Slony的超级复杂配置和pgpool无法按照步骤成功的痛苦经历情况下,将PostgreSQL升级到9.0,但是根据网上一些手册还是配置不成功,经过摸索终于成功配置了,并将配置文件公布出来供参考。
安装指令如下,其中192.168.0.212作为Primary服务器,192.168.0.211作为Standby服务器
两台服务器共同执行部分:
-
修改apt源
vim /etc/apt/sources.list
在最后加入:
deb http://backports.debian.org/debian-backports lenny-backports main
deb http://backports.debian.org/debian-backports lenny-backports-sloppy main
apt-update
-
安装PostgreSQL数据库服务
wget http://ftp.us.debian.org/debian/pool/main/o/ossp-uuid/libossp-uuid15_1.5.1-1.1+b1_i386.deb
wget http://ftp.us.debian.org/debian/pool/main/o/ossp-uuid/libossp-uuid-dev_1.5.1-1.1+b1_i386.deb
dpkg -i libossp-uuid*.deb
apt-get install -t lenny-backports postgresql-common
apt-get install -t lenny-backports-sloppy postgresql-9.0 postgresql-client-9.0 postgresql-contrib-9.0 postgresql-server-dev-9.0
-
修改访问控制
vim /etc/postgresql/9.0/main/pg_hba.conf
最后加一行
host all all 192.168.0.0/24 md5
-
修改监听范围
vim /etc/postgresql/9.0/main/postgresql.conf
修改listen_addresses = ‘localhost’为listen_addresses = ‘*’,如果前面有#号则需要删除#号
-
重新启动postgresql服务
/etc/init.d/postgresql restart
212 Primary服务器配置
-
设置同步账号
su – postgres
psql
create user repl superuser log in password ‘replpwd’ ;
-
修改访问控制
vim /etc/postgresql/9.0/main/pg_hba.conf
最后添加以下内容
host replication repl 192.168.0.211/32 md5
-
修改postgresql服务配置文件
vim /etc/postgresql/9.0/main/postgresql.conf
主要配置修改如下:
wal_level = hot_standby
archive_mode = on
archive_command = ‘cp -i %p /var/lib/postgresql/9.0/archivedir/%f </dev/null’
archive_timeout = 600
max_wal_senders = 5
wal_keep_segments = 32
-
建立归档目录
su – postgres
mkdir /var/lib/postgresql/9.0/archivedir/
-
重启服务
/etc/init.d/postgresql stop
/etc/init.d/postgresql start
211Standby服务器配置
-
修改postgresql服务配置文件
vim /etc/postgresql/9.0/main/postgresql.conf
主要配置修改如下:
wal_level = hot_standby
hot_standby = on
vim /etc/postgresql/9.0/main/recovery.conf
内容如下:
restore_command = ‘cp /var/lib/postgresql/9.0/archivedir/%f %p’ archive_cleanup_command = ‘pg_archivecleanup /var/lib/postgresql/9.0/archivedir %r’
standby_mode = ‘on’
primary_conninfo = ‘host=192.168.0.212 port=5432 user=repl password=replpwd’
trigger_file = ‘/var/lib/postgresql/9.0/trigger_activestb’
cp /etc/postgresql/9.0/main/recovery.conf /var/lib/postgresql/9.0/main/
-
停止服务
/etc/init.d/postgresql stop
-
删除原数据目录下数据文件
su – postgres
cd /var/lib/postgresql/9.0/
rm –R –f main
mkdir main
chmod –R 700 main
传送数据文件到StandBy并启动集群
-
从212服务器中传送文件(在212服务器执行)
su – postgres
psql -c "SELECT pg_start_backup(‘label’,true);"
rsync -avz /var/lib/postgresql/9.0/main/* postgres@192.168.0.211:/var/lib/postgresql/9.0/main/
注意:这里rsync是没有办法执行的,需要先建立两个服务器之间关于postgres之间的ssh 密钥文件交换。
-
211服务器删除pid文件(在211服务器执行)
rm /var/lib/postgressql/9.0/main/postgresql.pid
/etc/init.d/postgresql restart
-
212服务器正式启动主从模式(在212服务器执行)
su – postgres
psql -c "SELECT * from pg_stop_backup();"
exit
/etc/init.d/postgresql restart
测试
在Primary服务器上建立一个数据库或者修改一个数据表,可以在StandBy数据库上看到同样的修改操作发生了。
配置参考文件
可直接使用的配置参考文件见:。注意前缀分别代表在那台服务器上的配置文件。

Dominic
ssh 密钥交换方法
在Primary服务器上执行
su – postgres
ssh-keygen -t rsa
ssh root@StandbyServerIP test -d \/var/lib/postgresql/.ssh/ \|\| mkdir \/var/lib/postgresql/.ssh/ \; cat \>\> \/var/lib/postgresql/.ssh/authorized_keys
最好分析的在深入点,针对第一条
我也有很多博客,但是很多都没有坚持下来。有的时隔两年了才去写一篇。
好的东东总是叫人回味!
请问楼主:rsync -avz /var/lib/postgresql/9.0/main/* postgres@192.168.0.211:/var/lib/postgresql/9.0/main/
只需要在做首次同步的时候执行一次吗?
如果只需要一次用scp命令不也就解决了吗?9.0的online recovery
不再需要同步了吧?
仅需要执行一次。我用rsync不用scp的原因是rsync相当于mv。而且有scp没有的好处。如:速度、全部信息等等。而且两台服务器如果做群集,相当多的时候都需要同步文件。同步并不完全等于拷贝。
谢谢支持!
另外,需要用cron定时清除/var/lib/postgresql/9.0/archivedir/ 目录下过期日志文件。
恩,没用cron清除过期日志很快将down掉了,做hotstandby除了减少查询压力之外感觉也无大用处.如果能在debian 6和postgresql9实现HA和类似oracle RAC的双机模式就好了
对postgresql 9的squeeze backports版本的稳定性不是很了解,不知道有无相关信息.