流复制和逻辑复制的区别

2023-12-28

有人能告诉我更多关于 PostgreSQL 中物理复制和逻辑复制之间的区别吗?


TL;DR:逻辑复制发送逐行更改,物理复制发送磁盘块更改。逻辑复制对于某些任务更好,而物理复制对于其他任务更好。

请注意,在 PostgreSQL 12(更新时的当前版本)中,逻辑复制稳定可靠,但相当有限。如果您问这个问题,请使用物理复制。


流式复制can be逻辑复制。这一切都有点复杂。

WAL 传送与流式传输

PostgreSQL中从master向replica发送数据主要有两种方式:

  • WAL-航运 or 连续归档,其中各个预写日志文件是从复制的pg_xlog by the archive_command在主服务器上运行到其他位置。 Arestore_command在副本中配置recovery.conf在副本上运行以获取存档,以便副本可以重播 WAL。

    这是用来做的时间点复制(PITR),用作连续备份的方法。

    主服务器不需要直接网络连接。复制可能会有很长的延迟,尤其是在没有archive_timeout放。 WAL 传送不能用于同步复制。

  • 流式复制,其中每个更改都会在发生时直接通过 TCP/IP 连接发送到一个或多个副本服务器。副本必须具有主服务器在其配置中配置的直接网络连接recovery.conf's primary_conninfo option.

    Streaming replication has little or no delay so long as the replica is fast enough to keep up. It can be used for synchronous replication. You cannot use streaming replication for PITR1 so it's not much use for continuous backup. If you drop a table on the master, oops, it's dropped on the replicas too.

因此,这两种方法具有不同的目的。然而,它们都将物理 WAL 档案从主库传输到副本;它们的区别仅在于时间,以及 WAL 段是否会归档到其他地方。

你可以而且通常应该combine这两种方法,通常使用流复制,但使用archive_command已启用。然后在副本上设置restore_command如果主数据库和副本数据库之间存在直接连接问题,则允许副本数据库回退以从 WAL 存档进行恢复。

异步流与同步流

除此之外,还有同步 and 异步流式复制:

  • In 异步流式复制当主服务器更快/更忙时,副本可以及时落后于主服务器。如果主服务器崩溃,您可能会丢失尚未复制的数据。

    如果异步副本落后主服务器太远,则主服务器可能会丢弃副本所需的信息,如果max_wal_size(以前称为wal_keep_segments) is too low and no slot is used, meaning you have to re-create the replica from scratch. Or the master's pg_wal(waspg_xlog)可能会填满并停止主服务器工作,直到磁盘空间被释放,如果max_wal_size太高或使用了插槽。

  • In synchronous replication the master doesn't finish committing until a replica has confirmed it received the transaction2. You never lose data if the master crashes and you have to fail over to a replica. The master will never throw away data the replica needs or fill up its xlog and run out of disk space because of replica delays. In exchange it can cause the master to slow down or even stop working if replicas have problems, and it always has some performance impact on the master due to network latency.

    当有多个副本时,一次只有一个是同步的。看synchronous_standby_names.

您无法进行同步日志传送。

实际上,您可以将日志传送和异步复制结合起来,以防止在落后太远的情况下重新创建副本,而不会有影响主服务器的风险。对于许多部署来说,这是一个理想的配置,结合监视副本落后于主服务器的距离,以确保其处于可接受的灾难恢复限制内。

逻辑与物理

在之上that我们有logical vs physical流式复制,在 PostgreSQL 9.4 中引入:

  • In 物理流复制更改几乎在磁盘块级别发送,例如“在关系 12311 的磁盘页 18 的偏移量 14 处,写入了十六进制值 0x2342beef1222 的元组......”。

    物理复制发送一切:PostgreSQL 安装中每个数据库的内容,每个数据库中的所有表。它发送索引条目,当您发送整个新表数据时VACUUM FULL,它会发送回滚的事务的数据等。因此它会产生大量的“噪音”并发送大量多余的数据。它还要求副本完全相同,因此您无法执行任何需要事务的操作,例如创建临时表或未记录的表。查询副本会延迟复制,因此需要取消对副本的长时间查询。

作为交换,在副本上应用更改既简单又高效,并且副本可靠地与主服务器完全相同。 DDL 是透明复制的,就像其他一切一样,因此不需要特殊处理。它还可以在发生大事务时对它们进行流式处理,因此即使对于大的更改,主服务器上的提交和副本上的提交之间也几乎没有延迟。

物理复制已经成熟、经过充分测试并被广泛采用。

  • 逻辑流式复制9.4 中的新功能,在更高级别发送更改,并且更有选择性。

