MGR修改max_binlog_cache_size参数导致异常

简介: MGR修改max_binlog_cache_size参数导致异常

一、问题来源

这是一位朋友的问题,因为前期朋友设置max_binlog_cache_size为8m,后面在线进行了修改了本参数,但是结果导致整个3节点的MGR集群除了primary节点其他两个second节点均掉线。大概的日志如下:

image.png

二、使用binlog cache的大概流程

这也是我以前写过的一个过程。

  • 开启读写事务。
  • 执行‘DML’语句,在‘DML’语句第一次执行的时候会分配内存空间给binlog cache缓冲区。
  • 执行‘DML’语句期间生成的Event不断写入到binlog cache缓冲区。
  • 如果binlog cache缓冲区已经写满了,则将binlog cache缓冲区的数据写入到binlog cache临时文件,同时清空binlog cache缓冲区,这个临时文件名以ML开头。
  • 事务提交,binlog cache缓冲区和binlog cache临时文件数据全部写入到binary log中进行固化,释放binlog cache缓冲区和binlog cache临时文件。但是注意此时binlog cache缓冲区的内存空间留用供下次事务使用,但是binlog cache临时文件被截断为0,保留文件描述符。其实也就是IO_CACHE结构保留,并且保留IO_CACHE中分配的内存空间和临时文件文件描述符。
  • 断开连接,这个过程会释放IO_CACHE同时释放其持有的binlog cache缓冲区内存以及持有的binlog cache临时文件。

三、max_binlog_cache_size参数的作用

这部分也是我以前记录过的。

max_binlog_cache_size:修改需要使用set global进行修改,定义了binlog cache临时文件的最大容量。如果某个事务的Event总量大于了(max_binlog_cache_size+binlog_cache_size)的大小那么将会报错,如下:

ERROR 1197 (HY000): Multi-statement transaction required more than
'max_binlog_cache_size' bytes of storage; increase this mysqld variable
and try again

我们在函数_my_b_write可以看到如下代码:

if (pos_in_file+info->buffer_length > info->end_of_file) //判断binlog cache临时文件的位置加上本次需要写盘的数据大于info->end_of_file的大小则抛错

{
errno=EFBIG;
set_my_errno(EFBIG);
return info->error = -1;
}

其中info->end_of_file的大小正是来自于我们的参数max_binlog_cache_size。

四、分析问题

从second节点的报错来看,是applier线程应用的事务超过了max_binlog_cache_size设置的大小,但是朋友已经修改了其大小,并且主库并没有报这个错误。

我们知道MGR applier线程从启动MGR的那一刻开始就不会停止,类似的master-slave的sql线程也是一样,我们修改参数是通过set global修改的参数,但是实际上在对于MGR的applier线程并不会生效。

但是对于主库来讲,我们修改参数后只要重启应用重新连接那么参数就生效了,这个时候实际上primary session的max_binlog_cache_size和second applier的max_binlog_cache_size并不一致,一旦有主库做一个稍大的事务,如果这个事务的binlog大于以前设置的值,主库虽然能成功,但是备节点就会由于applier线程的max_binlog_cache_size过小而导致备节点脱离整个集群。

对于这一点我们可以通过debug MySQL的sql线程进行验证。

五、验证

这里我们使用master-slave来进行验证,我们对sql线程进行debug。如下,

  • 当前配置

image.png

  • sql线程
    image.png
  • 修改参数
    image.png
  • 主库执行一个事务,从库执行
    我们可以查看sql线程binlog cache的IO CACHE的信息如下:
    image.png

可以看到这个值还是老值。

  • 重启后sql线程后,主库再做一个事务观察

image.png

很明显我们刚才修改的值重启sql线程后才生效。

因此故障原因得到证明。


Enjoy MySQL :)


全文完。



            </div>
相关文章
|
12月前
|
消息中间件 NoSQL Redis
【赵渝强老师】Redis的消息发布与订阅
本文介绍了Redis实现消息队列的两种场景:发布者订阅者模式和生产者消费者模式。其中,发布者订阅者模式通过channel频道进行解耦,订阅者监听特定channel的消息,当发布者向该channel发送消息时,所有订阅者都能接收到消息。文章还提供了相关操作命令及示例代码,展示了如何使用Redis实现消息的发布与订阅。
340 0
|
Web App开发 移动开发 UED
介绍一下HTML5的新技能:多媒体支持
介绍一下HTML5的新技能:多媒体支持
450 2
|
缓存 JavaScript 前端开发
Vue.js有什么特点
Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架。它由尤雨溪(Evan You)在 2014 年创建,并迅速获得了广泛的关注和采用。
286 0
|
监控 安全 BI
ERP系统中的移动应用与远程访问
【7月更文挑战第25天】 ERP系统中的移动应用与远程访问
382 2
|
12月前
|
网络协议 算法 数据库
OSPF中的Network LSA详解
OSPF中的Network LSA详解
466 4
|
Java 关系型数据库 MySQL
入职必会-开发环境搭建13-Maven安装和配置
Mven是一个流行的项目管理工具,它可以帮助开发人员构建、发布和管理Java项目。本文包含Maven安装和配置。
289 0
|
监控 安全 Oracle
⭐万字长篇超详细的图解Tomcat中间件方方面面储备知识⭐
LNMT 1.JAVA简介 常见的大型平台有LNMP、LNMP、LNMT JAVA:LNMT(T表示Tomcat容器,放java代码的)
724 82
⭐万字长篇超详细的图解Tomcat中间件方方面面储备知识⭐
|
移动开发 数据可视化 前端开发
前端如何一键生成多维度数据可视化分析报表
本文是基于上一篇文章介绍**H5编辑器 后台管理系统实战的第二篇文章, 也是比较重要的一篇文章, 主要介绍后台系统中如何基于已有数据表格自动生成多维度可视化报表**. 笔者之所以会花3篇文章去介绍这一块的内容, 是因为目前B端产品很多都有类似的需求, 比如导入导出excel, 在线编辑表格(table),基于表格数据生成可视化图表, 用户权限路由和权限菜单设计等. 这里笔者总结为如下3点核心知识:
1087 0
|
人工智能 算法 前端开发
揭秘五子棋AI设备的炼成:wujian100 SoC助力人机对弈(上)
技术解码栏目:是面向开发者详细解读芯片开放社区(OCC)上关于处理器、芯片、基础软件平台、集成开发环境及应用开发平台的相关技术,方便开发者学习及快速上手,提升开发效率。
906 0
揭秘五子棋AI设备的炼成:wujian100 SoC助力人机对弈(上)
|
域名解析 网络协议 安全
“阿里云DNS”全系列7个子产品 -共贺阿里巴巴成立20周年
“阿里云DNS”全系列7个子产品 -共贺阿里巴巴成立20周年 七个子产品分别是:云解析DNS、Private Zone、全局流量管理GTM、辅助DNS、专有云DNS、HTTPDNS和公共DNS。