前一段时间,部门接入了新业务,由于业务量小,架构非常简单,采用了最简单的LNMP架构,整个项目是交给一个刚毕业的RD负责的,这是背景。

上线前半天,服务平稳运行。下午的时候,开始收到大量报警:No host could be connected in the cluster。第一反应:mysql服务器不会挂了吧。打开监控,一切正常,登录也一切正常,但报警一直没有间断,这奇怪了。

实际上一点都不奇怪。“No host could be connected in the cluster”本身不是mysql的错误,所以并不是mysql服务器本身出了问题,问题的原因一定是出在封装的底层的类库,为了描述的更明白一些,我先总结一下这个mysql连接管理类库的功能。

为了保证mysql服务的稳定性,我们的mysql连接类库实现了一个故障自动切换的功能:维护一个当前的mysql服务器的列表,每次连接时随机选择一台服务器连接(这里不考虑跨机房的问题,也不考虑选择的算法。选择机器的算法可以是随机的,也可以是轮询的,这不是关键),同时维护一个失败的服务器列表。如果某一次mysql执行失败,那么便把这台服务器从可用的服务器中摘除,同时放置到失败的服务器列表中, 在一定时间内(interval,比如2s)这台mysql便不在被访问。 需要注意的是,这台mysql并不是一直在失败的服务器列表中的,经过一段时间后,便会重新释放,重新进入可用的服务器列表中。这么做的主要目的,是在某一台mysql服务器发生故障时,由于这台mysql被访问到的概率变小,不至于出现线上服务的大面积瘫痪,也给线上故障转移提供更多的时间buffer。

问题就出在这里!这个自动切换的功能只适用于mysql cluster,也就是存在多个mysql服务器的情况,如果服务器只有一台,那么问题就很严重了:如果某一次mysql查询执行失败了,那么这台mysql会被打入冷宫,在接下来的时间间隔内,便没有任何可用的mysql服务器了!这样一来,流量一大,所有的interval间隔内的请求便都失败了!这也是为什么线上会出现大量的“No host could be connected in the cluster”的报警。

这个问题很典型,很多人不清楚类库的作用,便信手拈来直接使用,所以出现问题的时候常常也是一头雾水,不知从何下手。尤其在大公司中,类库、工具、成熟的解决方案都比较齐全,在使用方便的同时,也隐藏了内部的实现逻辑,往往会造成“使用很熟练,原理一窍不通”的问题。

一次Debug过程的思考的更多相关文章

  1. Debug过程中的mock (及display窗口的使用)

    转载:http://m.blog.csdn.net/blog/u012516903/18004965 在debug的时候,有3个地方可以进行mock测试 测试代码如下: 1.使用display窗口 W ...

  2. 【实习记】2014-08-10(上)代码跟踪git的想法+归并排序的debug过程

        (冒泡,选择,插入,希尔,快速,归并,堆排)周末加班学习C++,打算用C++写七大经典排序代码.发现3个月前自己写的七大经典排序代码(C Language)突然运行出错. Makefile内容 ...

  3. android一个下拉放大库bug的解决过程及思考

    android一个下拉放大库bug的解决过程及思考 起因 项目中要做一个下拉缩放图片的效果,搜索了下github上面,找到了两个方案. https://github.com/Frank-Zhu/Pul ...

  4. 如何在Eclipse和Tomcat的Debug过程中启用热部署

    参考的地址是 http://blog.redfin.com/devblog/2009/09/how_to_set_up_hot_code_replacement_with_tomcat_and_ecl ...

  5. dubbo debug过程中一个有趣的问题

    最近在debug dubbo代码过程中遇到的很有趣的问题 我们都知道dubbo ReferenceBean是消费者的spring bean包装,为了查一个consumer端的问题,在Reference ...

  6. Jeddict:从服务器的验证过程,思考学习新事物的套路

    结合一路研究Jeddict使用的过程经验来看,在这里说一下关于服务器配置的东西.在我们团队,最开始用这个插件的时候,因为公司用的应用服务器是Jboss EAP 7,所以,我们自然而然的,想当然的直接使 ...

  7. vue生命周期updated的触发时机之debug过程中发现的firefox问题

    现象描述: 断点位置1 谷歌debug的过程: 火狐debug的过程: 只要在改变数据之后有断点停顿,就会先去执行updated函数 断点位置2 此时火狐和谷歌是一样的效果,但是执行顺序是不一致的 谷 ...

  8. 线上问题debug过程(cat,grep,tr,awk,sort,uniq,comm等工具的综合使用)

    问题:发现线上到货单的数量,小于实际到货的数量. 怀疑一些隐藏的条件,将部分唯一码进行了过滤,导致数量变少. 开展了如下的跟踪流程: 1.找到其中一个明细的唯一码 grep 6180e-4b09f p ...

  9. 一个关于 ie 浏览器的 bug 解决过程和思考

    首先我们测试了老师反馈的异常情况.这所中学使用的是 IE8 浏览器.IE8 浏览器提交作文评分的情况是:一直停留在“正在提交系统评分”的页面,停留了很长时间以后,页面空白. 换用火狐浏览器,可以正常评 ...