它一次仅复制一个数据库。它仅发送行更改并且仅发送已提交的事务,并且不必发送真空数据​​、索引更改等。它可以有选择地仅发送数据库中某些表的数据。这使得逻辑复制much带宽效率更高。

在更高级别上操作还意味着您可以在副本数据库上执行事务。您可以创建临时表和未记录的表。如果你愿意的话,甚至是普通的桌子。您可以使用外部数据包装器、视图、创建函数,无论您喜欢什么。如果查询运行时间太长,也无需取消查询。

逻辑复制还可以用于在 PostgreSQL 中构建多主复制,这是使用物理复制无法实现的。

但作为交换,它(目前)无法在发生大交易时对其进行流式传输。必须等到他们承诺为止。因此,在主服务器上提交大事务和应用于副本服务器之间可能存在很长的延迟。

它严格按照提交顺序重播事务,因此小型快速事务可能会卡在大事务后面并延迟相当长一段时间。

DDL 不会自动处理。您必须自己保持主副本之间的表定义同步,或者使用逻辑复制的应用程序必须拥有自己的工具来执行此操作。要做到这一点可能很复杂。

应用过程本身也比“在我被告知的地方写入一些字节”更复杂。与物理复制相比,它在副本上占用的资源也更多。

当前的逻辑复制实现并不成熟或广泛采用,或者特别易于使用。

选项太多,告诉我该怎么做

唷。很复杂吧?我什至还没有深入了解延迟复制、插槽的细节,max_wal_size、时间表、促销如何运作、Postgres-XL、BDR 和多主机等。

那么你应该怎么办do?

没有单一的正确答案。否则 PostgreSQL 将只支持这种方式。但有一些常见的用例:

For 备份和灾难恢复 use pgbarman为您进行基础备份并保留WAL,提供易于管理的连续备份。您仍然应该定期服用pg_dump备份作为额外保险。

For 高可用性,零数据丢失风险使用流式同步复制。

For 高可用性、低数据丢失风险和更好的性能您应该使用异步流复制。要么启用 WAL 归档以进行回退,要么使用复制槽。使用 Icinga 等外部工具监控副本落后于主服务器的距离。

参考

  • 连续归档和 PITR http://www.postgresql.org/docs/current/static/continuous-archiving.html
  • 高可用性、负载平衡和复制 http://www.postgresql.org/docs/current/static/high-availability.html
  • 复制设置 http://www.postgresql.org/docs/current/static/runtime-config-replication.html
  • 恢复配置文件 http://www.postgresql.org/docs/current/static/recovery-config.html
  • pgbarman http://www.pgbarman.org/
  • repmgr http://www.repmgr.org/
  • wiki:复制、集群和连接池 https://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

