记一次使用Cobar踩到的坑

起因

起因是因为日志里经常报出锁等待超时的错误,并且这个是环环相扣的,一个锁等待会直接引发另外的锁等待,所以危害非常严重,影响非常深远。寻找原因发现是C3P0报出了DEADLOCK,如下图所示:

分析

可以看出来ScatteredAcquireTask,也就是获取连接的任务,全部卡在那不动了。那显然是无法获取新的数据库连接了。正好前一天刚刚进行过架构上的调整——从应用直连Mysql变化到中间添加了一层Cobar(关于Cobar,它是一个Mysql代理中间件,用来处理分库)。猜测就是切换到Cobar的问题,但是究竟是什么问题呢?下面我们来一起分析一下:

首先是切换到Cobar前的服务器结构图:

N台应用 –> 1台Mysql

下面是添加Cobar后的:

N台应用 –> 2台Cobar -> N台Mysql

那么两者之间到底有什么区别呢?我在本地做了一个测试,将C3P0的初始连接数设置到5000,也就是模拟在大量的连接请求下数据库的反应,看看是否会出现ScatteredAcquireTask卡住的情况。5000个连接建立完成了,但是出乎意料的是,我用show processlist查看Mysql线程时,居然并没有看到线程的增长,而是和刚才一样。到这里我差不多已经意识到了问题所在,为了证实这一点,我又用直连数据库的方式起了5000个连接,这次数据库连接果断就上去了。恩,看到这里大家应该也都猜到了吧,与Cobar建立连接,并不表示与Mysql建立连接,其实在我们的应用到Mysql这段道路上存在着两个“池”,一个是我们应用和Cobar之间的数据库连接池,还有一个是Cobar和Mysql之间的连接池。应用和Cobar之间的连接数并不存在瓶颈,并且我们也知道它们之间是用NIO通信的。但是CobarMysql之间呢?OH,由于Cobar只实现了一半的NIO,所以和Mysql之间还是走的BIO

这里还需要说明的一点是,我们公司的Cobar服务器是DBA来搭建和维护的。所以对我们后端开发来说所有的配置都是不透明的,我们不熟悉Cobar的配置也不知道有哪些东西可配置。但是凭借刚才的猜想,已经差不多知道瓶颈就是CobarMysql之间。

解决

跟随着自己的猜想,果断百度了一下Cobar的配置参数,发现有一个参数名为PoolSize,用来设置Cobar与后端数据源连接池大小。将其调大,即将问题解决。

并且事后在查看Cobaralarm日志时,发现出问题的时间段内正好打出如下的日志,也更加证实了我的猜想!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 22:59:36

记一次使用Cobar踩到的坑的相关文章

记一次拿webshell踩过的坑(如何用PHP编写一个不包含数字和字母的后门)

0x01 前言 最近在做代码审计的工作中遇到了一个难题,题目描述如下: <?php include 'flag.php'; if(isset($_GET['code'])){ $code = $_GET['code']; if(strlen($code)>40){ die("Long."); } if(preg_match("/[A-Za-z0-9]+/",$code)){ die("NO."); } @eval($code); }e

多线程和异步编程示例和实践-踩过的坑

上两篇文章,主要介绍了Thread.ThreadPool和TPL 多线程异步编程示例和实践-Thread和ThreadPool 多线程异步编程示例和实践-Task 本文中,分享两则我们在做多线程和异步编程中实际踩过的坑,实际生产环境遇到的问题,以及解决办法. 1. HttpClient 业务场景:使用HttpClient实现第三方业务推送,当第三方的Http服务器不通.或者返回很慢时 线程数暴涨 Asp.Net\Asp.Net MVC场景下,并发多线程导致的线程阻塞:HttpClient.Pos

《C++之那些年踩过的坑(附录一)》

C++之那些年踩过的坑(附录一) 作者:刘俊延(Alinshans) 本系列文章针对我在写C++代码的过程中,尤其是做自己的项目时,踩过的各种坑.以此作为给自己的警惕. [版权声明]转载请注明原文来自:http://www.cnblogs.com/GodA/p/6639526.html 本来上个月就开始动笔了,直到现在才发出来,实在太多事情.可能有些小朋友不知道写这一篇随笔的起因,那么你可以看一下我之前写的. 上一篇的最后,我提到了一个问题:代码优化.并留了一个小测试:无符号数与有符号数的性能比

【转载】Fragment 全解析(1):那些年踩过的坑

http://www.jianshu.com/p/d9143a92ad94 Fragment系列文章:1.Fragment全解析系列(一):那些年踩过的坑2.Fragment全解析系列(二):正确的使用姿势3.Fragment之我的解决方案:Fragmentation 本篇主要介绍一些最常见的Fragment的坑以及官方Fragment库的那些自身的BUG,这些BUG在你深度使用时会遇到,比如Fragment嵌套时或者单Activity+多Fragment架构时遇到的坑.如果想看较为实用的技巧,

记一次Nancy 框架中遇到的坑

记一次Nancy 框架中遇到的坑 前几天,公司一个项目运行很久的Nancy框架的网站,遇到了一个很诡异的问题.Session 对象跳转到另外一个页面的时候,session对象被清空了,导致用户登录不上.搞了两天,终于解决了.于是把它记录下来,以避免其他人也碰到这种情况. 起因 公司一个Nancy 框架 开发的web网站,以前一直都是好的,nancy 框架也用在了很多项目里面,基本上已经很成熟很稳定了,但是在前几天发布某个web网站的时候,竟然出现部分用户登录不上的情况.刚开始以为是人员的权限有问

初学spring boot踩过的坑

一.搭建spring boot环境 maven工程 pom文件内容 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-

用vue-cli搭建项目踩过的坑

1. 需要额外安装sass-loader: 我以为vue-cli会安装所有与css相关的loader,然并非,为这个死了很多脑细胞. npm install sass-loader node-sass webpack --save-dev 2. 修改style标签: 打开src目录下的components目录中的App.vue文件.然后修改 style标签如下: <style lang="sass" rel="stylesheet/sass"> 3. s

sqlalchemy 踩过的坑

记录下Sqlalchemy遇到的问题,不定时更新. 设置主键为非自增 sqlalchemy 在sql server中默认主键是自增的,如果在数据库设置的主键不是自增的,这个时候插入就会出现异常: 提示does not have the identity property 这个时候需要在主键中设置autoincrement=False,显示表示非自增,才能正常写入 sqlalchemy 踩过的坑

springmvc上传文件 踩过的坑

spring-root.xml中配置 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="9000000"/> <property name="maxInM