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

在本章,我们将讨论以下主题:

• 配置异步复制

• 理解流

• 合并流和归档

• 管理时间线

在本章的最后,您将很容易地在几分钟内设置流复制。

4.1 设置流复制

在前面章节中,我们已经从简单的16MB XLOG文件做了恢复。从逻辑上讲,重放进程一次只能重放16MB。这在您的复制设置中会导致延迟,因为您必须等到master数据库实例创建完16MB。在许多情况下,这种延迟是不能被接受的。

[丢掉了最后的XLOG文件,该文件尚未最后确定(并因此不发送归档,由于崩溃丢失),往往是为什么人们报告在即时恢复(PITR,Point-In-Time-Recovery) 情况下数据丢失的核心原因。]

在这种情况下,流复制将解决您的问题。使用流复制,复制的延迟将是最小的,您可以享受保护您的数据的一些额外的水平。

让我们来谈谈PostgreSQL流基础设施的总体架构。下图显示了基本的系统设计:

您已经看到了这种类型的架构。我们在这里添加了流连接。它基本上是一个正常的数据库连接,和您使用任何其它应用的连接一样。唯一的区别是,在流连接的情况下,该连接处于一种能够携带XLOG的特殊模式。

4.1.1 调整master服务器上的配置文件

现在的问题是:如何才能使一个流连接存在?在前面的例子中已经做了大部分基础设施。在master上,以下设置必须设置:

• wal_level 必须设置为 hot_standby

• max_wal_senders 必须设置为一个合理的较高的值来支持足够多的slaves

[archive_mode和archive_command怎么设置?很多人使用流复制尽可能地使他们的系统复制更多的数据到slave。除此之外,基于文件的复制经常被使用来确保有一个额外的安全层。基本上,两种机制使用相同的技术;在基于流和基于归档的恢复中只是XLOG源不同。]

既然master知道它应该产生足够的XLOG,处理XLOG发送等,我们可以继续下一个步骤。

出于安全的原因,您必须配置master能够流复制连接。这需要改变pg_hba.conf正如前面章节所示。其次,这需要运行pg_basebackup和随后的流连接。如果您正在使用传统的方式做基础备份,您还需要允许复制连接到流式传输XLOG,因此,这一步是必须的。

一旦您的master已经成功地配置了,您可以重新启动数据库(以使wal_level和max_wal_senders工作)并继续在slave上工作。

4.1.2 处理pg_basebackup和recovery.conf

到现在,您已经看到那个进程绝对一致地执行正常的即时恢复(PITR,Point-In-Time-Recovery)。目前唯一不同的是wal_level,为了正常的即时恢复(PITR,Point-In-Time-Recovery)它必须配置不同的参数。这是相同的技术,没有差别。

为了取得基础备份库我们使用pg_basebackup正如前面章节所示。下面是一个例子:

iMac:dbhs$ pg_basebackup -D /target_directory \

-h sample.postgresql-support.de\

--xlog-method=stream

既然我们已经做了一个基础备份,我们现在可以去配置流了。要做到这一点,我们必须写一个叫recovery.conf(就像之前)的文件。下面是一个简单的例子:

standby_mode = on

primary_conninfo= ' host=sample.postgresql-support.de port=5432 '

我们有两个新的设置:

• standby_mode: 此设置将确保PostgreSQL一旦耗尽XLOG不会停止。相反,它会等待新的XLOG到达。要确保第二个服务器作为standby此设置是必须的,standby持续重放XLOG。

• primary_conninfo: 此设置会告诉我们的slave哪里可以找到master。您必须放置一个标准的 PostgreSQL连接串, (就像在 libpq中)  primary_conninfo 作为核心告诉 PostgreSQL 来流传送XLOG。

对于基本的设置,这两个设置完全足够了。现在我们所要做的启动slave,就像您开始启动一个正常的数据库实例。

iMac:slavehs$ pg_ctl -D . start

server starting

LOG: database system was interrupted; last known up

at 2013-03-17 21:08:39 CET

LOG: creating missing WAL directory

"pg_XLOG/archive_status"

LOG: entering standby mode

LOG: streaming replication successfully connected

to primary

LOG: redo starts at 0/2000020

LOG: consistent recovery state reached at 0/3000000

数据库实例已经成功启动了。它检测到正常的操作已经中断。然后它进入standby模式,并开始从primary流传输XLOG。PostgreSQL然后到达一致状态,并且该系统 准备行动。

4.1.3 使slave可读

到目前为止,我们只设置了流传输。slave已经开始消耗来自master的事务日志,但是它还不是可读的。如果您尝试连接到该实例,您将面临如下场景:

iMac:slavehs$ psql -l

FATAL: the database system is starting up

psql: FATAL: the database system is starting up

这是默认配置。slave实例一直是备份模式并保持重放XLOG。

如果您想让slave可读,您必须在slave系统上适配postgresql.conf;hot_standby必须设置为on。您可以直接设置这个,但是您也可以在以后更改,当您需要这个特征的时候,简单地重启slave实例。