流复制和逻辑复制的区别 的相关文章

  • Postgres:显示继承的字段

    我应该实现什么查询来获取继承的列 读过this http www alberton info postgresql meta info html综合帖子没有找到解决办法 如果我理解正确的话 您想知道作为表之间继承的一部分的列的名称 SELE
  • 如何重命名 MySQL 数据库(更改架构名称)?

    如何快速重命名 MySQL 数据库 更改其架构名称 通常我只是转储数据库并使用新名称重新导入它 对于非常大的数据库来说 这不是一个选项 显然RENAME DATABASE SCHEMA db name TO new db name 做了坏事
  • 私人聊天系统MYSQL查询显示发送者/接收者的最后一条消息

    在这里我延伸一下我之前的问题 私人聊天系统MYSQL查询ORDERBY和GROUPBY https stackoverflow com questions 10929366 private chat system mysql query o
  • Django 中从 sqlite 迁移到 postgresql

    我想迁移自sqlite to PostgreSQL db 我安装了 postgresql 并在其 shell 上创建数据库 然后配置我的 django 设置如下 default ENGINE django db backends postg
  • Npgsql 参数化查询输出与 PostGIS 不兼容

    我在 Npgsql 命令中有这个参数化查询 UPDATE raw geocoding SET the geom ST Transform ST GeomFromText POINT longitude latitude 4326 3081
  • SQLite (Android):使用 ORDER BY 更新查询

    Android SQLite 我想要在 myTable 中的其他行之间插入行在android中使用SQLite 为此 我尝试增加从第 3 行开始的所有行的 id 这样 我就可以在位置 3 处插入新行 myTable 的主键是列 id 表中没
  • Postgres JSON 数据类型 Rails 查询

    我正在使用 Postgres 的 json 数据类型 但想要使用嵌套在 json 中的数据进行查询 排序 我想在 json 数据类型上使用 where 进行订购或查询 例如 我想查询关注者数量 gt 500 的用户 或者我想按关注者或关注数
  • pg_dump 与 pg_dumpall?使用哪一个来进行数据库备份?

    I tried pg dump然后在另一台机器上我尝试导入 sql 并填充数据库 我看到 CREATE TABLE ERROR role prod does not exist CREATE TABLE ERROR role prod do
  • Postgres JSONB:数组数组的 where 子句

    postgres 中有 v 9 5 如果有的话 create table json test id varchar NOT NULL data jsonb NOT NULL PRIMARY KEY id 其中 data 是 json 并且包
  • 为 PostgreSQL 查询选择正确的索引

    简化表 CREATE TABLE products product no integer PRIMARY KEY sales integer status varchar 16 category varchar 16 CREATE INDE
  • 从对象定义生成数据库表

    我知道有几种 自动 方法可以创建数据访问层来操作现有数据库 LINQ to SQL Hibernate 等 但我有点厌倦了 我相信应该有更好的做事方式 比如 在 Visio 中创建 更改表 使用 Visio 的 更新数据库 创建 更改数据库
  • AWS RDS MySql - 如何在设置“公开可用”后允许访问

    刚刚使用默认设置和用户 密码创建了新的 AWS RDS MySql 实例 我也将其设置为publicly available并在此过程中创建新的 VPC 目前无法从我的笔记本电脑连接到此 RDS mysql h endpoint u myu
  • 在laravel中组合两个不同的无关系数据库表查询进行分页

    我的数据库中有两个不相关的表 我需要将它们合并 以便我可以将其放在我的搜索视图中 但我不知道是否可能 这是我的代码 这news and season表不相关 但它们具有相似的列 我试图将其放入一个对象中以便于分页 是否可以 search r
  • 如何使用Java获取特定模式的所有表及其列?

    我有一个数据库架构 其名称为 Navid 这个模式中有很多表 当然每个表都有一些列 我需要的是一个java类 连接到我的数据库 有一个在所有表上循环的方法 2 1 有一个内部循环来定义表的所有列 制作创建表查询语句 我想在另一个数据库中创建
  • Postgres - 即使我的角色/用户已被授予“读取”权限,也无法从表中“选择”

    我在 postgres 上有一个管理员角色 用户和一个开发人员角色 开发人员角色继承了我为将来方便而创建的 readaccess 角色的属性 如果我运行 du 我得到 Role name Attributes Member of devel
  • MySQL JOIN 滥用?情况会变得有多糟糕?

    我读了很多关于关系数据库的文章 在每个 SELECT 上使用许多 JOIN 语句 但是 我一直想知道滥用这种方法从长远来看是否会出现任何性能问题 例如 假设我们有一个users桌子 我通常会添加 最常用 的数据 而不是进行任何额外的联接 例
  • PLpgSQL 函数不返回匹配的标题

    当给定文本时 我试图返回电影名称以及演员和工作人员的数量 当我输入字符串并使用 ilike 时 我的查询返回不匹配的标题 我之前创建了一个视图 其中包含要在函数中输入的电影标题和工作人员数量 我的代码是 create or replace
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • Django 独特的不工作

    我在从查询中过滤掉重复项时遇到问题 我正在使用 Django 1 4 和 Postgres 8 4 13 我在我的模型对象上使用这个查询 它是一个 jquery 自动完成 term request GET get term field re
  • 将 SQL Server 2008 DB 迁移到 Postgres [重复]

    这个问题在这里已经有答案了 我想将 SQL Server 2008 数据库迁移到 Postgres 有没有一种无痛的方法来做到这一点 是否有任何工具可以扫描架构和存储过程以标记兼容性问题 无痛http dbconvert com conve

