4.7 冲突管理

在PostgreSQL中,流复制数据仅在一个方向流动。XLOG由master提供给几个slave,这些slave消耗事务日志并为您提供一个较好的数据备份。您可能想知道这怎么会导致冲突,这会发生冲突。

考虑一下情形:如您所知,数据复制有很小的延迟。因此,XLOG在由master产生之后结束于slave。这微小的延迟会引起如下图所示的情景:

我们假设一个slave开始读取一个表。它是一个长读操作。与此同时,master收到一个请求,实际地删除那个表。这有一点问题,因为slave仍然需要这个数据来执行它的SELECT语句。另一方面,所有来自master的请求任何情况下必须被服从。这是一个经典的冲突。

[如果发生冲突,PostgreSQL将发出一下错误信息:由于恢复冲突终止连接。]

有两种选择来解决这个问题:

1. slave终止有问题的操作之前,不要重放冲突的事务日志

2.杀死slave上的查询来解决那个问题。

第一选择在回放进程回放期间可能会导致严重的延迟,尤其是当slave执行相当长的操作。第二个选择可能经常杀死slave上的查询。数据库实例不能通过自己知道对您的应用程序什么是最好的。所以您必须要在延迟重放和杀死查询之间找到一个适当的平衡。

为了找到这个微妙的平衡,PostgreSQL在postgresql.conf中提供了两个参数:

max_standby_archive_delay = 30s

# max delay before canceling queries

# when reading WAL from archive;

# -1 allows indefinite delay

max_standby_streaming_delay = 30s

# max delay before canceling queries

# when reading streaming WAL;

# -1 allows indefinite delay

当有冲突操作的时候,max_standby_archive_delay 参数会告诉系统,终止XLOG重放需要多长时间。在默认设置中, 如果找到一个冲突,slave将推迟XLOG重放长达30s 。如果slave 正在从文件重放事务日志,这个设置是有效的。

如果XLOG正在通过流进入slave,max_standby_streaming_delay 会告诉slave ,终止XLOG重放需要多长时间。如果时间已经到期,并且冲突仍然存在,PostgreSQL 将取消那个语句,因为一个恢复问题引起slave系统上的问题,恢复XLOG恢复来追赶。

在前面的例子中,我们已经表明,如果一个表被删除,冲突可能会出现。这是一个明显的场景;然而,迄今为止,它还不是最常见的一个。它更可能是一行通过VACUUM或HOT-UPDATE来删除,导致slave上的冲突。

冲突一段时间冒出来一次很烦人,并引发您的应用产生不良行为。换句话说,如果可能的话,冲突应该避免。我们已经看到了重放日志是如何延迟的。这些并不是PostgreSQL提供的唯一机制。还有两个我们可以使用的设置。

两个设置中的第一个同时也是较早的设置是vacuum_defer_cleanup_age。它在事务中被测量并告诉PostgreSQL什么时候删除一行数据。通常如果没有更多的事务可以看到数据,一行数据通过VACUUM被删除。vacuum_defer_cleanup_age告诉VACUUM不立即清除一行数据,但是在数据被清除之前会等待一些事务。

推迟清理将保持一行数据的时间比需要的时间稍长。这有助于slave完成那些依靠旧数据行的查询。尤其是如果您的slave提供处理一些分析工作的服务,这将有助于确保没有查询白白的杀死。

还有一个控制冲突的方法是利用hot_standby_feedback。这个想法是slave向master报告事务ID,这也可以反过来,使用此信息来推迟VACUUM。这是避免slave上的清理冲突的最简单的方法之一。

[请记住,延迟清理会导致增加空间占用及一些副作用,在任何情况下都必须牢记。其效果和在master上运行长事务一样。]

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

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

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

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

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

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

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

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

    4.8 处理时间线 时间线是一个您必须要知道的一个重要的概念,尤其是当您规划一个大型的设置的时候. 那么,什么是时间线呢?事实上,它是XLOG的一个分支.正常情况下,刚设置的一个数据库实例使用的时间线 ...

  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. STL 之 iterator traits 备忘

    //5种迭代器.为了激活重载机制,定义的5个类型.每种迭代器就是一个类型. struct input_iterator_tag{}; struct output_iterator_tag{}; str ...

  2. Web前端国际化之jQuery.i18n.properties

    Web前端国际化之jQuery.i18n.properties jQuery.i18n.properties介绍 国际化是如今Web应用程序开发过程中的重要一环,jQuery.i18n.propert ...

  3. Service Mesh(服务网格)

    Service Mesh(服务网格) 什么是Service Mesh(服务网格)Service mesh 又译作 "服务网格",作为服务间通信的基础设施层.Buoyant 公司的 ...

  4. vue中router-link的click事件失效的解决办法

    title: vue中router-link的click事件失效的解决办法 toc: false date: 2018-12-04 16:28:49 categories: Web tags: vue ...

  5. POJ 1949 DP?

    题意: 有n个家务,第i个家务需要一定时间来完成,并且第i个任务必须在它 "前面的" 某些任务完成之后才能开始. 给你任务信息,问你最短需要多少时间来完成任务. 输入: 第一行n个 ...

  6. git工作中常用命令-工作中踩过的坑

    踩坑篇又来啦,这是我在工作中从git小白进化到现在工作中运用自如的过程中,踩过的坑,以及解决办法. 1.基于远程develop分支,建一个本地task分支,并切换到该task分支 git checko ...

  7. LeetCode 190. Reverse Bits (算32次即可)

    题目: 190. Reverse Bits Reverse bits of a given 32 bits unsigned integer. For example, given input 432 ...

  8. eclipse历史版本下载地址

    http://wiki.eclipse.org/Older_Versions_Of_Eclipse

  9. SASS 使用(vs code)

    二.在vs code中编译sass 1.在拓展商店里搜索“easy sass”,并安装,安装成功后点重新加载. 2.接下来进行配置: 在 vs code 菜单栏依次点击“文件 首选项 设置”,打开 s ...

  10. layui Layui-Select多选的使用和注意事项

    1.最近买了layadmin的后台框架,使用Layui-Select总结如下 A.配置:我采用的全局引入配置的方式 赋值(选中状态)