PostgreSQL Replication之第四章 设置异步复制(7)
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)的更多相关文章
- PostgreSQL Replication之第四章 设置异步复制(1)
执行完您的第一个即时恢复(PITR,Point-In-Time-Recovery),我们准备在一个真正的复制设置上工作.在本章,您将学会如何设置异步复制和流.我们的目标是确保您可以实现更高的高可用和更 ...
- PostgreSQL Replication之第四章 设置异步复制(2)
4.2 配置级联复制 正如您在本章已经看到的,设置流复制真的很容易.只需要设置几个参数,做一个基础备份,并享受您的复制设置. 在许多情况下,这种情况更有一点点微妙.在这个例子中我们假设:我们要使用一个 ...
- PostgreSQL Replication之第四章 设置异步复制(4)
4.4 基于流和基于文件的恢复 生活并不总只是黑色或白色:有时也会有一些灰色色调.对于某些情况下,流复制可能恰到好处.在另一些情况下,基于文件复制和PITR是您所需要的.但是也有许多情况下,您既需要流 ...
- PostgreSQL Replication之第四章 设置异步复制(8)
4.8 处理时间线 时间线是一个您必须要知道的一个重要的概念,尤其是当您规划一个大型的设置的时候. 那么,什么是时间线呢?事实上,它是XLOG的一个分支.正常情况下,刚设置的一个数据库实例使用的时间线 ...
- PostgreSQL Replication之第四章 设置异步复制(6)
4.6 有效的清理和恢复结束 最近几年, recovery.conf 已经变得越来越强大了.早在初期(在 PostgreSQL 9.0之前), 仅有 restore_command 和一些 recov ...
- PostgreSQL Replication之第四章 设置异步复制(5)
4.5 使流复制更健壮 当连接到master时,slave要做的第一件事情是赶上master.但是,这会一直工作吗?我们已经看到,我们可以使用由基于流和基于文件组成的混合设置.这给了我们一些额外的安全 ...
- PostgreSQL Replication之第四章 设置异步复制(3)
4.3 slave到master的切换 如果您想扩展读或您想做一个数据备份,一个 slave是件美好的事情.但是,slave可能不会一直是slave.在有些时候,您可能需要把slave转换为maste ...
- PostgreSQL Replication之第五章 设置同步复制(1)
到目前为止,我们已经处理了基于文件的复制(或日志传送)和简单的基于流复制的设置.在两种情况中,在master上事务被提交之后,数据被提交,由slave接收.在master提交和slave实际上完全地接 ...
- PostgreSQL Replication之第五章 设置同步复制(2)
5.2 理解实际影响和性能 在本章中,我们已经讨论了实际影响以及性能影响.但是,有什么好的理论性的例子吗?让我们做一个简单的基准测试,看看复制是怎么做的.我们做这样的测试来为您显示各种耐久性的级别不只 ...
随机推荐
- zzulioj--1600--直线与圆(简单数学几何)
1600: 直线与圆 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 360 Solved: 73 SubmitStatusWeb Board ...
- nyoj-737--石子合并(一)(动态规划)
石子合并(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆 ...
- ie浏览器检测不到cookie的问题
之前做项目由于客户的要求设置缓存必须由后台来设置必须使用cookie(session是没问题的),后期设置时出现了登录页面与首页来还跳转的局面.原因就是首页没检测到登录后的缓存,而后台验证到确实已经是 ...
- 优动漫PAINT中误删工具怎么办?
最近收到一些小伙伴的提问,说我不小心把 XXX工具从面板上删掉了怎么办?本教程就来给大家分 享一下遇到这个问题时的三种解决方法,遇到同样问题的小伙伴们赶紧进来看一下哟! 优动漫PAINT下载:http ...
- [CTSC1999]家园 分层图网络流_并查集
Code: #include<cstdio> #include<vector> #include<algorithm> #include<queue> ...
- pyftpdlib 搭建ftp环境
环境搭建: pythonwindows/linuxpip install pyftpdlib (安装失败请到这里下载:https://pypi.python.org/pypi/pyftpdlib/)一 ...
- 利用MFC创建窗口、消息映射、window中的字节
利用MFC创建窗口: 1.mfc的头文件:afxwin.h 2.自定义类,继承于CWinApp,应用程序类(app应用程序对象,有且仅有一个) 3.程序入口:Initinstance 4.在程序入口中 ...
- [BZOJ3673&3674]可持久化并查集&加强版
题目大意:让你实现一个可持久化的并查集(3674强制在线). 解题思路:刚刚介绍了一个叫rope的神器:我是刘邦,在这两题(实际上两题没什么区别)就派上用场了. 正解应该是主席树||可持久化平衡树,然 ...
- crontab执行脚本和手动执行脚本输出结果不一致的问题处理
背景:huskiesir最近用公司给分配的账户写了脚本去检测某应用状态并发送到企业邮箱,写完脚本之后去执行了一下,发现效果还不错,在邮箱显示效果如下: 10.11.116.6 检查结果OK,检查时间 ...
- 中国象棋程序的设计与实现(六)--N皇后问题的算法设计与实现(源码+注释+截图)
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题. 该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列 ...