随机推荐

  1. javascript_basic_04之节点、元素

    1.DOM:文档对象模型,Document Object Model: 2.BOM:浏览器对象模型,Browser Object Model: 3.DOM组成:核心DOM,XML DOM,HTML D ...

  2. 在 xampp 环境下安装 laravel

    网上搜了很多教程,很多都是采用命令行安装的.但是对于web前端来说,根本就不知道在干吗! 于是,打算写一篇文章,来教后面的人如何在 XAMPP 环境下安装 laravel. 初步认识 XAMPP(Ap ...

  3. Mybatis中SqlMapper配置的扩展与应用(3)

    隔了两周,首先回顾一下,在Mybatis中的SqlMapper配置文件中引入的几个扩展机制: 1.引入SQL配置函数,简化配置.屏蔽DB底层差异性 2.引入自定义命名空间,允许自定义语句级元素.脚本级 ...

  4. png图片制作任意颜色的小图标

    本内容只要是对张鑫旭PNG格式小图标的CSS任意颜色赋色技术的这篇文章进行详细说明. HTML: <i class="icon"><i class="i ...

  5. CSS中模拟父元素选择器

    很多情况下,我们需要找到父元素,但可惜的是css中并没有这样的一个选择器. 至于原因可以看张鑫旭的如何在CSS中实现父选择器效果这篇文章. 简单来说这个实现并不是真正的父元素选择器,只是利用其它思路来 ...

  6. @@IDENTITY与SCOPE_IDENTITY()

    在一条 INSERT.SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含语句生成的最后一个标识值.如果语句未影响任何包含标识列的表,则 @@IDENTITY 返回 NULL. ...

  7. javascript类型系统——布尔Boolean类型

    × 目录 [1]定义 [2]应用场景 [3]转为布尔[4]实例方法 前面的话 布尔值Boolean类型可能是三种包装对象Number.String和Boolean中最简单的一种.Number和Stri ...

  8. PL/SQL异常处理

    As we all known,程序的错误一般分为两类:编译错误和运行时错误.其中运行时错误被称为异常.PL/SQL语句块中处理异常的部分即为异常处理部分.在异常处理部分,可以指定当特定异常发生时所采 ...

  9. 年度榜单:2013年最佳免费 PSD 设计素材揭晓

    <年度榜单>系列继续给大家带来2013年度发布的好东西,这篇文章要给大家分享的是本年度最佳的12套精美的 PSD 设计素材,你可以免费下载使用.这些免费素材不仅能帮助他们节省大量的时间,而 ...

  10. HT For Web 拓扑图背景设置

    HT For Web 的HTML5拓扑图组件graphView背景设置有多种途径可选择: divBackground:通过css设置graphView对应的div背景 Painter:通过graphV ...