当前位置: 首页 > 网络应用技术

MySQL使用由复制连接引起的连接失败引起的连接故障分析和解决方案

时间:2023-03-06 00:09:29 网络应用技术

  MySQL数据库读取是提高服务质量的常见手段之一。对于技术解决方案,有许多成熟的开源框架或解决方案,例如:sharding-jdbc,春季春季,AbsTracTroutingAsource,mysql-router等。也可以支持复制连接。这篇文章没有太多的技术分析技术。选择阅读和写作,但仅探索使用DRUID作为数据源的连接失败的原因,以及用于读取和写作的复制连接的组合,并找到一个简单有效的解决方案。

  由于历史原因,某些服务的连接失败异常,关键错误如下:

  从日志中不难看出这是因为连接很长一段时间没有与MySQL服务器进行交互,并且服务器已关闭连接以及典型的连接障碍场景。

  时间超过1分钟,将进行检查。如果连接无效,则将在被放弃后获得).ATTACHMENT:DRUIDDATASOURCE.GetConnectionDirect,处理逻辑如下:

  MySQL超时参数配置WAIT_TIMEOUT = 3600(3600秒,也就是说:如果连接与服务器不与服务器交互超过一个小时,则连接将被杀死。根据上述配置,根据常规的理解,从服务器成功收到的最后一个数据包是XXX,xxx毫秒前“不应该发生。跳出可能漂浮在表面体验上的约束所必需的。因此,这个问题的真正原因是什么?

  当使用DRUID来管理数据源时,与MySQL-JDBC中的本机复制连接结合在一起,将读取和写入分开时,ReplicationConnection代理对象实际上存在于实际的主和奴隶连接中。德鲁伊只能检测到连接检测中的主连接。如果从长时间不使用从连接,则连接将失败。

  结合com.mysql.jdbc.driver源代码,不难看到在MySQL-JDBC中获得连接的主要过程如下:

  对于在“ JDBC:MySQL:Replication://”开头配置的JDBC-url,通过mySQL-JDBC获得的连接实际上是复制连接的代理对象。默认情况下,第一个主机和端口对应于主连接。随后的主机和端口对应于从属的连接,多个从属配置的场景用于使用随机策略进行负载平衡。重新处理Connection代理,该代理是通过使用JDK Dynamic代理生成的。其中,InvocationHandler的具体实现是ReplicationConnectionProxy。关键代码如下:

  关于数据库连接代理,ReplicationConnectionProxy的主要组成中的主要组成如下:

  replicationConnectionProxy具有两个实际的连接对象:MasterConnection和SlavesConnection。在业务逻辑中,读取和写作的实现的核心也就是这样。简而言之,当使用复制连接进行阅读和写作时,只需在replicationConnection -proxy上进行“连接的读取属性”,那么在业务逻辑中获得的连接代理的主要逻辑是什么?

  逻辑如下所示:对于常规逻辑,例如准备时间,ConnectionMysQConnection获得了当前的处理连接(一般读取和写作分离处理的焦点在这里);目前,重点是执行pinginternal逻辑。对于ping()的特殊逻辑,图中的描述相对简单,但是主要含义保持不变,也就是说,必须在Ping()处理上执行Ping()处理。主连接和SLES连接。在图中,Pinginternal过程与Druid的MySQ连接检查有关,Ping的特殊处理也是解决问题的关键。

  DRUID中MySQL连接的默认实现类是MySQLValidConnectionChecker。核心逻辑如下:

  相应服务中使用的MySQL-JDBC(版本5.1.45),而无需设置“ druid.mysql.usepingmethod”系统属性,默认使用使用方法为真,如下:如下:如下:

  同时,可以看出MySqlValidConnectionChecker中的ping方法在mySqlConnection中使用pinginternal方法。该方法结合了上述复制连接的分析。当使用pingInternal时,仅检查当前连接。执行测试连接的时间是通过DrduidataSource获得连接的时间。目前,尚未设置RoadOnly属性。实际上,它只是replicationConnectionProxy..in中的主连接,如果“ druid.mysql.usepingmethod”设置为“将userghod”设置为false,则实际上会导致连接失败的问题,因为当连接验证通过通过连接验证执行。validequery(例如“选择1”),执行连接验证时,它将转到复制连接。这一次,相应的连接仍然是主连接。“而不是常规的ping?原因:pinginternal储备金控制参数和其他控制参数。

  该服务中使用的MySQL-JDBC版本为5.1.45,DRUID版本为1.1.20。在对其他高版本的理解后,此问题仍然存在。

  修改后的工作负载主要在于数据源配置和AOP调整,但需要一定的总体回归验证成本。鉴于该问题涉及的服务重要性是平均水平,因此暂时无法弥补。

  根据原始复制连接的功能,将Pinginternal的调整调整为普通Ping,并集成原始驱动程序以扩展新驱动程序。计划是可行的,但是修改成本并不小。

  为了简单地解决该问题,请选择MySqlValidConnectionChecker,然后将相应的配置添加到DRUID数据源。Expansion。

  在实施replicatoinconnection.ping()的实施中,所有大师和奴隶都连接到PING操作。最后,每个PING操作都将被要求处理到LoadBalancedConnectionProxy.doping.time。

  R&D研发中心和行业合作伙伴的技术学习和交流平台定期分享前线实践经验以及行业的切割 - 边缘技术主题。关注公共帐户“离职技术”,各种干货练习,欢迎交流和分享?

  原始:https://juejin.cn/post/7112281560950243364