背景

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

复制冲突的理解:当备库正在应用主库传输过来的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. 项目实战:Qt+FFmpeg录屏应用(支持帧率、清晰度设置)

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/109827936各位读者,知识无穷而人力有穷,要 ...

  2. django学习第十三天--自定义中间件

    jquery操作cookie 下载地址 http://plugins.jquery.com/cookie/ 引入 <script type="text/javascript" ...

  3. 推荐10款C#开源好用的Windows软件

    DevToys 项目简介:DevToys是一个专门为开发者设计的Windows工具箱,完全支持离线运行,无需使用许多不真实的网站来处理你的数据,常用功能有:格式化(支持 JSON.SQL.XML).J ...

  4. 目标检测 - VOC - xml标注格式

    目标检测 - VOC - xml标注格式 相对其他计算机视觉任务,目标检测算法的数据格式更为复杂.为了对数据进行统一的处理,目标检测数据一般都会做成VOC或者COCO的格式. XML标注格式 < ...

  5. 2-Django之三板斧

    HttpResponse 返回字符串类型的数据 HttpResponse: 这是 Django 自带的类,用于构建基本的 HTTP 响应 我的app名称是demo,我们先按照正常的流程,在views中 ...

  6. 第125篇: 期约Promise基本特性

    好家伙,本篇为<JS高级程序设计>第十章"期约与异步函数"学习笔记 1.非重入期约 1.1.可重入代码(百度百科) 先来了解一个概念 可重入代码(Reentry cod ...

  7. DataGear 制作基于Vue2、Element UI前端框架的数据可视化看板

    DataGear 数据可视化看板内置了一些基本.简单的页面交互组件,当它们无法满足实际看板需求时,可以引入更流行和强大的前端框架. 本文以Vue2.Element UI前端框架为例,介绍如何制作具有更 ...

  8. 笔记本linux问题记录

    目录 UEFI笔记本无法引导进入操作系统 grub引导错误,无法进入系统 笔记本亮度不能保存 禁用独立显卡 KVM 解决nmcli dev 中的wlan0显示unavailable 杂项 UEFI笔记 ...

  9. union和union all的区别?

    一. 显示结果不同 union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果集全部显示出来 二.对重复结果的处理不同 union all是直接连接,取到的是所有值,记录可能有的 ...

  10. android 混淆规则作用,Android代码混淆详解

    一.混淆的意义 混淆代码并不是让代码无法被反编译,而是将代码中的类.方法.变量等信息进行重命名,把它们改成一些毫无意义的名字,同时也可以移除未被使用的类.方法.变量等. 所以直观的看,通过混淆可以提高 ...