熟悉ranger的应该知道,ranger服务端将服务鉴权的策略信息存储在mysql中。
在使用oracle jdk的过程中,一直都没有出现问题,ranger能正确从mysql读取和存放数据。然而在切换到openjdk后,出现了ranger启动无法连接到mysql的现象,并且从日志中看到有如下的报错信息:
SQLException: SQL state: 08S01 com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
通过一番源码分析与网上类似错误信息的搜索,最终定位为:openjdk 1.8.0_291开始,默认禁用了tls1.0和1.1版本,导致jdbc与mysql的连接无法正确建立,从而报错:
详细release戳这里:https://www.java.com/en/download/helprelease_changes.html
对比oracle jdk的版本,jdbc连接中没有手动指定 useSSL=false 的时候,其连接的建立仍旧还是使用了tls的方式,并且默认使用1.1版本进行交互。
使用openjdk后,因禁用tls1.1,无法正确发送client hello,因而无法建立连接。
解决的办法其实很简单:
一种方法是在jdbc中指定不使用ssl,即增加参数useSSL=false,这种是比较常见的解决办法。
但有一点,因为其连接交互过程没有进行加密,安全无法得到保证(通常mysql都在内网,与平台服务交互,其网络环境本身相对比较安全,因此不进行加密也没有太大风险)
另一种方法就是在jdbc中指定使用tls1.2版本建立连接并与mysql进行交互。即增加参数enabledTLSProtocols=TLSV1.2。
而mysql默认同时支持tls1.0/1.1/1.2,因此不会出现问题。
指定tls1.2后,建立连接交互的抓包如下图所示:
小结一下,针对连接异常的报错日志,网上能搜到的解决办法大多数是第一种,实际上手动指定使用tls1.2也是可以的,本文的总结算是查漏补缺。
好了,本文就介绍到这里,原创不易,点赞,在看,分享是最好的支持, 谢谢~
另外,公众号下方整理了两个菜单
一个是增加了归类后的历史文章,当前有hdfs、yarn、ranger、rabbitmq系列,后续会有更多系列文章;另一个是增加了个人微信,对文章中有不正确的地方,有所欠缺的地方,可以加我微信交流,当然不仅限于文章的问题,其他技术问题也都可以交流。