Jump to Navigation

基于网络的准实时服务监控

基于网络的准实时服务监控

服务作为一个操作系统进程,可能由于程序本身的bug或者停机原因而退出服务。

对于OP系统来说,监控可以达到有效的知识及报警目的。

对于DEV来说,有时根本不需要,查找原因并重启一般人工介入。

但是对于一个更自动化了的完整系统来说,除了OP提供的监控与协助诊断之外,

也许可以实现DEV才能够实现的一种浸入式的监控,并在有监控事件时做精细准确的处理。

常用服务进程监控方式

一般采用第三方服务来监控服务进程的存活状态,并且一般使用OP的系统,如puppet,chef等。

这种方式的特点是一般运行运行在每个服务节点上,确保进程退出时能够通过操作系统API/命令检测到。

这种方式使用可靠成熟应用范围广泛的系统支持,一般还是非常可靠的。

浸入式服务进程监控方式

相比第三方监控工具,这种是把监控代码嵌入服务代码中,与服务共生联系紧密的。

这种不但能够检测进程退出问题,而且还能检测进程的异常假死情况,并且在出现这些情况时做出更精细准确的响应。

但这种方式是有些缺点的,开发稍微复杂,要对异常情况做出更精细准确的响应也是很大挑战。

对于某些要求比较高的系统,还是可以考虑一一下的。

相对于常用的第三方黑盒方式,这是一种更近于白盒式的补充。

甚至以后能够实现黑盒与白盒有效整合,实现更健壮的服务。

一种简易的基于tcp的实现

实现原理:

通过tcp连接状态实现检测对方进程的存活状态。
这里的状态包括连接是否断掉,连接是否僵死,PING/PONG保活机制。
服务端作为独立进程存在。
客户端嵌入在服务进程中。

这种模型简单,能够跨网络跨节点实现准实时的检测,可以与服务部署在相同或者不同的节点都可以。

由于还需要PING/PONG保活机制,以及少量的通讯包,在此选用了比较简单的redis文本协议。

当然网络的实现是受网络的影响,在节点没有崩溃但网络崩溃的情况下,会出现检测结果的失真。

这就需要一个检测集群做集体决议,尽量减小检测结果失真的可能性。

即使在最后依旧出现检测结果失真,除非检测程序有bug的情况,也能够在短时间内通过节点的定时上报存活状态功能,

以及tcp客户端的重新连接机制,恢复节点的在检测集群中状态信息。

tcp server端

功能点,供客户端连接,保持连接,并维护客户端基本节点信息。

在连接断掉后,触发对应的响应,对于当前的使用来说,当作节点下线,修改etcd节点信息,从集群摘除该节点。

除了断线之外,还提供主动ping功能。在ping没有响应的情况下,主动关闭连接,并设置节点为下线状态,从集群摘除该节点。

这个服务端稳定性要求比较高,尽量让其功能简单,做更少的处理才好。

ping功能能够有效的防止僵死连接,虽然检测结果可能有延时。

这里还有一个补充机制,如果是ping无响应,可以尝试ping节点的IP是否存活。

甚至让客户端开启一个端口,做反方向的tcp连通测试。

通过这4种机制基本能够判断节点的存活情况。

tcp client 端

功能点,主动发起连接到server端,发送本节点信息,响应pong包。

如果是连接断掉,重新建立连接。

对于这两端,采用block read 方式,如果是需要处理的协议包则进入处理函数。

如果是读取到连接断开事件,则做下线处理。

实时性效果分析

如果是client端崩溃,则server端能够立即感知,大概时间在10ms以内的ms级别。

如果是ping的话,则由于时间间隔原因,会达到秒级,但仍然能够控制在1-2秒的范围内。

这个间隔与etcd刷新的时间间隔ttl相比,仍然能够有优势,即ping包的效率要比etcd的ttl刷新的效率高。

主动探测端口连接的存活,一次连接的时间,最多ms级别。

主动ping client端的主机ip的存活,会达到秒级,但仍然能够控制在1-2秒的范围内。

service 信息

采用多点协商地节点下线决策

除了上面提到的简单机制,还有一种集群化下线决策机制。

首先需要server成为多节点集群,通过client同时连接到多个(3-5个)server。

当有client下线,理论上大多数server节点会收到相应事件,

然后由server集群中的master节点做下线判断与决定,并做相应的下线修改配置操作。

实现说明

当前实现采用tcp的redis文本协议,这种协议简单,还能够达到传输简单格式化数据多的功能。

代码使用redigo核心解析部分,添加网络掉线事件回调。

使用到的redis命令,set与ping/pong。

Add new comment

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Enter the characters shown in the image.


Main menu 2

Story | by Dr. Radut