KingbaseES应对表年龄增长过快导致事务回卷
背景
前几天碰到这样一个场景,在KingbaseES数据库当作数据同步节点。其特点是接收过来的数据量巨大,其更新超级频繁,最大的数据库达到6TB。这还不是主要的,主要导致问题发生原因是同步数据库有很多重复数据,为了保证准确性,现在做法的每条数据独立一个事务去完成,这就导致保证同步速度的情况事务age被大量并快速消耗。至于为什么会freeze age,这个就不在这里解释了。大家可以自行百度。
报错信息:
ERROR: database is not accepting commands to avoid wraparound data loss in database "xxxx"
HINT: Stop the kingbase and vacuum that database in single-user mode.
You might also need to commit or roll back old prepared transactions.
数据库年龄:
SELECT datname, age(datfrozenxid) FROM pg_database order by age(datfrozenxid) desc;
表年龄:
SELECT n.nspname as "Schema", c.relname as "Name", c.relfrozenxid
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','')
AND n.nspname <> 'information_schema' AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY c.relfrozenxid::text::bigint DESC;
当时查看两个数据库年龄10几亿,其中最大的一张表年龄23亿。难怪数据库告警,事务使用已经超过20亿,没有及时freeze操作。
解决方法
解决此问题的方法是:
按照年龄从大到小排序,vacuum 该数据库下每张表。
每张表的年龄都降下来后,再vacuum该数据库,把数据库年龄也降下来。需要说明的是为了保证解决问题效率,把最大的表vacuum freeze 年龄降下来后就可以登录数据库了,这时候可以在数据库里进行freeze 其他表和数据库的操作。
但是我们知道freeze 是极其消耗IO的动作,对于最大的那张表2965GB的feeze操作至少跑了一晚上,具体花费多旧难以估计。因为第二天来到现场已经跑完了。
之后再vacuum其他表和最终vacuum数据库花了大半天时间,至此问题解决。
最后我们要分析问题产生的原因,和怎么规避此次问题。
参数解答
首先了解一个概念很重要:在自动触发(由于表的年龄大于autovacuum_freeze_max_age) 或 手动执行vacuum freeze,或autovacuum触发、手工执行VACUUM时表的年龄大于等于vacuum_freeze_table_age时。以上几种情况的vacuum都将会进入FREEZE模式(扫描全表,并执行freeze)。
有效记录的年龄大于vacuum_freeze_min_age的,将该有效记录设置为freeze状态。普通vacuum(不带freeze的),并且表的年龄小于vacuum_freeze_table_age,不会执行FREEZE,所以不受这个参数影响。
很显然造成age众多,回收不及时的主要原因是业务同步数据作为每条数据库一个事务而处理,造成表age增长远远超过了vacuum freeze的速度。在无法改变此业务逻辑的前提下。
我们可以尝试修改一下参数:
autovacuum_freeze_max_age=150000000 当表的年龄超过autovacuum_freeze_max_age,即使关闭autovacuum,数据库实例依旧会强行触发vacuum freeze。
vacuum_freeze_table_age =100000000 当表的pg_class.relfrozenxid年龄大于等于vacuum_freeze_table_age,VACUUM会扫描全表,并执行freeze。
autovacuum_max_workers=5 实际测试发现调大整个参数会导致autovacuum进程过多io消耗满,所以就放弃了。(这还是用了磁盘阵列)
autovacuum_vacuum_scale_factor=0.05 该参数阈值更早的触发vacuum时机。当表的垃圾版本(dead tuples)超过 autovacuum_vacuum_threshold + autovacuum_vacuum_scale_factor*reltuples ,触发vacuum。
但注意没有到达vacuum_freeze_table_age 是不会触发freeze操作的。
为了避免多张表同一时间进行vacuum ,因为据观察,每张表的age年龄增长几乎都是同步的。
我们可以对年龄增长过快的表单独设置表级别不同的vacuum,freeze 的参数,如下所示,以错开vacuum导致的IO高峰。
autovacuum_vacuum_scale_factor, toast.autovacuum_vacuum_scale_factor (float4)
autovacuum_freeze_max_age, toast.autovacuum_freeze_max_age (整数)
autovacuum_freeze_table_age,toast.autovacuum_freeze_table_age(整数)
autovacuum_vacuum_cost_delay =0
结论
然而对于每个参数具体建议值,官方并没有给出最佳建议,毕竟业务场景是多变的。我们只能保守的尝试调整对应参数,再观察每个表对应的age增长情况以及监控IO走势。我们的处理原则是,让autovacuum进场尽量少休息多干活,并且错开每张表的vacuum高峰期,最终保证IO不要负载过高搞崩溃系统。
KingbaseES应对表年龄增长过快导致事务回卷的更多相关文章
- springmvc 事务回滚说明
Spring中的@Transactional(rollbackFor = Exception.class)属性详解 序言 今天我在写代码的时候,看到了.一个注解@Transactional(rollb ...
- 事务之二:spring事务(事务管理方式,事务5隔离级别,7个事务传播行为,spring事务回滚条件)
事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或 ...
- Spring中的事务回滚机制
初学者笔记 问题:在Java项目汇中,添加@Transactional注解,报错之后,事务回滚未生效,数据仍插入数据库中.经查看报错位置位于新增成功之后.空指针异常. 一.特性 先了解一下@Trans ...
- SQLServer数据库中开启CDC导致“事务日志空间被占满,原因为REPLICATION”的原因分析和解决办法
本文出处:http://www.cnblogs.com/wy123/p/6646143.html SQLServer中开启CDC之后,在某些情况下会导致事务日志空间被占满的现象为:在执行增删改语句(产 ...
- SQLServer数据库中开启CDC导致事务日志空间被占满的原因
SQLServer数据库中开启CDC导致事务日志空间被占满的原因 转载 2017-04-01 投稿:mrr 我要评论 这篇文章主要介绍了SQLServer数据库中开启CDC导致事务日志空间 ...
- 生产环境下,MySQL大事务操作导致的回滚解决方案
如果mysql中有正在执行的大事务DML语句,此时不能直接将该进程kill,否则会引发回滚,非常消耗数据库资源和性能,生产环境下会导致重大生产事故. 如果事务操作的语句非常之多,并且没有办法等待那么久 ...
- ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave由于鼠标移动速度过快导致问题解决办法
记录两个项目开发中遇到的问题,一个是ECharts外部调用保存为图片操作,一个是workflow工作流连接曲线onmouseenter和onmouseleave事件由于鼠标移动过快触发问题. 一.外部 ...
- sendto频率过快导致发送丢包
编写一个转发模块,虽然没有要求一转多时要达到多少路(不采用组播的情况下,单纯的一路转成多路),但是本着物尽其用的原则,尽可能测试一下极限. 网络环境:1000M,直连,多网卡 系统:Linux ver ...
- 关于srping的AOP事务管理问题,自定义切面是否导致事务控制失效
applicationContext.xml: <!-- 方法调用时间记录 --> <bean id="methodExecuteTime" class=&quo ...
随机推荐
- SAP Web Dynpro-门户集成
您可以将ABAP应用程序集成到企业门户中. 您还可以从Web Dynpro应用程序管理门户网站功能. 您可以调用Web Dynpro代码向导来访问门户网站管理器方法. 这可以用来执行以下功能- 门户网 ...
- Windows下MySQL的安装和删除
Windows下MySQL的安装和删除 安装Mysql 1 下载mysql 地址 2 安装教程 2.1配置环境变量 变量名:MYSQL_HOME 变量值:D:\software\programming ...
- docker compose 部署 minio
1.docker-compose.yaml 文件如下: version: '3' services: minio: image: minio/minio:latest # 原镜像`minio/mini ...
- Redis 笔记 01:入门篇
Redis 笔记 01:入门篇 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...
- 如何学习Vim
如果你是Linux用户,学习Vim会有很大的好处. 如果你是windows用户,个人建议还是使用vscode. 准备大约40min的学习时间,打开终端,输入下面命令开启自带教程 vimtutor 按操 ...
- 聊一聊 C# 后台GC 到底是怎么回事?
一:背景 写这一篇的目的主要是因为.NET领域内几本关于阐述GC方面的书,都是纯理论,所以懂得人自然懂,不懂得人也没法亲自验证,这一篇我就用 windbg + 源码 让大家眼见为实. 二:为什么要引入 ...
- 控制台字体怎么改为console?
windows控制台窗口在中文版下没有console字体,如果要使用console的话就必须先将窗口转换为英文版. 1.win+R进入运行窗口,然后cmd进入命令窗口 2.在命令行窗口输入 chcp ...
- 以十字链表为存储结构实现矩阵相加(严5.27)--------西工大noj
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> typedef int ElemT ...
- 丽泽普及2022交流赛day20 1/4社论
目录 T1 正方形 T2 玩蛇 T3 嗷呜 T4 开车 T1 正方形 略 T2 玩蛇 略 T3 嗷呜 (插一个删一个?) 找出相同的,丢掉循环节 . 感觉非常离谱,,, 正确性存疑 正确性问 SoyT ...
- 海纳百川无所不容,Win10环境下使用Docker容器式部署前后端分离项目Django+Vue.js
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_179 随着现代化产品研发的不断推进,我们会发现,几乎每个产品线都会包含功能各异的服务,而且服务与服务之间存在也会存在着错综复杂的依 ...