iMac:slavehs$ pg_ctl -D . restart

waiting for server to shut down....

LOG: received smart shutdown request

FATAL: terminating walreceiver process due to administrator command

LOG: shutting down

LOG: database system is shut down

done

server stopped

server starting

LOG: database system was shut down in recovery at 2013-03-17 21:56:12

CET

LOG: entering standby mode

LOG: consistent recovery state reached at 0/3000578

LOG: redo starts at 0/30004E0

LOG: record with zero length at 0/3000578

LOG: database system is ready to accept read only connections

LOG: streaming replication successfully connected to primary

重启将关闭服务器,并启动它再次备份。这不是太多的惊喜;然而,这值得看看日志。您可以看到,一个叫walreceiver的进程被终止。

一旦我们做了备份并且运行,我们就可以连接到服务器。从逻辑上讲,我们只允许执行只读操作:

test=# CREATE TABLE x (id int4);

ERROR: cannot execute CREATE TABLE in a read-only transaction

正如预期的结果,服务器将不接受写入。记住,slave是只读的。

4.1.4 底层协议

当使用流复制时,您应该注意两个进程:

• wal_sender

• wal_receiver

wal_sender实例是提供XLOG给他们的slave上称为wal_receiver进程的master实例上的进程。每个slave都有一个wal_receiver进程,并且这个进程恰好连接到数据源的一个wal_sender进程。

整件事情内部是如何工作的呢?正如我们以前所说的,从slave到master的连接基本上是一个 正常的数据库连接。事务日志采用和COPY命令一样的方法。COPY模式内部,PostgreSQL使用微语言来回地传送信息。主要的优势是这种微语言有它自己的解析器,因此快速并且以相当容易,非侵入性的方式增加功能是可能的。到了PostgreSQL9.2,一下命令是支持的:

• IDENTIFY_SYSTEM

• START_REPLICATION <position>

• BASE_BACKUP

°° [LABEL 'label']

°° [PROGRESS]

°° [FAST]

°° [WAL]

°° [NOWAIT]

您所看到的是和pg_basebackup提供的作为命令行标志的协议等级。

PostgreSQL Replication之第四章 设置异步复制(1)的更多相关文章

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

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

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

    4.4 基于流和基于文件的恢复 生活并不总只是黑色或白色:有时也会有一些灰色色调.对于某些情况下,流复制可能恰到好处.在另一些情况下,基于文件复制和PITR是您所需要的.但是也有许多情况下,您既需要流 ...

  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. moveToThread的根本目的还是为了处理QObject的事件循环(如果为空指针的话,当前对象的所有的事件都不处理了),看官方说明就知道了

    Changes the thread affinity for this object and its children. The object cannot be moved if it has a ...

  2. Testbench的编写

    Testbench的作用,在于给我们编写的可综合代码的模块送入激励.即在我们波形仿真中用编写testbench来代替拖拽波形.其中还包括了我们硬件仿真与matlab仿真的联调建立(将matlab产生的 ...

  3. xBIM 基础16 IFC的空间层次结构

    系列目录    [已更新最新开发文章,点击查看详细]  本篇介绍如何从文件中检索空间结构.IFC中的空间结构表示层次结构的嵌套结构,表示项目,站点,建筑物,楼层和空间.如果您查看IFC文档, 您会发现 ...

  4. 配置 NTP 时间服务器

    对于我们当前这种案例,主要目标是把 z01 这台服务器设置为时间服务器,剩下的 z02,z03 这两台机器同步 z01 的时间,我们需要这样做的原因是因为,整个集群架构中的时间,要保持一致. ** 检 ...

  5. 【原创】TimeSten安装与配置

    1.安装TimeSten 2.安装时要指定TNS_ADMIN_LOCATION,即tnsnames.ora的路径,因为tt会根据这个连接Oracle.C:\TimesTen\tt1122_32\net ...

  6. php创建图像具体步骤

    php 的图像处理在验证码是最常见的,下面说下使用php创建图像的具体步骤. 简要说明:PHP 并不仅限于创建 HTML 输出, 它也可以创建和处理包括 GIF, PNG(推荐), JPEG, WBM ...

  7. Glidar: 一个基于OpenGL的开源实时3D传感器仿真器

    1 简介 这篇博文将介绍一个简单易用的3D传感器仿真器,可以用来模拟Lidars,立体视觉,基于时间飞行技术的ToF相机和微软的Kinect实时产生3D点云数据.Glidar仿真器并不是针对特定的某一 ...

  8. 壹、js的概述

    一.js的起源 1992年的时候,一家名为Nomnas的公司开发出了c减减的嵌入式脚本语言:然后利用分享的方式,扩大其市场. 之后,Netscape为了扩展浏览器的功能,开发了一个名为LiveScri ...

  9. eclipse历史版本下载地址

    http://wiki.eclipse.org/Older_Versions_Of_Eclipse

  10. 是否可以从一个static方法内部发出对非static方法的调用

    不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方 法调用,而static方法调用时不需要创建对象,可以直接调用.也就是说,当一个static方法被调用时 ...