当前位置: 首页 > news >正文

MySQL中间件的连接错误问题排查

这是学习笔记的第 2020 篇文章


  最近在对一个线上的分布式环境做高可用配置,在流程测试通过后,发现中间件中出现了大量的连接错误。

错误信息如下:

INFO   | jvm 1    | 2019/06/25 08:53:35 | 2019-06-25 08:53:35,484 [ERROR][$_NIOREACTOR-3-RW] register err java.nio.channels.ClosedChannelException

目前的技术栈架构是LVS+keepalived+MyCAT+MySQL,如下图所示:

640?wx_fmt=png

对于这个问题的定位也算是比较曲折,最初是认为防火墙权限的问题,于是我做了如下的几个场景测试,结果大多数场景都失败了。

lvs防火墙有错误日志
中间件防火墙有错误日志
中间件到数据节点的防火墙有错误日志
复制一个新的中间件,不配置lvs无错误日志
停止中间件节点的VIP配置有错误日志
jdk安装包不够完整,重新安装有错误日志
拷贝完整的目录,重新启动有错误日志

最后得到了一个初步的结论:新配置的节点MyCAT可以正常启动,而已有的集群配置会出现问题,所以这个问题经过这样一系列测试,让人有些无奈。

当然也不是徒劳,经过这样一个过程之后,我和系统部的同事对这些服务器的其他配置做了对比,发现唯一的差别就是是否启用了LVS。

经过进一步的分析和确认,算是基本定位问题的位置了,那就是错误日志的输出格式比较规律,即每10秒钟会输出一批错误。按照这个规律我在lvs中进行检查,发现keepalived的配置确实有一个delay_loop的配置是10秒。顺着这个思路下去,发现对于RS的检测,这里使用的是TCP_CHECK的方式,而这种方式的连接注册对于MyCAT来说是不够友好的。在官网也找到了类似的错误说明,目前还没有很好的解决方式,而要更为优雅的解决,那就是使用TCP_CHECK之外的验证方式,这里推荐的就是MISC_CHECK(自定义脚本)的方式了。

RS的配置信息如下,在此我们定义了一个检查脚本,输出0或者1来进行状态校验。

配置信息如下:

    real_server xx.124.140 8066 {    real_server xx.124.142 8066 {

而检测脚本的内容如下,根据轮询的机制,会输出日志到keepalived指定的目录下。

# cat mycat_check.sh

日志的输出如下:

2019-06-25 18:53:11 10.30.124.140:8066:testappdb:  mycat is running...testappdb:  mycat is running...testappdb:  mycat is running...testappdb:  mycat is running...testappdb:  mycat is running...testappdb:  mycat is running...

按照目前的状态在下午的高可用测试中,前端业务几乎无感知。

高可用的测试大体包含如下的范围:

  1. 停止一个中间件节点,预期是对于业务无感知

  2. 停止两个中间件节点(一共两个),这时候业务连接失败,会在业务层转储生成日志信息,为后期的数据补录提供基础

  3. 关闭部分应用服务器节点的防火墙权限,短时间内没有变化,是因为这里使用的是长连接,而在一段时间之后,比如5-10分钟左右,会在业务层抛出错误

  4. 关闭MySQL节点,触发MHA切换,对于业务层有一定的影响,但是基于MHA高可用机制,业务会很快恢复。

相关链接:

640?

相关文章:

  • 一次宕机问题的总结复盘
  • 所谓简单的事情
  • 数据分析上千部动漫作品
  • 生活中的一些文字调料
  • 最近的方向调整
  • 尴尬的bug:一条查询语句让MySQL崩溃
  • 你平时锻炼身体吗
  • 数据迁移流程的优化
  • MySQL复制问题的分析
  • 秦皇岛旅游归来
  • 《MySQL DBA工作笔记》前言
  • MySQL复制的奇怪问题跟进
  • MySQL高可用方案升级规划
  • 选择和努力
  • 无论是否“去O”,这些数据库选型与运维技巧你都该知道
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【前端学习】-粗谈选择器
  • ES10 特性的完整指南
  • JavaScript新鲜事·第5期
  • LintCode 31. partitionArray 数组划分
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • XForms - 更强大的Form
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 读懂package.json -- 依赖管理
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前嗅ForeSpider采集配置界面介绍
  • 我的业余项目总结
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • #Java第九次作业--输入输出流和文件操作
  • #Linux(Source Insight安装及工程建立)
  • (4) PIVOT 和 UPIVOT 的使用
  • (done) 两个矩阵 “相似” 是什么意思?
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转)Sublime Text3配置Lua运行环境
  • (转)VC++中ondraw在什么时候调用的
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • *** 2003
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net 设置默认首页
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .net实现客户区延伸至至非客户区
  • .net下的富文本编辑器FCKeditor的配置方法
  • ??javascript里的变量问题
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [BZOJ4010]菜肴制作