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? 在数据挖掘或者图像处理等领域经常会用到主成分分析,这样 ...
随机推荐
- Git Bash Windows客户端乱码
最近升级Git后,打开Git Bash出现了乱码,解决方法是: 注意,我升级之后,本地和字符集栏位出现了空白的情况.如果检查这里为空白,那么把本地设置为zn_CN,字符集设置为UTF-8
- 洛谷 P1518 两只塔姆沃斯牛
P1518 两只塔姆沃斯牛 The Tamworth Two 简单的模拟题,代码量不大. 他们走的路线取决于障碍物,可以把边界也看成障碍物,遇到就转,枚举次,因为100 * 100 * 4,只有4个可 ...
- (8) openssl rsautl(签名/验证签名/加解密文件)和openssl pkeyutl(文件的非对称加密)
rsautl是rsa的工具,相当于rsa.dgst的部分功能集合,可用于生成数字签名.验证数字签名.加密和解密文件. pkeyutl是非对称加密的通用工具,大体上和rsautl的用法差不多,所以此处只 ...
- spring tool suite (sts) 创建springmvc(没有实践)
摘自:STS(Spring Tool Suite)建立默认的spring mvc项目 老外的原创,网址:http://www.codejava.NET/frameworks/spring/spring ...
- 十二.GUI
tkinter模块(tkinter是一个跨平台的PythonGUI工具包): #Tkinter是一个跨平台的Python GUI工具包 import tkinter top=tkinter.Tk() ...
- JSTL标签判断list是否为空
jsp页面判断获得action传的list的是否为空或者list.size的长度,就可以用fn这个标签: <c:if test="${list== null || fn:length( ...
- POJ 2342 Anniversary party (树形DP入门)
题意: 给定一个上下属的关系树, 每个人有一个活跃值, 现在要参加一个派对, 每个人都不会和自己的上属参加派对(上属参加了,下属就不能参加了), 求参加派对的最大活跃值 分析: 枚举每个节点取与不取得 ...
- coraldraw快捷键
显示导航窗口(Navigator window) [N] 运行 Visual Basic 应用程序的编辑器 [Alt]+[F11] 保存当前的图形 [Ctrl]+[S] 打开编辑文本对话框 ...
- js总结(四):关于高性能
参考<高性能网站建设进阶指南> 不仅仅关注页面加载时间,也要关注下页面操作时的相应速度.页面操作是我们写程序中 实实在在需要的 1.使用局部变量 任何非局部变量,在函数中使用次数超过一次时 ...
- 大数据学习——linux常用命令(一)
一.基本日常操作命令 1 查看当前所在工作目录的全路径 pwd 2 查看当前系统的时间 date 设置时间,date -s"2018-11-12" 修改时间后,需要写入硬件bios ...