背景
中午睡了一觉,起来发现连不上我的 TDengine
服务了。。
最近刚换了电脑,没错,这次的事故又是换电脑引发的。。
服务报错
SpringBoot项目的控制台错误信息: java.sql. SQLException: JNI ERROR (2354): JNI connection is NULL
这个问题我曾经在这篇文章2-TDengine客户端连接,RESTful,JDBC里也遇到过, 当时是因为我没有开放 6030
的 UDP
端口,可是现在我连整个防火墙都关了。无奈之下,又到官网重温下客户端连接失败的解决方法。
问题排查
官方建议:客户端遇到连接故障,请按照下面的步骤进行检查:
检查网络环境 云服务器:检查云服务器的安全组是否打开TCP/UDP 端口6030-6042的访问权限 本地虚拟机:检查网络能否ping通,尽量避免使用localhost 作为hostname 公司服务器:如果为NAT网络环境,请务必检查服务器能否将消息返回值客户端 确保客户端与服务端版本号是完全一致的,开源社区版和企业版也不能混用 在服务器,执行 systemctl status taosd 检查taosd运行状态。如果没有运行,启动taosd 确认客户端连接时指定了正确的服务器FQDN (Fully Qualified Domain Name —— 可在服务器上执行Linux命令hostname -f获得),FQDN配置参考:一篇文章说清楚TDengine的FQDN。 ping服务器FQDN,如果没有反应,请检查你的网络,DNS设置,或客户端所在计算机的系统hosts文件。如果部署的是TDengine集群,客户端需要能ping通所有集群节点的FQDN。 检查防火墙设置(Ubuntu 使用 ufw status,CentOS 使用 firewall-cmd --list-port),确认TCP/UDP 端口6030-6042 是打开的 对于Linux上的JDBC(ODBC, Python, Go等接口类似)连接, 确保libtaos.so在目录/usr/local/taos/driver里, 并且/usr/local/taos/driver在系统库函数搜索路径LD_LIBRARY_PATH里 对于Windows上的JDBC, ODBC, Python, Go等连接,确保C:\TDengine\driver\taos.dll在你的系统库函数搜索目录里 (建议taos.dll放在目录 C:\Windows\System32) 如果仍不能排除连接故障 Linux 系统请使用命令行工具nc来分别判断指定端口的TCP和UDP连接是否通畅 检查UDP端口连接是否工作:nc -vuz {hostIP} {port} 检查服务器侧TCP端口连接是否工作:nc -l {port} 检查客户端侧TCP端口连接是否工作:nc {hostIP} {port} Windows 系统请使用 PowerShell 命令 Net-TestConnection -ComputerName {fqdn} -Port {port} 检测服务段端口是否访问 也可以使用taos程序内嵌的网络连通检测功能,来验证服务器和客户端之间指定的端口连接是否通畅(包括TCP和UDP):TDengine 内嵌网络检测工具使用指南。
问题解决
其实,以上很多原因都是可以排除的,比如我的网络是不是能 ping
通,是不是防火墙问题, maven
依赖里的 taos-jdbcdriver
版本是不是兼容, JNI
方式的客户端是否安装 taos.dll
,服务端 taosd
是否运行等等。
然后,鬼使神差地,我就想用 IDEA
的数据库插件连接 TDengine
试一下,输入连接信息,用户密码信息,配置下 driver
,测试连接……一气呵成~~
这时,问题暴露了: JNI ERROR(2345): Client and server's time is not synchronized.
竟然是因为客户端与服务端的时间不一致导致的,我瞬间反应过来,中午睡觉时,电脑休眠了,虚拟机也休眠了,最后的最后,就是虚拟机的时间滞后了。。
顺便来看下虚拟机的时间验证下:(接着,我使用阿里云提供的的网络时钟同步服务 NTP
校准了服务器时间)
问题总结
一般我都会把电脑的休眠时间设为2小时,这样我在短时间离开后不用重新唤醒主机。
而昨天换电脑后还没来得及进行设置,默认10分钟后就休眠了,然而我去睡觉了( ̄o ̄) . z Z,便酿成了今日的一幕惨剧,耗费了半个小时。
同时,也期待 TDengine
的客户端依赖在实际开发时,尽量将错误信息提示清楚,不然,总会让人手足无措,摸不着头脑。。