由于我们拥有较多的服务器,因而如何尽快地知道服务器上的某项服务是否挂了就是一个运维人员需要解决的问题。基本的想法就是开发一个监控服务,我将其取名ServerDog,设置Service模块,其会按照设定的频率与各种服务建立TCP连接,如果连接失败,例如连续连接失败,则触发报警,将情况通过邮件推送给相关人员。
OK,服务器监控的问题基本就解决了。
问题一
后来遇到一种新的情况,就是服务器带宽不足的问题。我发现,当服务器带宽不足时,服务器的响应时间将会大大增加,表现在客户端来说就是各种操作非常卡顿。但就ServerDog的Service模块监控到的现象而言,其与服务器的连接耗时却没有明显的波动。
而对服务器添加阿里云的云监控,其站点监控所记录的服务器响应时间却能够真实地反应出服务器带宽不足的问题,在服务器带宽不足时,所监控到的服务器响应时间明显变长。
ServerDog的Service监控和阿里云的站点监控差别在哪里呢?
ServerDog的Service监控仅仅进行了简单的TCP连接检测,都不用考虑所监控的服务是https还是socket,只要提供IP和port,能建立TCP连接就行了,其监控结果仅仅是监控服务器与要监控的服务建立连接的耗时。而阿里云的站点监控则更全面具体,它需要你明确设定服务的协议链接地址,甚至参数等,如:https://xxx.com?test。而阿里云的站点监控结果,则是监控服务器与监控服务之间一次完整的通信所消耗的时间,甚至区分了DNS时间、建连时间、SSL时间等,非常强大。ServerDog的监控结果其实仅仅相当于阿里云监控结果中的一个部分,即建连时间。事实上,在服务器带宽不足时,虽然阿里云所监控到的站点响应时间大大延长,但具体到建连时间,其实波动也不大,与ServerDog的service模块监控结果是匹配的。
因此,我决定升级ServerDog,使其具备阿里云站点监测的能力。但Java中怎么和一个站点建立通信,并且得知站点在各个通信阶段所消耗的时间呢?这似乎不是在网络应用层一个简单的通信操作能够做到的。查来查去,只能搬出上古神器Curl,一条命令解决烦恼:
curl -o /dev/null --connect-timeout 5 --max-time 10 -s -w "http_code=%{http_code},time_namelookup=%{time_namelookup},time_connect=%{time_connect},time_appconnect=%{time_appconnect},time_redirect=%{time_redirect},num_redirects=%{num_redirects},time_pretransfer=%{time_pretransfer},time_starttransfer=%{time_starttransfer},time_total=%{time_total},size_download=%{size_download},speed_download=%{speed_download}\n" https://xxx.com/xxx/glasses_10.png
Curl对C++和PHP比较友好,在Java中,只好通过Process来进行调用,但问题总算解决了:
问题二
通过与服务器建立通信来对服务进行监控似乎是很美好的,但是,服务器上的某些服务并不对外提供服务,通过外网根本就无法建立连接;甚至有些服务虽然对外提供服务,但只和某些固定的IP通信,绑定了IP。此时前面提到的站点监控就无能为力了。
此时,升级ServerDog的Command模块,直接对服务器进行进程监控,可以解决问题。
问题三
ServerDog的Command模块按照设定的时间规则向运维人员发送服务器状态报表,然而,服务器有点多,报表看不过来,而且也懒得看。于是Command模块也需要升级为主动预警模式,即当服务区出现硬盘不足、内存不足、磁盘不足、带宽不足、CPU负载过高等情况时,再主动报警。这样就能保证运维人员能够及时看到紧要的信息而不必陷入冗长的报表之中。
面对公司众多的https网址,ServerDog还有一个Domain模块,用于监控SSL证书的过期情况,此处不再说明。
问题四
邮件通知模式的好处是可以在邮箱中长时间保留报警信息,可以分类保存,报警信息也可以做到尽可能的做到详细。在手机上安装一个邮件客户端也能够较为方便及时地收取报警信息;而且这一切是免费的。
但邮件通知相对于短信通知,其有以下不足:
1. 通知的及时性
在大多数情况下,邮件通知是可以保证及时性的,但并不总是如此,有时由于邮件服务器负载大,网络延迟等问题,邮件并不能被及时收到,从而导致运维人员错过重要的报警,这一方面短信通知要强得多。
2. 通知提醒
对于短信通知,除了较为及时以外,其还有自带反复提醒的特征,未读短信会隔断时间就提醒一次,这也能避免运维人员错过重要信息。
因此,可以对接阿里云云通信SDK,实现邮件和短信双重提醒,当然,短信提醒是收费的,但是价格便宜,几乎可以忽略。