监控DB由于使用的TokuDB引擎,因此选择使用Percona MySQL 5.7版本,在使用过程中遇到了比较多的坑,在这里做一下简单的记录,希望对广大DBA有帮助。

load文件飙升导致的DB雪崩

在上层机器(mqproxy)出问题的时候,会导致load文件飙升,导致监控DB大量的load线程堆积,造成监控DB雪崩,比如2月15号的一次异常:

 
 

DB雪崩的时候有大量的load线程堆积,并且机器的写入性能之前下降,直到超过最大连接数,业务无法访问。

这种场景的解决办法有两个:

1、业务上层进行控制,对DB进行保护,控制load的线程数或者文件数

2、DB启用线程池,控制DB并发load的线程数

目前DB已经完成2的改造,1的改造也正在进行中。

使用线程池内存问题

出于对DB做保护,我们准备在监控DB启用线程池功能。为了安全起见,先在从机启用,并进行持续观察,在观察的过程中发现在启用了线程池以后,内存飙升了8G左右,如下图:

 
 

不但启用线程池后内存飙升了8G左右,而且内存还在持续增长,很明显启用线程池后存在内存泄漏了。

这个问题在网上也有不少的人遇到,确认是percona的bug导致(https://jira.percona.com/browse/PS-3734),只有开启Performance_Schema和ThreadPool的时候才会出现,解决办法是关闭Performance_Schema即可,具体操作方法是在配置文件添

加performance_schema=off

然后重启MySQL就OK。下面是关闭PS后的内存使用情况对比:

 
 

线程池启用后的高可用探测问题

在描述问题之前,先来描述一下线程池是如何分配连接和控制的:

线程池会根据参数thread_pool_size的大小分成若干的group,每个group各自维护客户端发起的连接,当客户端发起连接到MySQL的时候,MySQL会跟进连接的线程id(thread_id)对thread_pool_size进行去模,从而落到对应的group。thread_pool_oversubscribe参数控制每个group的最大并发线程数,每个group的最大并发线程数为thread_pool_oversubscribe+1个,若对应的group达到了最大的并发线程数,则对应的连接就需要等待。

在线上配置了几组机器使用线程池后,发现有1组机器发生自动切换,排查了机器的负载、MySQL错误日志、操作系统日志、高可用日志以后,确定是由于启用线程池问题导致,具体的原因描述如下:

启用线程池以后,相当于限制了MySQL的并发线程数,当达到最大线程数的时候,其他的线程需要等待,新连接也会卡在连接验证那一步,这时候会造成拨测程序连接MySQL超时,拨测程序连接实例超时后,就会认为master已经出现问题,从而启动自动切换的操作,将业务切换到从机。

这种情况有两种解决办法:

1、启用MySQL的旁路管理端口,监控和高可用相关直接使用MySQL的旁路管理端口

具体做法为是在my.cnf中添加如下配置后重启,就可以通过旁路端口登录MySQL了,不受线程池最大线程数的影响:

extra_max_connections = 8

extra_port = 33333

备注:建议启用线程池后,这个也添加上,方便紧急情况下进行故障处理。

2、修改高可用探测脚本,将达到线程池最大活动线程数返回的错误做异常处理,类似于当作超过最大连接数的场景(备注:超过最大连接数只告警,不进行自动切换)

监控这边选择了解决方法2,因为这种方式改动量最小。

简单总结

以上就是最近使用Percona MySQL时候遇到的几个问题,通过这几个问题概括出几个需要广大DBA们注意的事情:

1、上层应该对DB进行保护,防止DB出现雪崩

2、在上新功能的时候,一定记得灰度、灰度、灰度

3、灰度的时候,注意密切观察线上DB的性能指标(内存、性能、IO以及其他和变更相关的指标)

4、综合考虑各种解决方案,选择最适合的方案

作者:飞鸿无痕
链接:https://www.jianshu.com/p/33a0997ced0e
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

使用Percona MySQL 5.7版本遇到的坑的更多相关文章

  1. PHP 5.6连接MySQL 8.0版本遇到的坑

    一.数据库失败Warning: mysqli_connect(): The server requested authentication method unknown to t... <?ph ...

  2. 三种方法查看MySQL数据库的版本

    1.使用-V参数 首先我们想到的肯定就是查看版本号的参数命令,参数为-V(大写字母)或者--version 使用方法: D:\xampp\mysql\bin>mysql -V 或者 D:\xam ...

  3. MySQL 8.0版本连接报错:Could not create connection to database server.

    准备搭建一个Spring Boot 组合mybatis的项目,数据库采用的是MySQL 8.0.11按照以往的配置,使用插件mybatis-generator-maven-plugin生成代码时,一直 ...

  4. MySQL Server8.0版本时出现Client does not support authentication protocol requested by server

    MySQL Server8.0版本时出现Client does not support authentication protocol requested  by server 解决方法: 1.roo ...

  5. MySQL JDBC驱动版本与MySQL数据库版本对应关系

    前言:前段时间发现在家使用和公司一样的mysql jdbc驱动版本发生了异常,原因:家里mysql数据库版本与公司不一致导致.查询了相关资料,发现mysql jdbc驱动版本与mysql数据库版本有一 ...

  6. 《转》MySQL 5.7版本新特性连载

    MySQL 5.7版本新特性连载(一) 本文将和大家一起分享下5.7的新特性,不过我们要先从即将被删除的特性以及建议不再使用的特性说起.根据这些情况,我们在新版本及以后的版本中,应该不再使用,避免未来 ...

  7. InnoSQL HA Suite的实现原理与配置说明 InnoSQL的VSR功能Virtual Sync Replication MySQL 5.5版本引入了半同步复制(semi-sync replicaiton)的功能 MySQL 5.6支持了crash safe功能

    InnoSQL HA Suite的实现原理与配置说明  InnoSQL的VSR功能Virtual Sync Replication MySQL 5.5版本引入了半同步复制(semi-sync repl ...

  8. Hive环境的安装部署(完美安装)(集群内或集群外都适用)(含卸载自带mysql安装指定版本)

    Hive环境的安装部署(完美安装)(集群内或集群外都适用)(含卸载自带mysql安装指定版本) Hive 安装依赖 Hadoop 的集群,它是运行在 Hadoop 的基础上. 所以在安装 Hive 之 ...

  9. 查看Linux 、Nginx、 MySQL 、 PHP 版本的方法

    参考:查看Linux .Apache . MySQL . PHP 版本的方法 1.查看Linux版本: uname -a: more /etc/issue; cat /proc/version; 2. ...

随机推荐

  1. elasticsearch(六) 之 elasticsearch优化

    目录 elasticsearch 优化 从硬件上 : 从软件上: 从用户使用层 elasticsearch 优化 从硬件上 : 使用SSD 硬盘,解决io导致的瓶颈. 增大内存 但不超过32G(单实例 ...

  2. vuex中怎么把‘库’中的状态对象赋值给内部对象(三种方法)

    一.通过computed的计算属性直接赋值 import store from '@/store/store' export default{ name: 'count', data(){ retur ...

  3. HTML5中Access-Control-Allow-Origin解决跨域问题

    www.111cn.net 更新:2015-01-07 编辑:flyfox 来源:转载 跨域在开发中一些是一个比较常见的问题虽然有json或者xml来解决,现在html5开始流行了,我们可以通过Acc ...

  4. HTML常用的标签中,行内元素和块级元素

    块元素(block element) HTML标签分类明细 * address - 地址 * blockquote - 块引用 * center - 举中对齐块 * dir - 目录列表 * div ...

  5. ORACLEserver实例DB的概念学习理解与总结【进阶一】

    个人原创,转自请在文章开头显眼位置注明出处:https://www.cnblogs.com/sunshine5683/p/10048824.html 一.以后看一个oracleserver,可以使用如 ...

  6. c#设计模式·结构型模式

    看的过程中,发现好多模式都用过,只是没有总结,或者是不知道叫这个名字吧··· 这里列举结构型模式,适配器.桥接.过滤.组合.装饰器.外观.享元.代理, 适配器模式:将现存的对象放到新的环境里边去,但是 ...

  7. Python 创建字典的多种方式

    1.通过关键字dict和关键字参数创建 >>> dic = dict(spam = 1, egg = 2, bar =3) >>> dic {'bar': 3, ' ...

  8. 在vue-cli中使用layer中的layData日期组件

    有朋友问我怎么在vue-cli项目中使用layui中的layData组件,有时间从网上查了下写下篇文章. 1.首先去layData官网把文件包下载下来,解压出来的laydate文件夹整个放在vue-c ...

  9. 在已配置成功的opencv3.2.0下配置opencv_contrib模块

    简介: 之前在Ubuntu下配置OpenCV时,因为对opencv3..0不是特别了解,没有把opencv_contrib进行安装,这里提醒大家尽量要一次性安装完毕,减少不必要的麻烦. .0文件夹 ( ...

  10. ENVI对一种WGS84投影不支持的情况说明

    作者:朱金灿 来源:http://blog.csdn.net/clever101 假如wkt字符串这样描述WGS84投影: GEOGCS["GCS_WGS_1984",DATUM[ ...