KingbaseES V8R6 复制冲突之锁类型冲突
背景
昨天遇到客户现场的一个有关复制冲突的问题
备库报错:ERROR: canceling statement due to conflict with recovery,user was holding a relation lock for too long
现场情景是备库执行逻辑备份过程中出现的报错,逻辑备份相当于备库查询语句,snapshot,这时主库业务繁忙,对备库查询对象加上exclusiveAccess锁,相关wal日志传输到备库和备库的查询或逻辑复制产生冲突。
查看pg_stat_database_conflicts视图,冲突类型为cflict_lock,也就是锁冲突。
备库基于参数max_standby_streaming_delay和max_standby _archive_delay的值来解决复制冲突。max_standby_streaming_delay参数确定备库在取消与即将应用的WAL日志冲突的查询之前必须等待多长时间。如果冲突语句在这段时间后仍在运行,那么数据库会取消该语句并发出以下错误消息:
ERROR: canceling statement due to conflict with recovery
然而,此错误信息通常因为备库运行长时间的查询导致。
示例
主库执行DROP,请该语句存储在WAL文件中,稍后会在备库上应用,以保持一致性。一个SELECT语句已经在备库上运行,其运行时间大于max_standby_streaming_delay中的值,然后SELECT语句被取消,以便可以应用wal日志中的DROP语句。
注意备库查询的表要足够大,时间足够长,才可以有时间模拟出冲突的出现
备库运行长查询:
select count(*) from t5;
备库查询运行结束前,在主库操作:
drop table t5;
这时在备库收到如下报错:
ERROR: canceling statement due to conflict with recovery
DETAIL: User was holding a relation lock for too long.
STATEMENT: select * from t5;
此外,当备库上的事务正在读取主库上删除的元组时,可能会发生查询冲突。删除元组,然后在主库上触发autovacuum,会导致与仍在备库上运行的SELECT查询发生冲突;在这种情况下,对备库上的SELECT查询将终止,并显示以下错误消息:
ERROR: canceling statement due to conflict with recovery
DETAIL: User query might have needed to see row versions that must be removed.
这种情况可以设置hot_standby_feedback=on 规避
解决方案
在备库上设置参数max_standby_streaming_delay max_standby_archive_delay 可以使用这些参数来留出更多查询时间,超时后再取消与即将应用的WAL日志冲突的备库的查询语句。这些参数表示从主实例接收到数据后,允许应用WAL日志的总时间。这些参数的指定取决于WAL日志的读取位置,如果从流复制中读取WAL数据,则使用max_standby_streaming_delay参数;如果WAL日志是从存储中的归档位置读取的,则使用max_standby_archive_delay参数。
设置这些参数时,请记住以下几点:
1.如果将这些参数的值设置为-1,则允许备库永远等待冲突查询完成,但是增加复制延迟,意味着备库查询到的数据可能不是最新的。
2.如果将这些参数的值设置为0,则备库的冲突查询将被取消,WAL日志条目将应用于备库。
3.参数的默认值设置为30秒,(如果没有指定单位,则默认毫秒)意味着备库查询等待30s。
根据现场环境调整这些参数的值,以平衡查询取消和复制延迟。
注意:如果要增加max_standby_archive_delay以避免取消与应用WAL日志冲突的查询,那么也考虑增加max_standby_streaming_delay。
如果看到如下错误:
"canceling statement due to conflict with recover" with "DETAIL: User query might have needed to see row versions that must be removed"
这时设置hot_standby_feedback参数,如果激活此参数,如果备库进行长查询,则会从备库发送反馈消息给主库,其中包含最旧活动事务的信息;因此,主库做update操作,同时要保留备库正常查询的这些垃圾版本。(与vacuum_defer_cleanup_age效果类似)
代价1,主库膨胀,因为垃圾版本延迟回收。
代价2,重复扫描垃圾版本,重复耗费垃圾回收进程占用CPU资源。(n_dead_tup会一直处于超过垃圾回收阈值状态,从而autovacuum不断唤醒worker进行回收动作,做无用功)
当主库的 autovacuum_naptime很小,同时autovacuum_vacuum_scale_factor很小时,尤为明显。
代价3,如果期间发生大量垃圾,垃圾版本可能会在事务完成后,集中爆炸性的被回收,产生大量的WAL日志,从而造成WAL写的IO高峰。
你还可以检查备库上的pg_stat_database_conflicts视图,获得由于与备库上恢复冲突而取消的语句的统计信息。
注意:此视图并不显示所有已发生的复制冲突,它只显示导致备库上的查询被取消的那些复制冲突信息。
总结
复制冲突类型有多种,此次介绍的冲突种类为锁复制冲突。
解决wal日志无法apply有两个策略:
- 备库告诉主库它的查询需要哪些版本,让主库保留,备库查询始终能拿到需要的版本。实际不阻塞apply wal日志,可以设置参数hot_standby_feedback。
- 备库wal日志apply进入等待,直到备库冲突查询结束,继续apply,可以设置参数max_standby_streaming_delay。
这两个参数原理近似,区别是hot_standby_feedback可以保证备库总能实现长查询不产生冲突,他主要解决快照冲突类型,而不是锁冲突类型;而max_standby_streaming_delay这个参数设置时间短于备库查询时间,超过此参数时间后,查询被取消,所以这个延迟wal日志参数设置多久需要根据实际场景设置。
KingbaseES V8R6 复制冲突之锁类型冲突的更多相关文章
- 关于"作数类型冲突: nvarchar 与 image 不兼容"的问题
数据库如果是Image类型,当执行插入语句时,如果插入的值是DBNull.Value时提示:操作数类型冲突: nvarchar 与 image 不兼容; 出现这个问题的原因是没有指定DbType的原因 ...
- mysql 主从,主主,主主复制时的主键冲突解决
原理:slave 的i/o thread ,不断的去master抓取 bin_log, 写入到本地relay_log 然后sql thread不断的更新slave的数据 把主服务器所有的数据复制给从服 ...
- KingbaseES V8R6集群部署案例之---Windows环境配置主备流复制(异机复制)
案例说明: 目前KingbaseES V8R6的Windows版本不支持数据库sys_rman的物理备份,可以考虑通过建立主备流复制实现数据库的异机物理备份.本案例详细介绍了,在Windows环境下建 ...
- KingbaseES V8R6集群部署案例之---Windows环境配置主备流复制(同一主机)
案例说明: 目前KingbaseES V8R6的Windows版本不支持数据库sys_rman的物理备份,可以考虑通过建立主备流复制实现数据库的异机物理备份.本案例详细介绍了,在Windows环境下建 ...
- SQL Server锁类型
SQL Server锁类型(SQL)收藏 1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁. 2. NOLOCK:不添加共享锁和排它锁,当这个选项生 ...
- java锁类型
转载链接在每个锁类型后边 线程锁类型 1.自旋锁 ,自旋,jvm默认是10次吧,有jvm自己控制.for去争取锁 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchroni ...
- sql 锁类型与锁机制 转
SQL Server锁类型(SQL)收藏1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁. 2. NOLOCK:不添加共享锁和排它锁,当这个 ...
- sql 锁类型与锁机制
SQL Server锁类型(SQL)收藏1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁. 2. NOLOCK:不添加共享锁和排它锁,当这个选项 ...
- Oracle数据库的锁类型
Oracle数据库的锁类型 博客分类: oracle Oracle数据库的锁类型 根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护 ...
- MySQL数据库锁类型
锁概念 : 当高并发访问同一个资源时,可能会导致数据不一致,需要一种机制将用户访问数据的顺序进行规范化,以保证数据库数据的一致性.锁就是其中的一种机制. 一个栗子 :以买火车票为例,火车票可面向广大消 ...
随机推荐
- 全流程点云机器学习(一)使用CloudCompare自制sharpNet数据集
前言 这不是高支模项目需要嘛,他们用传统算法切那个横杆竖杆流程复杂耗时很长,所以想能不能用机器学习完成这些工作,所以我就来整这个工作了. 工欲善其事,必先利其器,在正式开始之前,我们先要搞懂如何切分数 ...
- 从零开始写 Docker(二)---优化:使用匿名管道传递参数
本文为从零开始写 Docker 系列第二篇,主要在 mydocker run 命令基础上优化参数传递方式,改为使用 runC 同款的匿名管道传递参数. 如果你对云原生技术充满好奇,想要深入了解更多相关 ...
- Elasticsearch系列之-windows安装和基础操作
ElasticSearch安装 安装JDK环境 因为ElasticSearch是用Java语言编写的,所以必须安装JDK的环境,并且是JDK 1.8以上 官网:https://www.oracle.c ...
- 【C++ OOP 03 友元】各种友元例子以及如何类外写成员函数
[友元] 在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术 友元的目的就是让一个函数或者类 访问另一个类中私有成员 友元的关键字为 friend 友元的三种实现 全 ...
- 第129篇:JS模块化开发
好家伙,本篇为<JS高级程序设计>第二十六章"模块"学习笔记 JS开发会遇到代码量大和广泛使用第三方库的问题. 解决这个问题的方案通 常需要把代码拆分成很多部分,然后再 ...
- 【转载】大数据OLAP系统--开源组件方案对比
开源大数据OLAP组件,可以分为MOLAP和ROLAP两类.ROLAP中又可细分为MPP数据库和SQL引擎两类.对于SQL引擎又可以再细分为基于MPP架构的SQL引擎和基于通用计算框架的SQL引擎: ...
- [linux 爬坑] 几个linux发行版尝试和令人崩溃的ssr安装体验
最近电脑上的manjaro好像出了问题,长时间不用就会死机.也懒得追究原因了,正好决定尝试几个发行版.首先尝试安装银河麒麟 这个发行版实际上就是ubuntu,甚至源什么的都是ubuntu的,也不 ...
- 一键Run带你体验扩散模型的魅力
本文分享自华为云社区<爆圈Sora横空出世,AGI通用人工智能时代真的要来了吗?一键Run带你体验扩散模型的魅力!>,作者: 码上开花_Lancer. Sora这几天的爆炸性新闻,让所有人 ...
- 使用 ASP.NET Core MVC 创建 Web API 系列文章目录
使用 ASP.NET Core MVC 创建 Web API(一) 使用 ASP.NET Core MVC 创建 Web API(二) 使用 ASP.NET Core MVC 创建 Web API(三 ...
- MySql变量说明
1 #变量 2 /* 3 系统变量: 4 全局变量 5 会话变量 6 7 自定义变量: 8 用户变量 9 局部变量 10 11 */ 12 #一.系统变量 13 /* 14 说明:变量由系统定义,不是 ...