一简单介绍
1PITR原理
pg在数据目录pg_xlog中始终维护着一个wal日志。这个日志文件用于记录数据库数据文件的所有改变。
当数据库出现故障时,能够通过在数据物理全备的基础上重做最后一次checkpoint点之后的日志文件把数据库恢复到一致状态。
2实现过程
首先对主库做基础备份,恢复到备库,备库然后一直从主库接收wal日志,并持续应用wal日志,这样就可以使备库的数据实时(延迟)与主库一致,当主库故障时,就可以把备库打开提供服务,从而实现高可用。
3分类
(1)按传送内容分为:日志文件传送与日志流
传送wal归档日志:由于是归档wal文件,会导致备库数据延迟一个wal文件。
传送日志流:只要primary数据库一产生日志,就会马上传递到standby数据库。
(2)按数据保护(假设没有硬件故障):
synchronous_commit参数设置on,remote_write,local,off
on:在primary数据库提交事务时,必须要等事务日志刷写到本地磁盘,并且还需要等到传到备库确认(备库已经接收到流日志,并且落盘写到日志文件)才会返回客户端已经提交,这样可以保证主备库数据零丢失。
remote_write:主库的事务提交时,必须要等事务日志刷写到本地磁盘,并且还需要等到传到备库确认(备库已经接收到数据库内存,不要求落盘)才会返回客户端已经提交,这样可以保证备库数据可能不丢失,(如果操作系统故障,内存数据会丢失)。
local:主库的事务提交时,必须要等事务日志刷写到本地磁盘,不必等备库的确认,备库会延迟主库几秒数据,但是这种方式对主库性能影响较小。。
off:主库的事务提交时,不需要等事务日志刷写到本地磁盘,直接返回客户端已经提交。
(3)按备库是否可读:warm standby与hot standby
(4)按主备库数据流向:单向1主多备,单向1主多备级联
二搭建
环境列表
操作系统环境:centos 6.5 64
数据库版本:postgresql-9.5.1.tar.bz2
下载地址:http://www.postgresql.org/ftp/source/
| 主机名 | Ip |
主库 | pg1 | 192.168.204.214 |
备库 | pg2 | 192.168.204.215 |
整体思路:
首先在主库做数据库全库备份;
然后在备库做数据库恢复,使之处于应用重做日志的状态;
不断传送主库产生的归档文件到备库;
备库持续应用来自主库的wal归档日志。
1.1主库设置归档
wal_level = archive
archive_mode=on
//归档直接归档到备库机(如果归档在本地,则需再采用其他方式传送归档到备库机
archive_command = 'cp %p /pgdb/archive/%f' (%p表示在线wal日志的全路径名;%f不包括路径的wal日志文件名))
archive_command ='scp %p postgres@pg2:/pgdb/archive/%f'
archive_timeout= --可选,主库强制切换日志的时间
scp用法: 本地复制到远程(--复制目录加参数 -r 即可 ) scp local_file remote_username@remote_ip:remote_folder 从远程复制到本地 scp remote_username@remote_ip:remote_folder local_file |
1.2主库配置ssh互信(postgres用户)
为了把主库机归档文件免密码传送到备库机,所以如下操作
在主备库机执行:ssh-keygen -t rsa
主机执行cat id_rsa.pub >> authorized_keys
主机执行scp authorized_keys postgres@pg2:/home/postgres/.ssh/
备机执行:chmod 600 authorized_keys
主机执行:(应该免密码登录备机pg2)
[postgres@pg1 .ssh]$ ssh pg2
Last login: Wed Mar 922:01:06 2016 from pg1
[postgres@pg1 bin]$ssh-keygen -t rsa [postgres@pg2 bin]$ssh-keygen -t rsa [postgres@pg1 bin]$ cd /home/postgres/.ssh/ [postgres@pg1 .ssh]$ cat id_rsa.pub >> authorized_keys [postgres@pg1 .ssh]$ ls authorized_keys id_rsa id_rsa.pub [postgres@pg1 .ssh]$ scp authorized_keys postgres@pg2:/home/postgres/.ssh/ [postgres@pg2 bin]$ cd /home/postgres/.ssh/ [postgres@pg2 .ssh]$ ls authorized_keys id_rsa id_rsa.pub |
1.3创建备库
(1)pg_basebackup运行要求以下参数配置
主库postgresql.conf配置参数文件 listen_addresses = '*' max_wal_senders =3 主库配置pg_hba文件 host replication dba 192.168.204.215/32 trust |
(2)备机还原数据库
方式1(备机执行)
pg_basebackup -h 192.168.204.214 -p 5432 -U dba -F p -P -x -R -D /pgdb/data
方式2:首先在主库备份,拷贝到备机,再解压还原
SELECT pg_start_backup('bak20160312');
tar czvf /pgdb/databack/fulldatabase.tar.gz /pgdb/data/
SELECT pg_stop_backup();
select pg_switch_xlog();
scp /pgdb/databack/fulldatabase.tar.gz postgres@pg2:/pgdb/
(3)备库配置
vi /pgdb/data/recovery.conf
standby_mode = on
restore_command = 'cp /pgdb/ archive/%f %p'
trigger_file = '/pgdb/pgdb.trigger.5432' ---可选,也可以手工把备库提升为主库
archive_cleanup_command='/pgdb/bin/pg_archivecleanup /pgdb/archive %r'—可选,清理已经应用完成的wal日志。语法见 ./pg_archivecleanup --help
(4)主库启动,备库启动,搭建完成。
(5)设置备库可读
关闭备库, 修改备库postgresql.conf中参数hot_standby = on
关闭主库,修改主库postgresql.conf中参数wal_level = hot_standby,重启主库与备库
(6)备库提升
在备库机操作:当touch /pgdb/pgdb.trigger.5432文件时,或者pg_ctl promote命令操作,数据库将可读可写。
2物理流复制-传送日志流
2.1主库参数文件postgresql.conf配置
listen_addresses = '*' --或者指定ip
max_wal_senders =4
wal_level = hot_standby --备机是否可读
archive_mode = on
archive_command = 'cp %p /pgdb/archlog/%f'
wal_keep_segments = 256 --可选参数,设置保留wal日志个数
pg_hba.conf中设置
host replication dba 192.168.204.215/32 trust
2备库还原备库
pg_basebackup或者pg_start_backup/ pg_stop_backup
pg_basebackup -h 192.168.204.214 -p 5432 -U dba -F p -P -x -R -D /pgdb/data
3备库配置recovery.conf
standby_mode = 'on'
trigger_file = '/pgdb/pgdb.trigger.5432'
primary_conninfo = 'host=192.168.204.214 port=5432 user=dbapassword=123456 keepalives_idle=60'
recovery_target_timeline = 'latest' # 这个说明这个流复制同步到最新的数据
4备库配置postgresql.conf文件
hot_standby = on –备机可读
max_standby_streaming_delay = 30s # 数据流备份的最大延迟时间
wal_receiver_status_interval = 1s # 多久向主报告一次从的状态,当然从每次数据复制都会向主报告状态,这里只是设置最长的间隔时间
hot_standby_feedback = on # 如果有错误的数据复制,是否向主进行反馈
5主库启动,备库启动;搭建完成
6主备切换
正常关闭原主库,提升备库为主库pg_ctl promote,修改新主库pg_hba(配置原主库可以replication访问)文件之后重启,配置原主库recovery.conf文件
standby_mode = 'on'
trigger_file = '/pgdb/pgdb.trigger.5432'
primary_conninfo ='host=192.168.204.215 port=5432 user=dbapassword=123456 keepalives_idle=60'
recovery_target_timeline = 'latest' # 这个说明这个流复制同步到最新的数据
启动原主库
完成
7可以来回多次切换
8配置同步物理流复制
备库recovery.conf配置:
primary_conninfo = 'host=192.168.204.214 port=5432 user=dbapassword=123456 keepalives_idle=60 application_name=standby1'--指定application_name备库名称
主库postgresql.conf参数配置:
synchronous_standby_names = 'standby1'这个参数指定多个standby的名称,逗号分隔多个。
synchronous_commit= 'XX' //on, remote_write, local, and off不同的值,意义不同。
主库重新加载参数:pg_ctl reload –D /pgdb/data
注意:如果1主1备同步模式,备库故障会导致主库挂起;通常解决办法是1主多备,只要有任意备库可用,主库就不会挂起。