1.2不同类型的复制

现在,您已经完全地理解了物理和理论的局限性,可以开始学习不同类型的复制了。

1.2.1 同步和异步复制

我们可以做的第一个区分是同步复制和异步复制的区别。

这是什么意思呢?假设我们有两台服务器,希望从一台服务器(the master)复制数据到第二台服务器(the slave)。下图说明了同步和异步复制的概念:

我们可以使用一个简单的事务如下所示:

BEGIN:

INSERT INTO foo VALUES ('bar');

COMMIT;

在异步复制的情况下,事务被提交到master之后数据才可以被复制。换句话说,slave从不会超前master,就写操作而言,通常滞后于master一些。此延迟(delay)被称为滞后性(lag)。

同步复制强制执行了较高的一致性规则。如果您决定使用同步复制(如何做到这一点实际上将在第五章中讨论,建立同步流复制),系统必须确保通过事务写入的数据至少事务同时在两台服务器上提交。这意味着:slave 不滞后于master,而且终端用户在两台服务器上看到的数据是一致的。

[有些系统也将使用仲裁服务器来决定。因此,它不是总是关于只有两个或者更多的服务器。如果一个仲裁服务器被使用,超过一半的服务器必须同意集群内的行动。]

理解复制和数据丢失

当一个事务从master复制到slave,很多事情必须考虑到,尤其是当涉及到像数据丢失的事情。

假设我们正在以以下方式异步复制数据:

  1. 事物发送到master。
  2. 事物提交到master。
  3. 在事物发送到slave之前,master宕机。
  4. slave永远都不会收到这个事务。

在异步复制的情况下,有一个窗口(滞后),在滞后窗口期间数据会丢失。滞后窗口的大小因设置类型的不同而不同。它的大小非常短(几毫秒)或非常长(几分钟,几小时,几天)。一个重要的事实是:数据可能丢失。一个小的滞后只会是数据丢失的可能性较小,但,任何大于零的滞后都容易导致数据丢失。

如果您想确保数据永远不丢失,您必须切换到同步复制。正如您在这个章节已经看到的,一个同步事务是同步的,因为如果事物提交到了两台服务器它是有效的。

考虑性能问题

正如您在关于光速和延迟章节所了解到的,通过网络发送不必要的消息的开销是昂贵的和费时的。如果一个事务采用同步的方式复制,PostgreSQL必须确保数据到达第二个节点,这样就会导致延迟问题。

在许多方面,同步复制比异步复制要昂贵很多,因此如果这种消耗确实需要和调整,人们应该三思而后行。(只在需要的时候使用同步复制)

[当真的需要的时候,才使用同步复制。]

1.2.2单master复制与多master复制

各种复制设置的第二种分类方法是单masster复制和多master复制。

单master意味着写操作只能发送到一个服务器,该服务器分配数据到内部设置的slave上。slave只能接收读操作但是不会接收写操作。

相对于单master复制,多master复制允许写操作发送到所有集群内部的服务器。下图显示了系统如何在一个概念层面工作:

可以写到集群内部的任何节点听起来像一个优点,但它不是一个必须的优点。其原因是多master复制给系统添加了不少复杂性。在只有一个master的情况下,哪个数据是正确的,数据会流向哪个方向是非常清楚的,而且在复制过程中很少有冲突。多master复制是完全不同的,写操作可以同时被发送到多个节点,集群必须非常清楚冲突并妥善地处理它们。使用锁来解决这个问题是一个可供选择的方法,但这种方法会产生其自身的问题。

[请记住,解决冲突的需要会产生网络通信,并且这可以瞬间变成由延迟引起的可扩展性问题。]

1.2.3 逻辑复制与物理复制

分类复制的另一种方式是逻辑复制和物理复制之间进行的区分。

不同是细微的,但非常重要。物理复制指系统将移动数据到远程服务器。

因此,如果有东西被插入。远程服务器将获取数据的二进制格式,而不是通过SQL。

逻辑复制意味着一个变化,相当于即将到来的数据被复制。

让我们看一个例子,充分理解两者的差异:

test=# CREATE TABLE t_test (t date);

CREATE TABLE

test=# INSERT INTO t_test VALUES (now())

RETURNING *;

t

------------

2013-02-08

(1 row)

INSERT 0 1

我能看到这里执行了两个事务:第一个事务创建了一个表。一旦这个完成后,第二个事务向表里增加了一个简单的日期并提交。

在逻辑复制的情况下,改变将被以逻辑形式发送到某种队列,因此系统不发送普通的SQL,但也许是如下的东西:

test=# INSERT INTO t_test VALUES ('2013-02-08');

INSERT 0 1

注意,函数调用已被替换为实际的值。如果slave重新计算now()函数,这将是一个巨大的灾难,因为在远程服务器的日期可能是一个完全不同的日期。

[有些系统把基于语句的复制作为核心技术。例如:MySQL使用一个所谓的bin-log来复制,这实际上并不是二进制,而是某种形式的逻辑复制。]

物理复制将工作在一个完全不同的方式:不是发送一些SQL(或其它),这在逻辑上是等价的,系统会发送PostgreSQL内部所做的二进制替代物。

下面是一些二进制替代物,我们的两个事务可能被触发(到目前为止,还不是一个完整的列表):

  1. 添加一个8k的块到pg_class并插入一条新的记录(表明表是目前的状态)。
  2. 添加行到pg_attribute存储列名。
  3. 执行这些表内的各种变化。
  4. 记录提交状态等等。

物理复制的目标是在相同的物理级别创建一个系统的副本。这意味着在所有的服务器上相同的数据将在您的表的相同的地方。在逻辑复制的情况下,但是不论内容是否在相同的地方,没有任何不同,内容应该是相同的。

何时使用物理复制

物理复制使用起来非常方便,尤其是容易建立。当目标是创建系统的相同副本(创建一个备份后,简单地扩展)时,物理复制被广泛使用。

在许多设置中,物理复制是标准的方法,该方法把尽可能最低的复杂性暴露给终端用户。它是理想的向外扩张数据的方法。

何时使用逻辑复制

通常逻辑复制的设置有点难,但它提供了更大的灵活性。当涉及到升级现有的数据库时,它也是特别地重要。物理复制完全不适合版本跳跃,因为您不能简单地依靠每个版本的PostgreSQL具有相同的磁盘布局的事实。存储格式可能会随时间而改变,因此二进制复制显然是不适合从一个版本跳跃到另一个版本的。

逻辑复制允许解耦合数据存储方式和数据传输,复制方式。通过使用中性协议,该协议并不和特定版本的PostgreSQL绑定,很容易从一个版本跳跃到另一个版本。

