PostgreSQL Replication系列翻译自PostgreSQL Replication一书

在本章中,将会介绍不同的复制概念,您会了解哪些类型的复制对哪一种实用场景是最合适的。 在本章的最后,您将能够判断某个概念在各种情况下是否是可行的。

我们在本章将介绍以下主题:

• CAP理论

•复制的物理限制

•为什么延迟有影响

•同步和异步复制

•拆分和复制

在我们使用PostgreSQL实际工作之前,我们将引导您完成一些非常基本的与复制相关想法和事实。

1.1 CAP理论和物理限制

您可能会问,为什么一个理论可以在一本书这样一个突出的地方被发现,这被认为是非常实用的。那么,有一个很简单的理由:一些商业数据库厂商的一些看起来很好看的市场方案留给您的印象是一切皆有可能,是没有任何严重限制的,容易做的。这并不是事实;每一个软件供应商必须处理这些限制。没有任何办法绕过自然规律,市场并不能克服自然。

在本章中,您将被介绍到所谓的CAP理论。在解决一些不能被变成现实的需求的情况下,理解这一理论的基本思想是必不可少的。

1.1.1 理解CAP理论

在我们深入到细节之前,我们必须讨论CAP的实际意义。CAP是一下三个特征的缩写:

Consistency(一致性):该特征表明集群中的所有节点在同一时刻是否看到了相同的数据。

Availability(可用性):该特征表明是否所有的请求都可以收到一个返回结果。用户是否可以认为一个集群中的所有节点是可用的?在两台机器之间拆分数据或状态信息。发出一个请求,机器1有一部分数据,机器2拥有剩余部分的数据。如果任何一台机器出现故障,并不是所有的请求都可以被满足,因为并不是所有的数据或状态信息在任何一台机器上都是可用的。

Partition tolerance(分区容忍性):该特征表明在工作过程中如果有任意的消息丢失,系统是否能够继续工作。当一个系统不再接受访问时(考虑一个网络连接失败),就会发生一个网络分区事件。考虑分区容忍性的一个不同的方法是把它作为消息传递。如果一个专用系统不能再发送/接收消息到/从其他系统,它已被有效地从网络中除去。

为什么这前三个要点与普通用户有关呢?坏消息是一个复制(或分布)系统只能同时提供2/3的特征。

在理论上是不可能同时提供一致性,可用性,分区容忍性。正如您将在本书后面看到的,这对系统的的安全和可用的布局有显著的影响。根本没有如此简单的事情作为解决所有复制相关的问题。当您规划一个大规模的系统,您可能要想出不同的概念去满足您的需求,这些概念取决于您的需要。

[PostgreSQL,Oracle,DB2等等将为您提供Cap,而NoSQL系统,例如,MongoDB 或者 Cassandra 将为您提供cAP。这就是为什么NoSQL通常被称为是最终一致的。]

1.1.2 为什么光速重要

光速不仅是一个理论问题,它确实会对您的日常生活产生影响。更重要的是,它对您找到适合您集群的解决方案有重要的含义。

我们都知道,宇宙的极限速度是光速。那么,为什么要在乎?好吧,让我们做一个简单的心里实验。让我们假设我们的数据库服务器以3GHz的时钟速度运行。

在您的CPU的一个时钟周期内光可以走多远的距离?如果您计算的话,您会发现光在每个时钟周期(纯真空)走的距离为10厘米。我们可以假设在CPU内的电信号会比在真空中的光的幅度较慢。核心思想是:一个时钟周期10厘米?一点都不多。

为了我们的心理实验,现在让我们考虑不同的距离:

•两个CPU之间的距离

•您的服务器到隔壁其他服务器的距离

•您在欧洲中部的服务器到中国服务器的距离

考虑到在电路板上的一个CPU核的大小,您可以假设从CPU的一个部分发送一个信号(尽管他没有光的速度快)到其他部分相当地快。计算已经在您的CPU的一级缓存中的两个数据的和它根本用不了一百万个时钟周期。

