环境
DB Master DB Slave1 DB Slave2
10.8.12.207 10.8.12.208 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=86400
#设置备机访问的并发连接数,对streaming的方式建议开高一点以保证数据可以及时同步 max_wal_senders = 5
#设置主机上pg_xlog里面保留的最小段数量。每个段都是16M,在streaming的情况下,如果希望不太依赖文件archive,数量建议设置大一些,以保证某些情况下备机不会由于落后太多导致复制服务停止。(即保证log在被同步到备机前不会被主机替换和删除掉) wal_keep_segments = 32
配置pg_hba.conf
vim /etc/postgresql/9.1/main/pg_hba.conf
修改以下配置项
#保证用户可以基于密码访问 host all all 10.8.12.0/24 md5 #设置replication的访问控制 host replicationrepl 10.8.12.208/32trust host replicationrepl 10.8.12.209/32trust 重启postgresql
/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 配置pg_hba.conf
vim /etc/postgresql/9.1/main/pg_hba.conf
修改以下配置项
#保证用户可以基于密码访问 host all all 10.8.12.207/32 md5 #设置replication的访问控制 host replicationrepl 10.8.12.207/32trust 新建recovery.conf
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' 做基线备份和streaming 同步
停止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()\"
因篇幅问题不能全部显示,请点此查看更多更全内容