背景

如果我们看到这样的类似报错:那说明可能遇到了复制冲突。

复制冲突的理解:当备库正在应用主库传输过来的wal日志与备库正在进行的查询产生冲突就会有此报错。比如说备库正在执行基于某个表的查询,这时主库执行了drop table操作,该操作写入wal日志落盘后传至备库进行应用,为了保证数据一致性,备库会迅速回放数据,这时主库的操作和备库的查询形成冲突。尤其备库运行长查询时候,查询被取消了就会看到下面的报错。

ERROR:canceling statement due to confilct with recovery。

避免查询冲突的发生

hot_standby_feedback:

这个参数是查询冲突中最重要的参数,下面我们详细探讨一下。我们假设在没有备库的情况下,在主从架构中。设置hot_standby_feedback参数之后备库会定期向主库通知其最小活跃事务id(xmin)值,这就使得主库vacuum时不会清理大于xmin值的事务。

这样就有利于减少冲突的发生,但并不能完全避免冲突,请注意,这个参数只是减少了由于主库vacuum死亡元组造成的冲突,换句话说,并不能解决排他锁造成的冲突。同时还有第三种情况:由于网络中断造成的冲突,假如主备之间的网络中断后,备库就无法向主库正常发送xmin值,如果时间很长,主库在这段时间内还是会清理无用元组,这样网络恢复后就很可能继续发生上面的vacuum和备库造成的冲突。

任何事情都是有利有弊,要根据实际情况,有所取舍,好处就是减少了冲突,缺点就是由于主库的清理需要等待备库的事务结束,那么在频繁更新的场景下,可能造成主库数据膨胀和age的激增。然而,当积累足够多的死亡元组或表age,当备库查询结束,主库集中vacuum时会给I\O带来极致负担。所以我们在生产中设置hot_standby_feedback需要辅助下面参数一起使用,能够有效的降低冲突发生概率。

需要注意的是hot_standby_feedback参数并不会覆盖主库上old_snapshot_threshold参数限定的值,old_snapshot_threshold参数限制了死亡元组的无限膨胀,换句话说当事务信息超过old_snapshot_threshold的限制时,依然会进行清理。所以old_snapshot_threshold是给查询留出的最大限度时间。

max_standby_streaming_delay:

备机由于接收wal流日志产生查询冲突而取消查询之前的等待时间,设置该参数会在发生冲突时,备库查询不会马上取消查询,而是等待一段时间后如果还没结束再抛出报错。这个值的大小可以参考备库可能产生的长事务运行时间。这个参数指startup最多等多久

max_standby_archive_delay:

备机由于应用传输过来的归档日志产生查询冲突而取消查询之前的等待时间,和上面的参数类似,这个参数指startup最多等多久。(restore command 会遇到)

请注意这个参数设置的不合理会造成备库需要更长时间追平主库的数据,这就不能保证主备数据实时一致性。

vacuum_defer_cleanup_age:

指定vacuum延迟清理死亡元组的事务数,延迟的事务个数通过该参数进行设置。(不常用,因为不够具体明确,容易造成膨胀)

我们可以根据pg_stat_database和pg_stat_database_conflicts视图查看冲突的情况。

总结

仔细想一想,流复制本身并没有多大问题,也就是vacuum相关死亡元组必然会应用到备库,甚至我们希望流复制做的速度更快,延迟越小越好,以保证主备最大一致性。那么以上论述最应该避免的是长事务查询,然而主备往往配置了读写分离,在备库读的压力很大时候,加上一些不合理的sql和业务,以此产生了长查询,在oracle中长查询也是不可取的,因为同样可能造成undo表空间中的数据库被覆盖,其实undo中的retention时间就相当于上面提到的old_snapshot_threshold参数,只是undo中多保护了一个guarantee,没有客户不在意成本去无线扩充undo表空间,所以undo表空间往往被设置成非自动扩展,换句话说不允许很长的大查询发生。当然如果是OLTP系统另当别论,而且这也容易造成一致性读相关的性能问题。

