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)的更多相关文章

  1. PostgreSQL Replication之第四章 设置异步复制(1)

    执行完您的第一个即时恢复(PITR,Point-In-Time-Recovery),我们准备在一个真正的复制设置上工作.在本章,您将学会如何设置异步复制和流.我们的目标是确保您可以实现更高的高可用和更 ...

  2. PostgreSQL Replication之第四章 设置异步复制(2)

    4.2 配置级联复制 正如您在本章已经看到的,设置流复制真的很容易.只需要设置几个参数,做一个基础备份,并享受您的复制设置. 在许多情况下,这种情况更有一点点微妙.在这个例子中我们假设:我们要使用一个 ...

  3. PostgreSQL Replication之第四章 设置异步复制(8)

    4.8 处理时间线 时间线是一个您必须要知道的一个重要的概念,尤其是当您规划一个大型的设置的时候. 那么,什么是时间线呢?事实上,它是XLOG的一个分支.正常情况下,刚设置的一个数据库实例使用的时间线 ...

  4. PostgreSQL Replication之第四章 设置异步复制(7)

    4.7 冲突管理 在PostgreSQL中,流复制数据仅在一个方向流动.XLOG由master提供给几个slave,这些slave消耗事务日志并为您提供一个较好的数据备份.您可能想知道这怎么会导致冲突 ...

  5. PostgreSQL Replication之第四章 设置异步复制(6)

    4.6 有效的清理和恢复结束 最近几年, recovery.conf 已经变得越来越强大了.早在初期(在 PostgreSQL 9.0之前), 仅有 restore_command 和一些 recov ...

  6. PostgreSQL Replication之第四章 设置异步复制(5)

    4.5 使流复制更健壮 当连接到master时,slave要做的第一件事情是赶上master.但是,这会一直工作吗?我们已经看到,我们可以使用由基于流和基于文件组成的混合设置.这给了我们一些额外的安全 ...

  7. PostgreSQL Replication之第四章 设置异步复制(3)

    4.3 slave到master的切换 如果您想扩展读或您想做一个数据备份,一个 slave是件美好的事情.但是,slave可能不会一直是slave.在有些时候,您可能需要把slave转换为maste ...

  8. PostgreSQL Replication之第五章 设置同步复制(1)

    到目前为止,我们已经处理了基于文件的复制(或日志传送)和简单的基于流复制的设置.在两种情况中,在master上事务被提交之后,数据被提交,由slave接收.在master提交和slave实际上完全地接 ...

  9. PostgreSQL Replication之第五章 设置同步复制(2)

    5.2 理解实际影响和性能 在本章中,我们已经讨论了实际影响以及性能影响.但是,有什么好的理论性的例子吗?让我们做一个简单的基准测试,看看复制是怎么做的.我们做这样的测试来为您显示各种耐久性的级别不只 ...

随机推荐

  1. 每一个JavaScript开发者都应该知道的10道面试题

    JavaScript十分特别.而且差点儿在每一个大型应用中起着至关关键的数据.那么,究竟是什么使JavaScript显得与众不同,意义非凡? 这里有一些问题将帮助你了解其真正的奥妙所在:   1.你能 ...

  2. 外面的wifi非常精彩,外面的wifi非常不安

    星期一果然非常忙,看到安卓漏洞还是午休的时候.可能我们都习惯了.我们的信息安全一向难以得到保障.对于我来说,可能都无所谓了.可是作为用户之中的一个,我们也不能太安分,该须要的保障还是得维护. 本来.我 ...

  3. MySQL日期数据类型和时间类型使用总结

    转自: http://blog.chinaunix.net/space.php?uid=11327712&do=blog&id=32416 MySQL 日期类型:日期格式.所占存储空间 ...

  4. Windows服务的创建,安装,卸载

    我公司项目的产线系统要与WMS物流系统做借口对接,需要我创建一个windows服务的项目,里面含有7个服务 创建Windows服务: 1.如图:点击 windows->经典桌面->wind ...

  5. jquery简介 each遍历 prop attr

    一.JQ简介 jQuery是一个快速.简洁的JavaScript框架,它封装了JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作.事件处理.动画设计和 ...

  6. 关于 jsp java servlet 中文汉字乱码的解决方法

    在servlet类中的get,post最前面加上 req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding(&quo ...

  7. Java文件(io)编程——File类的基本用法

    1.首先了解文件流的相关概念: 2.文件File类的基本用法 public class Demo_1 { public static void main(String[] args) { //创建一个 ...

  8. Pyinstaller 0

    Pyinstaller 是一个小的可以打包我们所写的Python脚本,来生成相应的可执行文件. 它是怎么工作的? PyInstaller读取您编写的Python脚本.它会分析您的代码,以发现您的脚本执 ...

  9. eval-Evaluation

    eval is a function which evaluates a string as though it were an expression and returns a result; in ...

  10. indexedDB介绍

    什么是 indexedDB IndexedDB 是一种使用浏览器存储大量数据的方法.它创造的数据可以被查询,并且可以离线使用. IndexedDB对于那些需要存储大量数据,或者是需要离线使用的程序是非 ...