背景

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

复制冲突的理解:当备库正在应用主库传输过来的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. ORACLE FORALL介绍

    ORACLE 10G OFFICIAL DOCUMNET  ---------------------------------------------------------------------- ...

  2. SpringBoot+Shiro+LayUI权限管理系统项目-2.业务模型分析

    1.项目模型介绍 1.1 部门表 部门编码.部门名称.上级部门 1.2 角色表 角色编码.角色名称 1.3 权限表 权限名称.权限标识.权限类型.上级权限.URL.权限图标.是否外部打开 1.4 用户 ...

  3. IDA 反汇编 explorer

    之前写过一篇关于 IDA 在无 dmp 文件下如何定位到崩溃点的文章,由于其中涉及到公司项目,就仅限自己看了 正好今天看到一篇关于火绒软件误杀 explorer 的文章,并且有相关的复现过程 文章已经 ...

  4. 从 vs 的 rc 文件中获取版本号

    更新项目版本号时,需要与 rc 文件的 version 同步,比较方便的方法是直接从 rc 文件中获取版本号,并应用到程序中 // 删除日志检查 bool GetVersion() { // get ...

  5. 深入理解Go语言(04):scheduler调度器-GMP里结构体源码分析

    在前面一节中简单介绍了golang的调度模型-GPM模型,介绍了他们各自的作用.这篇文章就来看看他们的源码结构. Go版本:go1.13.9 M结构体 M结构体是OS线程的一个抽象,主要负责结合P运行 ...

  6. 2021 虎符杯hate num 注入题

    前言 今天遇到个有意思的SQL盲注,花了不少功夫,也学到了新姿势,遂记录下来以备后续碰到相同场景使用. 题目 这是2021 虎符杯的一道web题,有一个目标站点且附带了源码. 源码内容包括: 主要逻辑 ...

  7. 第一百一十八篇: JavaScript 原型链式继承

    好家伙,好家伙,本篇为<JS高级程序设计>第八章"对象.类与面向对象编程"学习笔记 1.原型链 原型链是JS实现"继承"的方案之一 ECMA-262 ...

  8. 压测中TPS上不去的几种原因及分析?

    1. 服务器资源限制:服务器的硬件资源(如 CPU.内存.磁盘)可能不足以处理大量的请求.在高负载情况下,服务器可能无法及时响应所有的请求,导致 TPS 上不去.解决方法可以考虑升级硬件资源或通过负载 ...

  9. 九: Mysql逻辑架构

    # 逻辑架构 1. 服务器处理客户端请求 首先MySQL是典型的C/S架构,即Client/Server架构,服务器端程序使用的mysqld· 不论客户端进程和服务器进程是采用哪种方式进行通信,最后实 ...

  10. kafka 为什么能那么快?高效读写数据,原来是这样做到的

    1. 利用 Partition 实现并行处理 我们都知道 Kafka 是一个 Pub-Sub 的消息系统,无论是发布还是订阅,都要指定 Topic. Topic 只是一个逻辑的概念.每个 Topic ...