PostgreSQL Replication之第一章 理解复制概念(2)的更多相关文章

  1. PostgreSQL Replication之第一章 理解复制概念(1)

    PostgreSQL Replication系列翻译自PostgreSQL Replication一书 在本章中,将会介绍不同的复制概念,您会了解哪些类型的复制对哪一种实用场景是最合适的. 在本章的最 ...

  2. PostgreSQL Replication之第一章 理解复制概念(3)

    1.3 使用分片和数据分配 本节您将了解基本可扩展性技术,例如数据库分片.分片被广泛应用于高端系统并提供一个简单而且可靠的扩展设置方式来向外扩展.近年来,分片已经成为一种扩大专业系统规模的标准方式. ...

  3. PostgreSQL Replication之第二章 理解PostgreSQL的事务日志(1)

    在前面的章节中,我们已经理解了各种复制概念.这不仅仅是一个为了接下来将要介绍的东西而增强您的意识的理论概述,还将为您介绍大体的主题. 在本章,我们将更加接近实际的解决方案,并了解PostgreSQL内 ...

  4. PostgreSQL Replication之第二章 理解PostgreSQL的事务日志(3)

    2.3 理解一致性和数据丢失 挖掘PostgreSQL事务日志而不考虑一致性是不可能的.在本章的第一部分,我们已经大体上解释了事务日志的基本思想.您已经知道,无需事先的日志改变的能力,使数据处于一种好 ...

  5. PostgreSQL Replication之第二章 理解PostgreSQL的事务日志(5)

    2.5 XLOG的内部结构 我们将使用事务贯穿本书,并让您在技术层面上更深地洞察事情是如果工作的,我们已经增加了这部分专门处理XLOG的内部工作机制.我们会尽量避免前往下降到C级,因为这将超出本书的范 ...

  6. PostgreSQL Replication之第二章 理解PostgreSQL的事务日志(4)

    2.4 调整检查点和XLOG 目前为止,这一章已经提供深入洞察PostgreSQL如何写入数据,一般来说,XLOG是用来干什么的.考虑到这方面的知识,我们现在可以继续并学习我们能做些什么来使我们的数据 ...

  7. PostgreSQL Replication之第二章 理解PostgreSQL的事务日志(2)

    2.2 XLOG和复制 在本章中,您已经了解到PostgreSQL的事务日志已经对数据库做了所有的更改.事务日志本身被打包为易用的16MB段. 使用这种更改集来复制数据的想法是不牵强的.事实上,这是在 ...

  8. 20190813 On Java8 第一章 对象的概念

    第一章 对象的概念 抽象 Alan Kay 总结了对象的五大基本特征 万物皆对象. 程序是一组对象,通过消息传递来告知彼此该做什么. 每个对象都有自己的存储空间,可容纳其他对象. 每个对象都有一种类型 ...

  9. PostgreSQL Replication之第九章 与pgpool一起工作(1)

    在前面的章节中,我们已经能够深入地理解了pgbouncer,同时也学会了如何使用它来尽可能地优化复制设置.在本章我们将了解一个经常被称作与pgbouncer相对应的工具.尽管pgpool的思想与pgb ...

随机推荐

  1. LeetCode——Pascal's Triangle II

    Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3 ...

  2. ActionBarActivity设置全屏无标题

    新建的Activity继承自ActionBarActivity,设置全屏无标题本来非常easy的事,可是没想到app居然无缘无故的挂,要么就是白屏一片,要么就是黑屏.坑了我一个多小时.!! 原因是Ac ...

  3. 【翻译自mos文章】怎么正确的计算一个ip地址的subnet id?

    怎么正确的计算一个ip地址的subnet id? 来源于: How to calculate the correct subnet for an interface (文档 ID 1059759.1) ...

  4. Default Document <defaultDocument> IIS中的默认页面

    https://docs.microsoft.com/en-us/iis/configuration/system.webserver/defaultdocument/index Default do ...

  5. iOS CoreData介绍和使用(以及一些注意事项)

    iOS CoreData介绍和使用(以及一些注意事项) 最近花了一点时间整理了一下CoreData,对于经常使用SQLite的我来说,用这个真的有点用不惯,个人觉得实在是没发现什么亮点,不喜勿喷啊.不 ...

  6. Git 跟 GitHub 是什么关系?

    Git 跟 GitHub 是什么关系? 大概就是「魔兽争霸」与「对战平台」的关系吧. git是一个版本控制工具github是一个用git做版本控制的项目托管平台. git是一个版本管理工具,githu ...

  7. .NET深入解析LINQ框架2

    1].开篇介绍 在开始看本篇文章之前先允许我打断一下各位的兴致.其实这篇文章本来是没有打算加“开篇介绍”这一小节的,后来想想还是有必要反馈一下读者的意见.经过前三篇文章的详细讲解,我们基本上对LINQ ...

  8. 【参考】IBM sun.io.MalformedInputException and text encoding conversions transforms numerals to their word equivalents - United States

    Problem(Abstract) When converting contents from a file or string using WebSphere Application Server, ...

  9. ZBrush雕刻生物小技巧

    本教程主要学习如何使用ZBrush®3D图形绘制软件的工具和笔刷雕刻酷酷的生物造型,我们今天来看看在游戏.媒体和电视领域有着十几年丰富经验的3D角色艺术家Francis-Xavier Martins是 ...

  10. Visual Studio中C++工程的环境配置方法

    在Visual Studio的C++工程设置 1.添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录. 2.添加文件引用的lib静态库路径:工程---属性- ...