环境
DB Master 10.8.12.207
DB Slave1 10.8.12.208
DB Slave2 10.8.12.209
安装PostgreSql(此处省略)
设置postgres用户可以登录
passwd postgres
su postgres
建立SSH信任连接(非必须)
--DB Master
ssh-keygen
ssh-copy-id postgres@10.8.12.208
ssh-copy-id postgres@10.8.12.209
--DB Slave
ssh-keygen
ssh-copy-id postgres@10.8.12.207
新建数据同步(replication)用户
su postgres
createuser repl -s
psql
alter role repl password 'repl'
配置Master
新建archive目录
mkdir /var/lib/postgresql/archive
配置postgresql.conf
vim /etc/postgresql/9.1/main/postgresql.conf
修改以下配置项
listen_addresses = '*'
#这个参数决定了有多少内容写入WAL,缺省是minimum,仅保证服务可以在crash或者immediate shutdown后重启。archive会多增加与WAL archive相关的内容,hot_standby会增加备机只读查询的支持信息
wal_level = hot_standby
#开启archive,然后定义文件备份命令
archive_mode = on
archive_command = 'cp -i %p /var/lib/postgresql/archive/%f
#数据库会将已经完结的WAL写到archive里面去,具体写法见上面的command。如果traffic太低,那么长时间WAL就都不会写到archive里面,就类似所谓的备份风险。所以设置timeout是说如果到了这个时间WAL还没完结,也一样会写到archive里面去。但是streaming的方式下,由于内容都及时到达了备机,所以觉得没有必要设置太低的timeout。
archive_timeout=800
#设置备机访问的并发连接数,对streaming的方式建议开高一点以保证数据可以及时同步
max_wal_senders = 5
#设置主机上pg_xlog里面保留的最小段数量。每个段都是16M,在streaming的情况下,如果希望不太依赖文件archive,数量建议设置大一些,以保证某些情况下备机不会由于落后太多导致复制服务停止。(即保证log在被同步到备机前不会被主机替换和删除掉)
wal_keep_segments = 32 |
vim /etc/postgresql/9.1/main/pg_hba.conf
修改以下配置项
#保证用户可以基于密码访问
host all all 10.8.12.0/24 md5
#设置replication的访问控制
host replication repl 10.8.12.208/32 trust
host replication repl 10.8.12.209/32 trust |
/etc/init.d/postgresql restart
配置Slave
新建archive目录
mkdir /var/lib/postgresql/archive
配置postgresql.conf
vim /etc/postgresql/9.1/main/postgresql.conf
修改以下配置项:
listen_addresses = '*'
#开启hot standby
wal_level = hot_standby
hot_standby = on |
vim /etc/postgresql/9.1/main/pg_hba.conf
修改以下配置项
#保证用户可以基于密码访问
host all all 10.8.12.207/32 md5
#设置replication的访问控制
host replication repl 10.8.12.207/32 trust |
vim /etc/postgresql/9.1/main/recovery.conf
内容如下:
restore_command = 'cp /var/lib/postgresql/archive/%f %p'
archive_cleanup_command = '/usr/lib/postgresql/9.1/bin/pg_archivecleanup /var/lib/postgresql/archive/ %r'
standby_mode = 'on'
primary_conninfo = 'host=10.8.12.207 port=5432 user=repl password=repl'
trigger_file = '/var/lib/postgresql/trigger' |
停止DB Slave服务
/etc/init.d/postgresql stop
在DB Master上开始基线备份
psql -c "select pg_start_backup('label',true)"
删除DB Salve上的数据
mv /var/lib/postgresql/9.1/main /var/lib/postgresql/9.1/main_bak
或者
rm -r /var/lib/postgresql/9.1/main
在DB Master上执行数据同步
rsync -a /var/lib/postgresql/9.1/main/ postgres@10.8.12.208:/var/lib/postgresql/9.1/main/ --exclude postmaster.pid
rsync -a /var/lib/postgresql/9.1/main/ postgres@10.8.12.209:/var/lib/postgresql/9.1/main/ --exclude postmaster.pid
第一次可以采用这种把目标目录全部清空的方式,以后应该可以采用仅删除server*的方式减少同步数据量。如果机器上无rsync服务,需安装(默认有)
DB Slave复制日志
rm /var/lib/postgresql/archive/*
mv /var/lib/postgresql/9.1/main/pg_xlog/* /var/lib/postgresql/archive/
DB Slave创建recovery.conf软链接
ln –s /etc/postgresql/9.1/main/recovery.conf /var/lib/postgresql/9.1/main/recovery.conf
启动DB Slave上的服务
/etc/init.d/postgresql start
DB Master上结束基线备份操作
psql -c "SELECT pg_stop_backup()"