随机推荐

  • Java日历日期错误

    谁能帮我理解为什么我得到不同的月份值 SimpleDateFormat dateFormat new SimpleDateFormat dd MM yyyy System out println dateFormat format cal
  • 如何加快从mysql到neo4j的插入速度?

    我在 mysql 中有一个包含 60000 个项目的数据集 我正在尝试将其插入 Neo4j 中 插入正在进行 但需要很长时间 大约每 3 秒 10 15 次 有什么办法可以加快速度吗 还有什么方法可以让我在 Neo4j 中提供诸如唯一键之类
  • 在 postgresql 中删除停用词而不进行词干化

    我想从数据中删除停用词 但我不想阻止这些词 因为确切的词对我很重要 我用了这个查询 SELECT to tsvector english colName from tblName order by lower asc 有什么方法可以在不阻止
  • 实体框架 6:将子对象添加到父对象的列表与将子对象的导航属性设置为父对象

    我有一个包含两个表的现有数据库MailServers and MailDomains in it MailDomains有外键列MailServerId指向Id主键列在MailServers 所以我们这里有一对多的关系 我跟着本文 http
  • Python:使用 setproctitle 更改进程名称

    我有一个 python 脚本 它启动许多 C 程序 每个程序都会传递一个命令行参数 如下所示 process path test process name test num process 10 for p in range 1 num p
  • Sequelize:如何在使用左外连接的连接表上执行 WHERE 条件

    我的数据库模型如下 员工驾驶一辆或零辆车辆一辆车可以由一名或多名员工驾驶车辆有一个模型类型 可以告诉我们它的燃料类型以及其他信息 我想要续集为我找到所有不开车的员工 或者如果他们开车 那么车辆不是柴油车 因此 其中 VehicleID 为
  • 带有 SharePoint 参数的 VB.Net 命令行(控制台)程序

    我想在 VB net 中创建一个允许参数的控制台程序 我想要做的是在下面的代码中添加参数 以便可以从 运行 菜单创建 Web 部件页面 例如C MyProgram exe Design 这将创建 Design Webpart 页面 我尝试在
  • 删除图中的文本

    我正在使用绘图功能sizetree from library plotrix 版本 3 8 1 这个函数有一个showcount允许括号中的一些计数显示在绘图上的参数 见下图 但我想知道为什么当我使用showcount FALSE 它们周围
  • Python 游戏网络

    我目前在寻找网络游戏编程资源时遇到困难 特别是Python 我不知道任何其他语言 我在 Python 中发现了很多关于通用网络的东西 但我不确定这就是我需要的 因为我相信游戏网络还涉及一些其他因素 我正在尝试创建一个在不同计算机上玩的 2
  • Python。如何使用libxml2获取属性值

    我使用的是 MINIDOM 但它不提供 xpath 方法 我现在尝试使用 libxml2 但在检索属性值时遇到问题 我的 xml 摘录如下
  • jersey 2.3.1 和 spring 集成兼容性问题

    我正在尝试创建将使用球衣和弹簧的宁静服务项目设置 我最初下载了 jersey1 8 依赖的 jar 我还得到了 jersey spring 1 8 并且我使用 com sun jersey spi spring container serv
  • 如何使用一对 FrameLabels 制作绘图网格?

    创建行 列 网格图 整个网格具有单个 FrameLabel 的最简单方法是什么 我需要类似的东西 p ListPlot RandomInteger 10 5 Joined gt True Axes gt False Frame gt Tru
  • Google 地图 API 3 搜索框

    我不知道如何在我的谷歌地图中实现搜索框 我有它 用户可以从表单中选择一些内容 然后在地图上加载标记 现在我想添加他们可以使用谷歌搜索框输入城市和州的位置 例如在maps google com上 这可以通过 API v 3 来完成吗 Goog
  • Eclipse:选择不包含任何可以在服务器上运行的资源

    我无法将 Maven Java Web 应用程序项目运行到 Eclipse IDE 中配置的 Tomcat 最初 我可以右键单击该项目并在 tomcat 服务器上运行它 但自从我将项目共享到存储库后 我无法执行此操作 我从存储库中断开了项目
  • 确定 JS AudioContext.analysisrNode 中的频率

    背景 我的目标是创建一个基于 JavaScript 的 Web 应用程序来分析和显示音频源 包括页内源 中的频率信息
  • 当理论规定使用已检查异常时,我是否应该使用相关的内置未检查异常?

    SO 上有很多关于 检查与非检查异常 主题的帖子 这个答案 https stackoverflow com a 19061110 2520359可能是最全面 信息最丰富的 然而 我仍然对遵循那里提出的逻辑感到矛盾 这是有原因的 我正在围绕一
  • 我应该在我的应用程序中包含命令行模式吗?

    出于学习目的 我正在 C 和 winforms 中开发一个类生成应用程序 我认为包含允许在脚本中使用应用程序的命令行模式可能会很好 在我的应用程序中包含命令行模式是一个很好的做法吗 最好有两个不同的程序 一个带有 GUI 一个用于命令行 实
  • 如何使 Flask/Jinja2 加载可执行 zip 存档中的捆绑模板?

    我已将 Flask Web 应用程序打包成可执行的 Python 压缩存档 zipapp https docs python org 3 6 library zipapp html 我在加载模板时遇到问题 Flask Jinja2 无法找到
  • 如果 ASP.NET 破坏了 DIV 的 ID,如何从 javascript 访问该 DIV?

    我有一个包含 div 元素的网页 在页面上 有 javascript 来引用 div document getElementById divId 在另一位开发人员重新设计该页面以使用 ASP 母版页之前 该方法一直运行良好 Now docu
  • 流复制和逻辑复制的区别

    有人能告诉我更多关于 PostgreSQL 中物理复制和逻辑复制之间的区别吗 TL DR 逻辑复制发送逐行更改 物理复制发送磁盘块更改 逻辑复制对于某些任务更好 而物理复制对于其他任务更好 请注意 在 PostgreSQL 12 更新时的当