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. UnrealEngine4初始化流程

    自古以来全部的游戏引擎都分为三个大阶段:Init,Loop,Exit.UE4也不例外. 首先找到带有入口函数的文件:Runtime/Launch/Private/XXXX/LaunchXXXX.cpp ...

  2. NOIP2017提高组模拟赛 7(总结)

    NOIP2017提高组模拟赛 7(总结) 第一题 斯诺克 考虑这样一个斯诺克球台,它只有四个袋口,分别在四个角上(如下图所示).我们把所有桌子边界上的整数点作为击球点(除了4个袋口),在每个击球点我们 ...

  3. vue项目中设置全局引入scss,使每个组件都可以使用变量

    在Vue项目中使用scss,如果写了一套完整的有变量的scss文件.那么就需要全局引入,这样在每个组件中使用. 可以在mian.js全局引入,下面是使用方法. 1: 安装node-sass.sass- ...

  4. CCS+C6678LE开发记录12:UIA组件的安装

    在安装了CCS 6.0版本的IDE和最新版的MCSDK后似乎一切都很完美,但事实并非如此. 当我试图编译SDK附带的image_processing (IPC based) demo时出现如下错误: ...

  5. 人生苦短,请用 Chrome!

    在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...

  6. Quartz介绍和使用

    Quartz介绍和使用 什么是Quartz,干什么的? Quartz框架是一个全功能.开源的任务调度服务,可以集成几乎任何的java应用程序—从小的单片机系统到大型的电子商务系统.Quartz可以执行 ...

  7. X86 X64 X86_64 AMD64 区别

    X86:32位(一般i386是32位CPU的统称) X64:64位(代表CPU:IA64,现在几乎没有这样纯粹的64位CPU,都是兼容32位的64位CPU,如下) X86_64:兼容32位的64位CP ...

  8. 3ds Max怎么制作亮木材质的球体

    3DSMax怎么制作亮木材质的球体?3DSMax中想要设计一款亮木材质的球体,该怎么设置呢?下面我们就来看看详细的教程,需要的朋友可以参考下! 1.运行软件,选择材质编辑器图标: 3.双击拖拽出的材质 ...

  9. dedecmsV5.7自定义图片字段调用方法

    正常情况下,在列表页(也就是 {dede:list}标签)调用附加的图片类型字段则会出现Fatal error: Call to a member function GetInnerText() on ...

  10. hdu5321 beautiful set(莫比乌斯反演)

    设\(cnt[i]\)为权值为i的倍数的数的数量. \(f0[i],f1[i]\)分别为两种方法\(gcd=i\)的贡献是i的多少倍. \(F0[i],F1[i]\)分别为两种方法\(gcd\)为\( ...