DDM的成熟在一个细微之处的体现
前言
我们都知道DDM是华为云的非常优秀的分布式数据库中间件,在性能、易用性等方面在业界是遥遥领先的。他的成熟不仅仅体现在具有快速水平平滑扩容,支持多种分布式事物类型等等这些高大上的特性上,也体现在DDM诸多的细微之处,今天我和大家分享一个在发展多年的mycat上存在,但是在DDM中不存在的一个不起眼的细微问题(小问题,大灾难,在IT行业的历史上不断重演,我们要警钟长鸣)。这个问题是我在DDM上玩了好多sql之后,发现DDM是一个玩不死的小强,出于好奇也把一些在DDM上玩的sql放到了mycat上,不幸的是,第一条sql放到了mycat上执行之后,就出现了神奇一幕,下面看看我的排查过程吧。
排查过程
首先,我的测试代码如下,我的sql除了加了一段注释之外,好像再普通不过了。但是一执行发现好像是卡主了。

于是赶紧使用jstack查看测试应用的线程栈信息,如下:

由上图不难发现是卡在测试代码TestJDBC的25行上,也就是卡在了“ps.executeQuery()”这行代码上。当然也发现最终是卡在和mycat的通信上。那么为啥mycat一直没有返回结果呢。我马上到部署mycat的测试机上,查看日志,没有发现异常信息。于是顺手看了一下测试机器的资源使用情况,果然有意外发现,如下:

发现有一个java进程的cpu使用率非常高,在这里,他肯定是mycat进程,因为在这个机器上,我只部署了mycat这一个java应用。不禁要问,mycat到底在干啥,是哪一个线程出现了问题。于是我执行了一下这样的一条命令:ps -mp 3403 -o THREAD,tid,time,想去看个究竟,命令中的3403是mycat进程的id,于是我发现了下图的信息。

发现3403进程中的线程3420消耗了非常高的CPU,接下来不难想到的是使用jstack命令去调出该mycat进程的线程栈信息,在执行jstack之前,我们先将线程id(nid) 3420转成16进制的数字,因为在jstack中看到的nid(native thread id)是16进制显示的,转换方式如下:

那好,让我们来看一下mycat进程的该线程的栈快照吧,如下:

原来问题出在了DruidMycatRouteStrategy这个类的724行,于是看一下mycat的源码,如下:

看到代码之后,是不是恍然大悟呢,问题就出在这个while循环的处理逻辑上。当然这个bug的fix也不复杂。对该问题解决方式有兴趣的朋友可以在该文章下留言,我们可以交流一下。
结语
通过上面这样的一个问题,我们不难发现,现在业界的分布式数据库中间件在大的特性上基本都能做到对齐,那么为什么华为云分布式数据库中间件DDM作为后起之秀,显得更加成熟,给用户留下了更好的印象呢?我想可能跟DDM在诸如此类的非常多的细微之处做的非常到位也有原因吧。
DDM的成熟在一个细微之处的体现的更多相关文章
- 【原创】公司各个阶段 CTO 需要做什么?(下篇)
假设一个公司发展有以下几个阶段: 0 :创始阶段: 0.5 :有产品但无管理阶段: 1 :经过 1年的发展初步稳定的阶段: 1+ :稳步发展阶段. 上一篇文章中,我们聊了公司在初创阶段,CTO 需要做 ...
- Android消息传递之EventBus 3.0使用详解
前言: 前面两篇不仅学习了子线程与UI主线程之间的通信方式,也学习了如何实现组件之间通信,基于前面的知识我们今天来分析一下EventBus是如何管理事件总线的,EventBus到底是不是最佳方案?学习 ...
- iOS关于模块化开发解决方案(纯干货)
关于iOS模块化开发解决方案网上也有一些介绍,但真正落实在在具体的实例却很少看到,计划编写系统文章来介绍关于我对模块化解决方案的理解,里面会有包含到一些关于解耦.路由.封装.私有Pod管理等内容:并编 ...
- jquery工具方法access详解
access : 多功能值操作(内部) access方法可以使set/get方法在一个函数中体现.比如我们常用的css,attr都是调用了access方法. css的使用方法: $(selector) ...
- 在线最优化求解(Online Optimization)之五:FTRL
在线最优化求解(Online Optimization)之五:FTRL 在上一篇博文中中我们从原理上定性比较了L1-FOBOS和L1-RDA在稀疏性上的表现.有实验证明,L1-FOBOS这一类基于梯度 ...
- MySQL对于datetime 源码分析
http://tsecer.blog.163.com/blog/static/150181720160117355684/ 一.时间比较的语法分析 在mysql中,通常时间是一个必不可少的类型,而 ...
- DOS环境下MySQL使用及不同字符集之间的转换
mysql -uroot -p; show databses; 创建数据库\c; create database webclass; use webclass; 创建表并设置好各字段的属性\c cre ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(十) Configuration Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(十) Configuration Application Block 到目前为止,我们使用的模块都是在同一个配置 ...
- 主成分分析(PCA)原理及推导
原文:http://blog.csdn.net/zhongkejingwang/article/details/42264479 什么是PCA? 在数据挖掘或者图像处理等领域经常会用到主成分分析,这样 ...
随机推荐
- [Usaco2009 Nov]lights
题目描述: 给出$n$,$m$,表示有$n$盏灯和$m$条奇怪的电线,按下电线一段的灯后另一端会有影响. 求最少按几次. 题解: 高消解异或方程组,得到一堆自由元后搜索自由元状态,然后不断更新答案. ...
- svn搭建脚本
1.yum install subversion 2.输入rpm -ql subversion查看安装位置 我们知道svn在bin目录下生成了几个二进制文件. 输入 svn --help可以查看svn ...
- 使用js获取页面的各种高度
使用js获取相关高度: 获取网页被滚动条卷去的高度——兼容写法: scrollHeight = documen.body.scrollTop || document.documentElement.s ...
- Couchbase V(管理任务)
Couchbase V(管理任务) 多读写 在Couchbase2.1中支持硬盘多读些(Multi- Readers and Writers),一般双核4G服务默认3个thread 4核16G内存一个 ...
- 大数据学习——hdfs集群启动
第一种方式: 1 格式化namecode(是对namecode进行格式化) hdfs namenode -format(或者是hadoop namenode -format) 进入 cd /root/ ...
- POJ 2478 欧拉函数打表的运用
http://poj.org/problem?id=2478 此题只是用简单的欧拉函数求每一个数的互质数的值会超时,因为要求很多数据的欧拉函数值,所以选用欧拉函数打表法. PS:因为最后得到的结果会很 ...
- 显示倒计时,为零时自动点击按钮提交【JavaScript实现】
原文发布时间为:2008-10-17 -- 来源于本人的百度文章 [由搬家工具导入] <html> <head> <title>显示倒计时,完毕提交</tit ...
- 搭建nexus私服,无法下载相关jar包,报错Repository proxy-mode is BLOCKED_AUTO
在搭建nexus私服的时候,之前没直接用来下载maven的相关插件jar包,一直可以使用, 结果今天要编译hadoop的时候,在linux上新用maven就报错了,无法下载maven的相关插件(如下) ...
- 积累js中的一些问题及解决方案
一.取字符串的第i位不兼容的问题 1.问题:对于字符串str来说,要获取第i位,常见的是str[i],但是在低版本的浏览器中不兼容,例如ie7. 2.解决:使用str.charAt(i); 二.使用定 ...
- msp430入门编程27
msp430中C语言开发工具调试程序 msp430入门学习 msp430入门编程