KingbaseES V8R6在解决复制冲突中hot_standby_feedback参数的重要性的更多相关文章

  1. 解决Spring Mvc中接受参数绑定重名的方法

    html页面 <form method='post' action='url'> 用户名 <input type='text' name='name'> 用户id <in ...

  2. 一点解决版本冲突的应急思路、怎样在所有jar包文件中搜索冲突的方法?

    maven是一个很好的项目管理工具,你可以轻松的定义一个引用,从而达到使用别人写好的库的作用.且maven可以轻松地和jenkins配合,从而使打包部署变得更容易. 但是也因为这样,我们变得更傻瓜了, ...

  3. 解决 .net core 中 nuget 包版本冲突问题

    今天在一个 asp.net core 项目中遇到了 nuget 包版本冲突的问题,错误信息如下: Version conflict detected for Microsoft.AspNet.WebA ...

  4. use_frameworks!和#use_frameworks!的区别、解决Swift项目中use_frameworks!冲突的问题

    use_frameworks!和#use_frameworks!的区别 转自:https://www.jianshu.com/p/0ae58a477459 1. 用cocoapods 导入swift ...

  5. Git中使用amend解决提交冲突

    问题描述       场景:当你提交的时候,发现跟要合并的流有冲突,你需要解决完冲突再次提交. 如果在SVN时代,你可以直接在本地解决完冲突再提交就可以了,因为SVN会把正确的代码先提交到服务器,至于 ...

  6. SVN版本冲突中 Files 的值“ < < < < < < < .mine”无效路径中具有非法字符的解决办法

    .NET 中 SVN版本冲突中 Files 的值“ < < < < < < < .mine”无效路径中具有非法字符的解决办法: 一. 1.将项目逐个进行编译, ...

  7. Android 中 DrawerLayout + ViewPager 怎么解决滑动冲突?

    DrawerLayout 是 Android 官方的侧滑菜单控件,而 ViewPager 相信大家都很熟悉了.今天这里就讲一下当在 DrawerLayout 中嵌套 ViewPager 时,要如何解决 ...

  8. 解决 .net core 中 nuget 包版本冲突问题[转载]

    今天在一个 asp.net core 项目中遇到了 nuget 包版本冲突的问题,错误信息如下: Version conflict detected for Microsoft.AspNet.WebA ...

  9. KingbaseES V8R6集群部署案例之---Windows环境配置主备流复制(异机复制)

    案例说明: 目前KingbaseES V8R6的Windows版本不支持数据库sys_rman的物理备份,可以考虑通过建立主备流复制实现数据库的异机物理备份.本案例详细介绍了,在Windows环境下建 ...

  10. KingbaseES V8R6集群部署案例之---Windows环境配置主备流复制(同一主机)

    案例说明: 目前KingbaseES V8R6的Windows版本不支持数据库sys_rman的物理备份,可以考虑通过建立主备流复制实现数据库的异机物理备份.本案例详细介绍了,在Windows环境下建 ...

随机推荐

  1. VuePress + Github Pages 搭建文档博客

    说明 最近想把常用的一些干货知识点都集中起来,方便发布和查找.相当于创建一个自己的知识库,我就叫它Java技术文档.虽然博客写文档也挺方便,但是在于文档的集中阅读和管理方面还是不够简洁和快速.此处就以 ...

  2. HTML初始----day01

    1.HTML骨架标签总结 标签名 定义 说明 html标签 页面中最大的标签,称为根标签 <head></head> 文档的头部 注意在head标签中我们必须要设置的标签是ti ...

  3. 【webserver 前置知识 03】Linux网络编程入门其二,I/O多路复用

    I/O多路复用 I/O多路复用使得程序能够同时监听多个文件描述符 LInux下实现I/O多路复用的系统调用主要由select.poll以及epoll(常问,要会自己写出来) 例子 阻塞等待 阻塞等待可 ...

  4. 【LeetCode贪心#07】分糖果(两个维度)

    发糖果 力扣题目链接(opens new window) 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖 ...

  5. 【LeetCode二叉树#02】二叉树层序遍历(广度优先搜索),十合一专题

    二叉树层序遍历(广度优先搜索) 102 二叉树的层序遍历 力扣题目链接(opens new window) 给你一个二叉树,请你返回其按 层序遍历 得到的节点值. (即逐层地,从左到右访问所有节点). ...

  6. 【Azure API 管理】讨论APIM是否适合直接存储文件到Azure Storage Account呢?

    问题描述 需要从 APIM 直接将大文件存入Azure Storage,没看到这方面的官方文档,所以是否有这方面的实践案例,或者APIM是否支持引用SDK (如Azure Storage SDK)? ...

  7. java GUI 快速入门

    java 中编写 GUI 有两中工具包,分别为 AWT.Swing. Swing 是 AWT 的拓展,Swing 具有比 AWT 丰富的组件和方法. AWT 和 Swing 都能跨平台使用:AWT 会 ...

  8. Java 接口的应用:代理模式

    1 package com.bytezreo.interfacetest; 2 3 /** 4 * 5 * @Description 接口的应用:代理模式 6 * @author Bytezero·z ...

  9. vmware虚拟机出现此电脑无法运行win11,虚拟机中安装win11系统教程

    一.点击新建虚拟机 二.选择自定义安装 三.默认 四.选择win11镜像 五.选择windows 六.命名 七.勾选安全引导 八.两个处理器即可 九.最低4G内存,接下来一直默认点下一步即可 十.创建 ...

  10. 并发编程 --- CAS原子操作

    介绍 CAS(Compare And Swap) 是一种无锁算法的实现手段,中文名称为比较并交换.它由 CPU 的原子指令实现,可以在多线程环境下实现无锁的数据结构. 原理 CAS 的原理是:它会先比 ...