关键字:
KingbaseES、JDBC、读写分离、异常信息优化、人大金仓
背景描述
由于读写分离模式中主备机的存在,业务语句的分发变得复杂,主要是有四种情况:分发主机、分发备机、主备机均发和发送当前所有存活的服务器。由于分发情况的多种多样,由于服务器故障或网络异常等导致的连接错误也变得繁杂,给技术人员分析问题原因带来了困难。因此,需要对读写分离模式下,语句分发模块的异常打印信息进行优化设计,以达到更便捷的发现问题根由的目的。
异常打印信息结构设计
为了能够更加直观的展示错误发生到抛出的整体过程,可以按当前异常信息、当前集群监控线程的异常信息和最初发生异常的原因及其运行环境信息的三段式结构设计异常打印信息。如图一所示,集群运行读语句时,模拟主备机网络故障,导致客户端无法连接主备机服务器,造成异常并抛出。从异常打印结果可以看出,当前异常信息是找不到主机,并且集群节点连接信息提示节点不在线;当前监控线程的异常信息也是找不到主机,节点连接信息是连接超时;最初异常的原因是数据获取超时,从其发生时的系统环境可以发现,socketTimeout(超时时间)的值为0,表明无超时限制,但在线主备机ip为空,说明集群监控线程清空了在线主备机信息。结论是,网络异常导致无法连接主机,监控线程在找不到主机的情况下,清空了在线主备机ip信息,业务线程首次发现后抛出了超时异常,并在读写分离的语句重发功能作用下多次重发语句,并最终抛出找不到主机的异常。
此功能设计,是在最初发现异常时,将部分关键变量值记录在message中,并在后续异常构建时不断叠加新的异常信息,以便于观察整个过程的异常情况。
图1:集群运行(读语句)时主备机网络故障异常报错信息
技术效果
通过使用如上异常信息优化功能,可以有效区分重建连接时,客户端到主机网络故障、数据集群状态异常和监测线程异常无法恢复,这三种异常的最终结果都是找不到主机。还可以较明确的区分I/O异常发生的原因,如用户设置了socketTimeout、业务线程等待时监控线程清空在线主备机ip信息和服务器关闭导致报文传输关闭等。