背景

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

复制冲突的理解:当备库正在应用主库传输过来的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. Hooks与普通函数的区别

    Hooks与普通函数的区别 在这里的Hooks具体指的是自定义Hooks,自定义的Hooks与我们定义的普通函数类似,都可以封装逻辑,以实现逻辑的复用.Hooks实际上是一种特殊的函数,而由于Hook ...

  2. Java设计模式-备忘录模式Memento

    介绍 备忘录模式(Memento Pattern)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 可以这里理解备忘录模式:现实生 ...

  3. powerdesigner自定义实体显示的属性

    我做概要设计的时候需要画实体的逻辑模型图,默认的时候是这样的: 但是我想只保留属性名,隐藏数据类型和下面的横线怎么办?效果如下: 按以下操作即可实现:

  4. 代码+案例,实战解析BeautifulSoup4

    本文分享自华为云社区<从HTML到实战:深入解析BeautifulSoup4的爬虫奇妙世界>,作者:柠檬味拥抱. 网络上的信息浩如烟海,而爬虫技术正是帮助我们从中获取有用信息的重要工具.在 ...

  5. win32-localtime的使用

    下面的例子用于反映本地系统的日期格式变化 // locale test #include <stdio.h> #include <locale.h> #include < ...

  6. win32 - EnumDisplayDevices和EnumDisplayMonitors的使用

    EnumDisplayDevices枚举适配器 EnumDisplayMonitors枚举监视器 #pragma comment(lib, "dxva2.lib") #includ ...

  7. 文件IO操作开发笔记(一):使用Qt的QFile对磁盘文件存储进行性能测试以及测试工具

    前言   在做到个别项目对日志要求较高,要求并行写入的数据较多,尽管写入数据的线程放在子线程,仍然会造成界面程序的假死(实际上Qt还是在跑,只是磁盘消耗超过瓶颈,造成假死(注意:控制台还能看到打印输出 ...

  8. github.com/json-iterator/go 详细教程

    最近接触到了 github.com/json-iterator/go , 是由滴滴开源的第三方json编码库,它同时提供Go和Java两个版本. 文中大量内容来自 github 上的 wiki 文档, ...

  9. Linux Cheat Sheet

  10. Ubuntu中安装使用QEMU/KVM/virt-manager运行虚拟机

    本文为原创,原文发布于个人博客网站:Ubuntu中安装使用QEMU/KVM/virt-manager运行虚拟机 有时候我们需要在同一台计算机中使用多种不同操作系统环境,基于已有的同一堆硬件资源来获得不 ...