您的位置:首页 > 其它

pg基于物理日志流复制的主备集群-搭建相关

2016-03-15 15:00 387 查看
一简单介绍

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

1传送日志模式(备库数据延迟1个归档)

整体思路:

首先在主库做数据库全库备份;

然后在备库做数据库恢复,使之处于应用重做日志的状态;

不断传送主库产生的归档文件到备库;

备库持续应用来自主库的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主多备,只要有任意备库可用,主库就不会挂起。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: