朋友研发的项目上线后频频崩溃,朋友的内心也是崩溃的
我朋友去年给某政府单位开发了一套BS的软件。项目是用java语言编写的,部署在Tomcat服务器里,数据库用的MySQL。Tomcat和MySQL部署在两个Centos服务器上。为了安全,两个服务器通过内网互联,用户通过VPN访问服务,服务在内网环境不容易受到攻击。
一切看起来天衣无缝,可上线后悲剧了。服务频频崩溃,用户登不上去或者登录上去后页面一片空白!需要运维人员重启Tomcat或者MySQL后才能继续用!
刚上线的项目出一些问题,客户也能理解。朋友及公司的其他研发人员也抓紧研究是哪里出了问题。查看项目日志是关于数据库连接池耗尽的报错,听起来不是那么棘手,但做了大量的改进后,数个月过去了,项目依然频频崩溃!
由于项目是部署在内网环境,无法通过发邮件的方式通知到运维人员。每次都是客户发现登录不上去后打电话给朋友,然后朋友去重启服务。。。
现在不止是项目,朋友的内心也在崩溃!预感暂时无法通过优化代码解决问题,我思考并肝到了凌晨4点,帮他编写了一套监测程序!
项目运行情况要通知到运维人员,需要一个互联网环境的服务器,我就用我的腾讯云服务器。在服务器先登录VPN账号,这样就可以去访问服务。我编写的监测程序思路如下:
1. 用HttpClient带着用户账号去登录服务(监测是否能登录)。
2. 登录成功后访问若干个常用的服务接口(监测登录后页面是否一片空白)。
3. 循环进行1、2步的操作,每分钟执行一次,如果连续两次访问失败,则认定服务崩溃了。
4. 在安装MySQL的服务器上放置一套重启MySQL的shell脚本,脚本如下:
5. 在安装MySQL的服务器上部署另一个java程序,此java程序开放一个http的接口,此接口调用shell脚本去重启MySQL。核心代码如下:
6. 认定服务崩溃后,监测程序用HttpClient去调用5中的接口,将MySQL重启。同样的思路在安装Tomcat的服务器上部署一个java程序和shell脚本,进行Tomcat的重启。
7. 当服务崩溃时先重启MySQL,如果重启MySQL后依然崩溃再去重启Tomcat,因为重启MySQL,用户Session不会丢,而重启Tomcat用户Session会丢,已经登录的用户需要重新登录。根据朋友的反馈,98%的情况下重启MySQL即可,偶尔会需要重启Tomcat才行。
8. 由于监测程序部署在互联网环境中,则项目的运行情况可以按照需求实时的发送邮件给运维人员。而项目崩溃后会自动重启,无需运维人员参与重启,大大解放了运维人员。
PS:监测程序实属无奈之举,祝愿在不久的将来,项目能不再崩溃,一切重归光明。如果您对监测程序感兴趣或有其他的建议,欢迎留言或私信与我交流~~