某天,开发同事反应项目访问不了了,提示8091端口连接不上,以为是日常资源不够重启一下就好,于是我删除了seata的pod,重启后发现仍然不能连,遂查看pod日志,出现以下错误:
2021-05-18 19:56:24.804 ERROR --- [eate-1437654187] com.alibaba.druid.pool.DruidDataSource : create connection SQLException, url: jdbc:mysql://mariadb:3306/seata_server, errorCode 0, state 08001 ==> com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.
由这个开始我开启了一下午的分析排查过程:
1、由于work节点是用vmware虚拟机装的经常会出现不明原因卡死现象,先看seata在哪个节点,把他换一个节点运行,仍然不行,失败
2、由于当时已经使用navicat连接这个数据库,故而这个数据库是能还连接的应该不太可能数据库出问题
3、分析是不是K8s的dns解析有问题,导致他不能解析域名,因为此前出现过,登陆其他pod直接ping 数据库所在的svc能返回ip地址,说明解析也正常
4、分析是不是开发又改了什么springcloud组件的版本,导致的问题,使用这个seata连接另外一台测试环境的数据库,发现能连,感觉判断没错,于是在公司群里对开发一通说教,什么不能乱改版本啊,要改之前要提前跟我说之类的啊。-_-||
5、为了进一步证明我的判断是对的,我又连了另外 一台mysql8.0,但是有项目的,发现,确实不能连。欣喜若狂!!正准备收工回去,等明天重新导那台可 连的数据库的数据的时候,忽然又想,seata启动日志上面是报连接不上数据库,似乎应该跟项目没有关系才对。
6、后面有个开发死活跟我说他们没有改什么东西,再加上我在想,这个seata里面只是配置了连接数据库,貌似跟其他项目应该没什么关系才对,于是我又找另外一台命名空间的数据库连接,并且把里面的应用数据全部删除,只保留mysql本身的库和nacos配置,发现可以连上。这是不是证明跟项目没关系。难道非得maridb10.5能连,mysql8.0不能连?这好像说不过去啊!这两个不是号称很兼容的嘛!
7、或者说只能连mysql5.7不能连mysql8.0?因为可以连的那台是5.7。或者说在K8s里面不能连,在docker里面可以连?我凌乱了-_-!!不知从何下手。
8、这样吧!从最简单的开始,在docker版seata连接非docker版mysql数据库,因为显然非docker版seata还在使用。因为dockerfile使用的是seata:latest这个版本(最好不要老使用latest),会不会是像之前jdk:latest那样使用最新版有问题,于是改成seata:1.3,seata:1.2,都连不上。无语啊,又遇到这种不知原因的问题,哭!!!
9、正当又不知从何下手的时候又拿出我常用的方法,对比配置,去非docker版seata看看配置有什么不一样。这一对比好像有所发现:
service { #transaction service group mapping vgroupMapping.hgc_lucky_credit_group="wehgc" #此处根据自己的情况修改 vgroup_mapping.hgc_lucky_credit_group="wehgc" #此处根据自己的情况修改 wehgc.grouplist="127.0.0.1:8091" disableGlobalTransaction=false }
由于前两天更新项目的时候就发现组名被改了,会不会是这里也需要修改,于是修改了组名,原来是这样的:
service { #transaction service group mapping vgroupMapping.hgc_lucky_credit_group="default" #此处根据自己的情况修改 vgroup_mapping.hgc_lucky_credit_group="default" #此处根据自己的情况修改 default.grouplist="127.0.0.1:8091" disableGlobalTransaction=false }
10、这一台后再重新构建docker版seata,我X,真的可以。于是果断在公司群里痛骂开发,有图为症
11、把镜像重新上传到仓库,然后从k8s镜像拉下来,发布,我X,又不行。吐血了-_-!!
12、我又开始怀疑起mariadb和mysql版本问题了。我另外一个命名空间是docker版mariadb10.5是可以的,我这个不行的是Mysql8.0,我另外 一个不是docker的mysql8.0也不行,我那个不是docker版的mysql5.7可以。难道是他可以用mysql5.7和mariadb,mysql8.0不可以?但是我们线上的rds也是mysql8.0,天哪!收了我吧!!!回家,不管了,都怪开发,气死我了,我的环境都是一开始好好的,他们一更新什么就出问题,老怪环境不好。气死我了,回去。
13、回到宿舍楼下吃莆田卤面的时候没事干,手机拿起来瞎查,查到一条seata对mysql8.0有要求的,说要改一下连接驱动,我赶紧吃完饭回来马上就改:
driverClassName = "com.mysql.cj.jdbc.Driver"
怀着无比激动的心情在等,过了一会儿,真的没有出现报错了,原来是这样
driverClassName = "com.mysql.jdbc.Driver"
14,至于说为什么mariadb10.5可以,这就不得而知了。
感谢此博主 https://blog.csdn.net/weixin_28716181/article/details/113415973
另外他还说要替换lib包,我就没换,测试环境先测着,要真不行,再换