公司是做电商体系的,全部体系搭建在华为云上。体系设想的时刻,考虑到后续的用户和定单数目比较大,须要运用一些大数据库的组件。关联型数据库这块,考虑到后续数据量的快速增长,不是直接写入MySQL,而是运用了华为云的分布式数据库中间件DDM。运用了DDM以后,能够在营业不感知的状况下,直接增添MySQL读实例的个数,线性提拔读机能。也支持中间件层面的分库分表,供应海量关联型数据库的操纵。简直是为电商体系贴身定制的。
DDM本身是以集群情势供应效劳的,对营业开放的是多个衔接IP地点。须要有一层负载平衡。假如运用传统的加LB的情势做负载平衡,会多一层中转,有机能消耗。所以,直接运用了MySQL-JDBC供应的客户端负载平衡才能。
逻辑构造以下图所示:
▲营业经由过程MySQL-JDBC的Loadbalance能提接见多个DDM节点。MySQL-JDBC供应负载平衡才能。
题目申明
MySQL JDBC驱动的客户端负载平衡才能,一直运转得好好,机能嗷嗷叫。然则前一阵子竟无端涌现营业要求失利。我是担任电商定单模块的,涉及到实在的Money,这个题目可吓了宝宝一身盗汗……
因而赶忙查看了背景日记,发明是接见DDM涌现了非常,二话不说直接提了工单给华为云DDM效劳。
不得不说,华为云的效劳照样很好的,不到半个小时就有特地的工作职员联系了我,还跟我一同排查题目。
将我们营业的日记取下来,和DDM的支持职员一同剖析,发明报错以下:根本原因竟然是MySQL驱动的bug,致使StackOverflow当地栈溢出致使……原来是一个Bug激发的血案,误会了DDM效劳,真是抱歉了
从客栈能够看出来,某个非常,触发了MySQL-JDBC的bug,致使轮回挪用,直至栈溢出。在华为DDM支持职员的发起下,对驱动代码进行了反编译,从反编译的状况下,能够看到的确是存在轮回嵌套的能够。
Loadbalance轮询衔接 –>同步新老衔接的状况 ->发送sql给效劳端 -> Loadbalance轮询衔接。
相干代码以下:
这么显著的bug,不太置信MySQL会没有发明。当前我们运用的是5.1.44版本的驱动,查看了下最新的5.1.66的代码,发明的确是修复了这个题目的,代码以下:
经由过程过滤掉SET和SHOW语句,防止了轮回嵌套的发作。
然则5.1.66又引入了新的bug,因为并非每一个挪用postProcess的处所都有SQL,这里的代码会抛空指针非常。MySQL JDBC的开发者都不做测试的吗……
没办法,剖析了下5.1.44的代码,发明经由过程恰当的调解loadBalanceAutoCommitStatementThreshold这个参数的数值,也能够防止轮回嵌套的发作。我们的环境改成了5,修正以后,安稳运转1周,没再涌现过题目。
修正计划
loadBalanceAutoCommitStatementThreshold修正成了5,然则引入的题目是,假如营业包括一些比较耗时的SQL,能够会致使DDM的负载不平衡。不过,就现在状况来看,DDM的机能照样比较强劲的~
相干文章:
PHP驱动MongoDB整数题目的BUG和战略
WebLogic下设置MySql数据库的JDBC驱动
相干视频:
布尔教诲燕十八mysql入门视频教程
以上就是MySQL-JDBC驱动引发bug的题目申明的细致内容,更多请关注ki4网别的相干文章!