PostgreSQL Replication之第四章 设置异步复制(4)
4.4 基于流和基于文件的恢复
生活并不总只是黑色或白色;有时也会有一些灰色色调。对于某些情况下,流复制可能恰到好处。在另一些情况下,基于文件复制和PITR是您所需要的。但是也有许多情况下,您既需要流复制,也需要基于文件的复制。一个例子是:当您较长一段时间中断复制,您可能想再次使用归档来重新同步(resync)slave,而不是再次执行完全的基础备份。这也可能是有用的---保留一个归档一段时间以后调查或重放操作。好消息是PostgreSQL允许您混合基于文件和基于流的复制。您没有必要决定基于流的好还是基于文件的好,您可以同时使用两种方式的优势。您该怎么做呢?事实上,您已经看到了所有的步骤;我们只需按照正确的方式把它们放在一起。
为了让这对您来说更容易,我们已经为您编写了一个完整的例子。
4.4.1 master配置
master上,我们在postgresql.conf中使用如下配置:
wal_level = hot_standby
# minimal, archive, or hot_standby
# (change requires restart)
archive_mode = on
# allows archiving to be done
# (change requires restart)
archive_command = 'cp %p /archive/%f'
# command to use to archive a logfile segment
# placeholders: %p = path of file to archive
# %f = file name only
max_wal_senders = 5
# we used five here to have some spare capacity
除此之外,我们必须添加一些配置到pg_hba.conf来允许流机制。下面是一个例子:
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication hs trust
host replication hs 127.0.0.1/32 trust
host replication hs ::1/128 trust
host replication all 192.168.0.0/16 md5
在我们的例子中,我们只是简单地开了一个完整的网络以允许复制(保持例子简单).
一旦我们做了这些改变,我们就可以重新启动master,并做一个如本章前面所做的基础备份。
4.4.2 slave配置
一旦我们配置了master并做了基础备份,我们就可以开始配置我们的slave系统。为了简单起见,我们假设我们只是用一个slave;我们不会级联复制到其他系统。
我们只需要改变slave的postgresql.conf中的一行:
hot_standby = on # to make the slave readable
下一步,我们可以写一个简单的recovery.conf文件,并把它放到主数据目录:
restore_command = 'cp /archive/%f %p'
standby_mode = on
primary_conninfo = ' host=sample.postgresql-support.de port=5432 '
trigger_file = '/tmp/start_me_up.txt'
我们启动slave,会发生如下事情:
1. PostgreSQL 会调用 restore_command 命令来从归档取事务日志。
2.直到归档中没有更多的日志文件才会停止调用restore_command。
3. PostgreSQL 会尝试建立流连接。
4.如果数据存在它将执行流操作。
°如果没有数据存储在, 它将调用 restore_command 命令从归档取事务日志。
° 它将一直执行该操作,直到归档里没有更多的数据。
° 它将再次尝试建立流连接。
只要您需要就可以保持流操作。如果您想把slave转换为master,您可以再次使用pg_ctl promote 或 recovery.conf中定义的 trigger_file。
4.4.3 错误场景
双重策略的最重要的优势是您可以创建一个集群,它提供一个更高的安全级别,而不仅仅是基于流或简单的基于文件的重放。
在本节,我们可以讨论一些在双重策略集群中典型的错误场景。
master和slave之间的网络连接中断
如果网络出现故障,master可能将不能再成功地执行archive_command操作。XLOG文件的历史必须保持继续,因此,为了以后的归档,master必须对那些XLOG文件进行排队。这可能是一个危险的场景,因为如果文件流被永久地中断,您可能用完master上XLOG的空间。
如果流连接失败,PostgreSQL将会尝试通过基于文件的通道来保持同步自身。如果基于文件的通道也失败了,slave将呆在那里等待网络连接回来。一旦网络回来,它将尝试获取XLOG并简单地继续。
[请记住,slave需要不间断的XLOG流;如果没有XLOG文件丢失或如果流连接仍然可以为slave提供slave需要操作的XLOG,,它只能继续重放XLOG。]
重新启动slave
只要归档有XLOG来做slave的备份,重新启动slave将不会有任何伤害,slave将只会再次启动并尝试从任何可用的来源获得XLOG。不会出现崩溃或任何其他这类问题。
重新启动master
如果master重新启动,这种情况同样没有什么可以批判的。slave将会通过流连接通知master找不到了。它会尝试通过两个渠道获取XLOG,但它不会成功,直到master回来。同样没有像崩溃之类的不好的事情 发生。重新启动两个服务器,操作就可以简单地恢复了。
在归档中损坏的XLOG
如果XLOG在归档汇总损坏,我们要区分两种情况:
1. slave正在流传输: 如果流没问题并且是完整的, slave 将不会注意到在归档中有一些XLOG文件在某种程度上被损坏。只要流连接是可用的,slave永远不需要从XLOG文件读取。
2. 如果我们没有使用流,而是从一个文件重放, PostgreSQL 将会检查每条 XLOG 记录并看它的校验和是否正确。如果发生任何错误, slave 将不会继续重放损坏的XLOG。 这将确保不会衍生出来其他问题,没有损坏的XLOG被重放。您的数据库可能是不完整的,但这将是明智的,到出错点都是一致的。
当然,有太多的事情会出错,但是鉴于这些相似的情况,您可以清楚地看到,该设计已经是尽可能的可靠了。
PostgreSQL Replication之第四章 设置异步复制(4)的更多相关文章
- PostgreSQL Replication之第四章 设置异步复制(1)
执行完您的第一个即时恢复(PITR,Point-In-Time-Recovery),我们准备在一个真正的复制设置上工作.在本章,您将学会如何设置异步复制和流.我们的目标是确保您可以实现更高的高可用和更 ...
- PostgreSQL Replication之第四章 设置异步复制(2)
4.2 配置级联复制 正如您在本章已经看到的,设置流复制真的很容易.只需要设置几个参数,做一个基础备份,并享受您的复制设置. 在许多情况下,这种情况更有一点点微妙.在这个例子中我们假设:我们要使用一个 ...
- PostgreSQL Replication之第四章 设置异步复制(8)
4.8 处理时间线 时间线是一个您必须要知道的一个重要的概念,尤其是当您规划一个大型的设置的时候. 那么,什么是时间线呢?事实上,它是XLOG的一个分支.正常情况下,刚设置的一个数据库实例使用的时间线 ...
- PostgreSQL Replication之第四章 设置异步复制(7)
4.7 冲突管理 在PostgreSQL中,流复制数据仅在一个方向流动.XLOG由master提供给几个slave,这些slave消耗事务日志并为您提供一个较好的数据备份.您可能想知道这怎么会导致冲突 ...
- PostgreSQL Replication之第四章 设置异步复制(6)
4.6 有效的清理和恢复结束 最近几年, recovery.conf 已经变得越来越强大了.早在初期(在 PostgreSQL 9.0之前), 仅有 restore_command 和一些 recov ...
- PostgreSQL Replication之第四章 设置异步复制(5)
4.5 使流复制更健壮 当连接到master时,slave要做的第一件事情是赶上master.但是,这会一直工作吗?我们已经看到,我们可以使用由基于流和基于文件组成的混合设置.这给了我们一些额外的安全 ...
- PostgreSQL Replication之第四章 设置异步复制(3)
4.3 slave到master的切换 如果您想扩展读或您想做一个数据备份,一个 slave是件美好的事情.但是,slave可能不会一直是slave.在有些时候,您可能需要把slave转换为maste ...
- PostgreSQL Replication之第五章 设置同步复制(1)
到目前为止,我们已经处理了基于文件的复制(或日志传送)和简单的基于流复制的设置.在两种情况中,在master上事务被提交之后,数据被提交,由slave接收.在master提交和slave实际上完全地接 ...
- PostgreSQL Replication之第五章 设置同步复制(2)
5.2 理解实际影响和性能 在本章中,我们已经讨论了实际影响以及性能影响.但是,有什么好的理论性的例子吗?让我们做一个简单的基准测试,看看复制是怎么做的.我们做这样的测试来为您显示各种耐久性的级别不只 ...
随机推荐
- 试用友盟SDK实现Android分享微信朋友圈
社会化分享是眼下必学且火热的功能.之前有写第三方登录,那仅仅是社会化分享的一部分.今天来玩玩分享微信朋友圈. 为了方便操作,还是依照步骤写. 一,注冊 注冊应用已经在这里具体说明过了,这里就不多提了. ...
- world 替换+正则表达式命令
打开替换命令,点击“更多”,勾选上“通配符”,正则表达式才会起作用
- 安卓WebView的使用,在应用程序中嵌入一个浏览器,轻松地展示各种各样的网页
WebView 在应用程序中嵌入一个浏览器,轻松地展示各种各样的网页. 1.定义一个WebView位置 <?xml version="1.0" encoding=" ...
- zookeeper的选举机制
1)半数机制:集群中半数以上机器存活,集群可用.所以zookeeper适合装在奇数台机器上. 2)Zookeeper虽然在配置文件中并没有指定master和slave.但是,zookeeper工作时, ...
- Python的Flask框架入门-Ubuntu
全文请见tuts code:An Introduction to Python's Flask Framework Flask是Python一个小而强大的web框架.学起来简单,用起来也容易,能够帮你 ...
- Nodemailer 报错
{ [Error: connect ECONNREFUSED] code: ‘ECONNREFUSED’, errno: ‘ECONNREFUSED’, syscall: ‘connect’ } 如果 ...
- 【原创】关于JMS[1]
面向消息中间件(MOM)为分布式系统提供异步,解耦,稳定,可扩展和安全的行为.MOM在分布式计算领域是一个重要的概念.它允许应用使用代理器API在分布式环境实现各种功能.Java消息服务(Java M ...
- Twilio介绍和使用
1.Twilio是?需要如何才能通过Twilio打国际网络电话 http://uuxn.com/twilio-toll-free-sms介绍了通过网页来收取和发送信息 需求:通过TWILIO拨打国外座 ...
- 【AnjularJS系列1 】— 样式相关的指令
最近,开始学习AngularJS. 开始记录学习AngularJS的过程,从一些很简单的知识点开始. 习惯先从实际应用的指令开始,再从应用中去体会AngularJS的优缺点.使用的场景等. 之前一直希 ...
- 路飞学城Python-Day15
模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录 支持账户间转账 记录每月日常消费流水 提供还 ...