但是,如果您必须从一个服务器发送一个信号到其他服务器发生了什么?您可以安全地假设从服务器A发送一个信号到隔壁的服务器B需要花费很长时间,因为电缆是比较长的。通常情况下,它超过10厘米。除此之外,网络交换机和别的网络组件将产生额外的延迟。(此处电缆的长度不是电缆的带宽)

[这里我说的是电缆的长度,而不是关于它的带宽。]

从欧洲发送消息(或事物)到中国,通常情况下和发送一些数据到隔壁的服务器相比要耗费更多的时间。再次,重要的是,这里的数据量和所谓的延迟时间并不相关。

1.1.3 远程传输

让我尝试通过给出一个非常简单的例子来解释延迟的概念。假设您是欧洲人,您在发送一封信到中国。您会很容易接受这个事实:您的信的大小并不是这里的限制因素。不论您的信是两页或二十页,并没有任何区别;到达目的地所花费的时间是基本相同的。此外,如果您同时发送一封,两封,十封信也是没有区别的。考虑到合理的信的数量,运送东西到中国的飞机(带宽)的大小通常不是问题。但是,所谓的往返很可能是一个问题。如果您依赖来自中国信件的响应来继续您的工作,您很快就会发现自己等了很久。

1.1.4 为什么延迟有影响

同样的概念也适用于复制(replication):如果您从欧洲发送数据块到中国,您应该避免等待响应。如果两台在同一个机架上的服务器之间发送数据块,您可能可以等待响应,因为您的电信号会足够快使信号即使返回。

[本节中描述的延迟的基本问题不是PostgreSQL所特有的。相同的概念和物理限制适用于所有类型的数据库和系统。和以前一样,这个事实有时候在闪亮的商业营销论文里静静地被隐藏和被忽视。尽管如此,物理定律是不变的。这适用于商业和开源软件。]

最重要的一点,您必须记住的是:在复制环境中,带宽不总能解决性能问题。在许多设置中,延迟至少和带宽一样重要。

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

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

    1.2不同类型的复制 现在,您已经完全地理解了物理和理论的局限性,可以开始学习不同类型的复制了. 1.2.1 同步和异步复制 我们可以做的第一个区分是同步复制和异步复制的区别. 这是什么意思呢?假设我 ...

  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. java单例模式详解

    饿汉法 饿汉法就是在第一次引用该类的时候就创建对象实例,而不管实际是否需要创建.代码如下: public class Singleton { private static Singleton = ne ...

  2. 修改nignx报错Nginx [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use)

    Nginx [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use) 这个错误是修改了nginx的配置时出现,表名80端口被程 ...

  3. Chart图表

    这东西挺直观 封装个类 public class aaa { private string name; public string Name { get { return name; } set { ...

  4. 2016 Multi-University Training Contest 1 J.Subway

    Subway Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Su ...

  5. 双系统win+ubuntu无法访问win的盘符

    1.打开终端:如果没有安装ntfs-3g就要安装: sudo apt-get install ntfs-3g 2.修复挂载错误的相应的分区: sudo ntfsfix /dev/sda(×) (×)取 ...

  6. ZeroMQ接口函数之 :zmq_connect - 由一个socket创建一个对外连接

    ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_connect zmq_connect(3)  ØMQ Manual - ØMQ/3.2.5 Name zmq_c ...

  7. Web用户的身份验证及WebApi权限验证流程的设计和实现

    5. WebApi 服务端代码示例 5.1 控制器基类ApiControllerBase [csharp] view plaincopy   /// /// Controller的基类,用于实现适合业 ...

  8. hibernate 异常:could not execute statement

    错误信息: JDBC exception on Hibernate data access: SQLException for SQL [n/a]; SQL state [72000]; error ...

  9. android—-线性布局

    android五大布局之线性布局. 1.线性布局的特点:各个子元素彼此连接,中间不留空白 而今天我们要讲解的就是第一个布局,LinearLayout(线性布局),我们屏幕适配的使用 用的比较多的就是L ...

  10. SVM实践

    在Ubuntu上使用libsvm(附上官网链接以及安装方法)进行SVM的实践: 1.代码演示:(来自一段文本分类的代码) # encoding=utf8 __author__ = 'wang' # s ...