宜信开源|UAV心跳机制与容器、进程数据采集

服务心跳机制主要用于确认服务的存活状态,UAVStack的心跳数据还负责上报节点的容器及进程监控数据,支持在前端实时查看应用容器和进程的运行状态,并根据这些数据对容器和进程做出预警。

一、背景

在微服务架构中,服务心跳是一个简单但非常重要的机制,用于确认微服务的存活状态。UAVStack中的心跳是一个Http请求,MonitorAgent(以下简称MA)通过定时向HealthManager(以下简称HM)发送一个带有特定报文格式的Http请求完成一次心跳的发送过程。心跳报文含有发送时的时间戳,用于更新HM端的数据状态。

与普通的心跳不同,UAVStack中的心跳还负责上送MA端的应用容器和进程监控数据。每次发送心跳的时候,在MA端会有定时任务去收集MA所在的应用容器心跳的基本信息,及应用容器上的进程数据,随着心跳数据包一起上送。

本文将首先介绍UAVStack的基础心跳机制,之后对应用容器、进程的数据采集做详细说明。

二、基本架构

心跳的实现有很多种方式,心跳的发起可以由客户端发起也可以由服务端发起,只需完成确认存活这一基本功能即可。但是在一般的实现中,我们更倾向于客户端主动向服务端进行报告,因为当客户端逐渐增加,单纯通过服务端的轮询会导致服务端的压力,影响性能。

在UAVStack的实现中,我们也采用了这样的方式,通过客户端(MA)主动向服务端(HM)发送心跳信息,告知HM自身的存活情况。

一次心跳由UAV的MA和HM共同完成:

  • MA定时生成心跳数据,携带MA节点的应用容器信息、进程信息以及服务信息,通过Http请求上报给HM;
  • HM负责将接收到的心跳数据存入Redis缓存,并定时扫描心跳数据,确认节点的存活状态。对于随同的应用容器等监控信息,会在Redis进行暂存,后续随着HM的定时任务最终存入OpenTSDB进行落盘。整体的架构如下所示:

三、基础心跳机制

心跳服务主要流程如上图所示,其逻辑有以下几步:

1)MA的定时心跳任务生成一个空心跳数据,将心跳数据交给MA端的容器、进程数据采集任务。

2)MA端的容器、进程数据采集任务负责产生心跳数据的时间戳、采集节点的应用容器、进程监控数据、节点的基本信息、节点的可用服务信息等。经过以上过程之后,心跳数据将包含以下内容:

  • 心跳时间戳:节点发送心跳时的时间戳,方便HM后续比对判定节点的存活状态。
  • 应用容器的基本信息:包括节点ID、名称、主机名、IP等。
  • 应用容器的简单监控数据:包括CPU负载、内存使用、硬盘使用等。
  • 应用容器上的进程信息:包括每个进程的pid、资源占用等。
  • 节点的能力信息:包括该节点上启用的Feature功能。
  • 节点的服务信息:包括该节点上可提供的服务及其访问接口,用以实现服务发现。
  • 可选)子节点的节点信息:如果MA和HM部署在不同的网段,则MA无法通过直接Http的方式推送数据给HM,此时需要MA将数据上送给自己网段内的HM,再由该HM的心跳客户端发送给总的HM。这种情况下,上报的数据中会携带子节点的节点信息。每个节点信息均会包含上述几种数据。

最后将心跳数据发送给HM。

3)HM端在接收到心跳数据之后,将其存入自身的Redis缓存。使用上报数据中的服务信息更新Redis中的服务状态,用于服务发现请求。

4)HM端在启动心跳接收服务时,会同时启动心跳检查任务。这个任务会定时扫描Redis中的心跳数据,根据当前系统时间与心跳时间戳的差,判断心跳节点的存活状态,更新节点的状态,并对于过期的节点做删除处理。

四、应用容器、进程数据采集

UAV的心跳数据除了完成心跳功能之外,还要上报节点的应用容器及进程的监控数据。

将应用容器与进程数据通过Http方式上报是为了保证应用容器监控数据与应用监控数据的隔离,通过不同方式的上送可以保证在MQ服务不能使用时不影响容器与进程数据的采集。

本节将集中说明这些数据的采集细节。

4.1 应用容器数据采集

应用容器的数据分为两部分:

其一是容器的基本信息,即节点的ID,主机名,系统信息和JVM信息等;

另一部分是一些简单的实时监控采集数据,包括CPU的负载、内存占用情况和磁盘占用情况等。这些数据在每次上报心跳数据的时候会分别从以下数据源实时采集:

  • 应用启动后的System.getProperty:这部分数据主要包括操作系统的基本信息,JVM信息等。
  • Java提供的工具类:这部分主要包括网卡信息。
  • 通过JMX获取的信息:包括CPU占用、内存占用等。
  • 系统本身记录的信息:这部分包括可提供的服务信息、启动的Feature信息、节点ID等。
  • 通过执行系统命令得到的信息:包括磁盘占用情况。
  • 通过直接读取/proc目录下的文件获取的信息:包括CPU占用、内存占用等。

4.2 进程数据采集

不同于应用容器数据采集,进程的数据并不是在心跳进程中进行采集的,而是由专门的Feature负责。在Feature中将进程数据采集进一步分解成进程端口流量数据采集以及其他数据采集。这两者均由定时任务完成,互相协作,最终由进程探测的定时任务更新心跳客户端的进程数据。

这种使用多个采集任务分别采集的方式可以针对不同的数据进行不同频度的采集。如对于网络端口流量的采集,就可以以更长的周期进行,以减低数据采集带来的性能损耗。同时,不同的任务也可以使用不同的线程执行,提升执行的效率。

进程数据采集流程大致如下图所示:

进程端口流量探测定时任务每隔一定时间读取本地变量端口列表,获取要采集的端口号。

之后对于Windows环境,采用JPcap获取网卡对象,并在网卡上设置tcp过滤器来统计一段时间内的端口流量。对于Linux环境则是直接通过调用Python脚本打开socket,分析流过的数据包获得。

获得全部端口上的流量数据后,任务会将采集数据交给进程数据采集任务,更新其本地变量,同时设置本次采集的时间戳。

进程探测定时任务由一系列子任务构成,在任务开始的时候,会先准备好一个Map结构的数据容器,用于存放采集到的进程信息,每个进程由pid区分,作为Map的key。

任务会先扫描所有的进程,获取pid和进程的端口。扫描到的进程会经过一个过滤器排除不需要采集数据的进程,之后正式采集每个进程上的数据。

对于每一个进程,会通过运行系统命令采集连接数、CPU、内存占用,磁盘读写数据以及网络端口流量数据。其中网络端口流量数据是由端口流量探测任务采集并更新的本地变量,而进程探测任务也会将扫描到的最新的端口列表更新到端口流量探测任务的本地变量。

如果应用是部署在容器上的,则还会有对应的容器信息采集。最后进程探测任务会将采集到的进程数据更新到心跳客户端的本地变量,随着每次心跳数据的生成被一起采集并上报。

进程数据的采集分别来自以下数据源:

  • 系统命令:包括CPU、内存、连接数等(top等命令)
  • /proc目录下各进程子目录:包括CPU、内存等信息、磁盘读写等信息
  • 执行脚本:包括Linux环境下的端口流量数据采集
  • 第三方工具包:包括win环境下的端口流量数据采集(JPcap)

五、HM处理

心跳数据和容器数据在通过Http上送到HM端之后,会由HM端对应的服务进行处理。

HM在启动时会启动自己的心跳客户端,负责发送本机的心跳数据和采集HM所在容器的监控数据。同时还会启动一个心跳服务,负责接收处理所有上送的心跳和容器数据信息。

心跳服务在收到心跳数据请求后,会根据HM的配置,判定当前的HM是不是Master节点。如果HM是Master节点,心跳服务会从Http携带的报文中拿出上报的数据,取得上报节点中的可用服务用于更新服务发现信息,之后将数据存入后端的Redis缓存中;如果不是Master节点,则会将数据移交至本机的心跳客户端,由其下次发送心跳时一起上送。

这样的设计是考虑到大规模监控时会有跨机房的情况存在,此时各监控节点往往不在同一个网段内,通过将同一个网段内的机器上交到边界的“网关”统一上交可解决这一问题。此时的HM即充当着“网关”这一角色。

HM在启动的时候同时还会启动一个定时任务,这个任务负责处理各节点的存活状况。任务定时从Redis中读取全部心跳数据,依次检查上送心跳数据中的客户端时间戳与当前系统时间戳的差值。

当时间超过一定的上送时间间隔之后,更改对应的节点存活状态。当超过一倍上送时间间隔,意味节点可能死亡,处于dying状态。当超过两倍时间间隔时,意味着节点已经死亡。当超过三倍时间间隔时,心跳服务会删除该节点的缓存记录。

随心跳一起上报的容器和进程数据会随着心跳数据一同被存入Redis中,后续由HM的其他定时任务读取并发送给预警中心进行处理,最终监控指标被格式化成特定的结构存入OpenTSDB。

同时采集的容器数据和进程数据会提供前端AppHub查看界面,如图所示:

点击页面上的每一个节点,可以查看详细的节点信息,包括节点的操作系统信息、JVM信息、提供的服务和安装的Feture等等。这些也就是前文所说的随心跳数据上报的那部分信息。如图所示:

六、总结

心跳是微服务架构基础但重要的机制,通过定时发送心跳数据,MA节点报告了自身的存活状态,使得HM能够知晓当前系统的运行状态。

同时,UAVStack的心跳数据还同时负责上报节点的容器及进程监控数据,随着这些数据的上报,HM可以对监控的容器和进程做出预警,也能够在前端实时看到应用容器和进程的运行状态。

官方网站:https://uavorg.github.io/main/

开源地址:https://github.com/uavorg

拓展阅读:宜信开源|UAVStack的慢SQL数据库监控功能及其实现

作者:张明明

来源:宜信技术学院

原文地址:https://blog.51cto.com/14159827/2415857

时间: 2024-10-10 16:25:00

宜信开源|UAV心跳机制与容器、进程数据采集的相关文章

宜信开源|分布式任务调度平台SIA-TASK的架构设计与运行流程

一.分布式任务调度的背景 无论是互联网应用或者企业级应用,都充斥着大量的批处理任务.我们常常需要一些任务调度系统来帮助解决问题.随着微服务化架构的逐步演进,单体架构逐渐演变为分布式.微服务架构.在此背景下,很多原先的任务调度平台已经不能满足业务系统的需求,于是出现了一些基于分布式的任务调度平台. 1.1 分布式任务调度的演进 在实际业务开发过程中,很多时候我们无可避免地需要使用一些定时任务来解决问题.通常我们会有多种解决方案:使用 Crontab 或 SpringCron (当然这种情况可能机器

开源|宜信开源专注业务逻辑的轻量级服务框架nextsystem4

宜信于2019年3月29日正式开源nextsystem4(以下简称"NS4")系列模块. 此次开源的NS4系列模块是围绕当前支付系统笨重.代码耦合度高.维护成本高而产生的分布式业务系统解决方案.NS4系列框架允许创建复杂的流程/业务流,对于业务服务节点的实现可串联,可分布式.其精简.轻量,实现了"脱容器"(不依赖tomcat.jetty等容器)独立运行.NS4系列框架的设计理念是将业务和逻辑进行分离,开发人员只需通过简单的配置和业务实现就可以实现逻辑复杂.性能高效.

宜信开源|Davinci一键部署:如何三句代码跑起Davinci

导读:之前喜欢Davinci的小伙伴儿在安装部署Davinci遇见问题时需要在github issue区等待技术人员的解答.现在不用怕啦,社区热心用户白菜君帮我们支持了docker-composer一键启动,以后只需寥寥几行代码,Davinci就能舒畅的run起来了.还等什么,赶紧部署起来吧~ 敲重点 Davinci Docker原部署教程在这里: https://github.com/edp963/davinci-docker 里面会不定时更新 记得收藏啊!! 下面是部署教程: 一.环境要求

宜信开源微服务任务调度平台(SIA-TASK)

背景 无论是互联网应用或者企业级应用,都充斥着大量的批处理任务.常常需要一些任务调度系统帮助开发者解决问题.随着微服务化架构的逐步演进,单体架构逐渐演变为分布式.微服务架构.在此的背景下,很多原先的任务调度平台已经不能满足业务系统的需求.于是出现了一些基于分布式的任务调度平台.这些平台各有其特点,但各有不足之处,比如不支持任务编排.与业务高耦合.不支持跨平台等问题.非常不符合新一代微服务架构的需求,因此宜信公司开发了微服务任务调度平台(SIA-TASK). SIA是宜信公司基础开发平台Simpl

支持100+业务线、累计发布17万次|宜信容器云的A点与B点(分享实录)

宜信公司从2018年初开始建设容器云,至今,容器云的常用基本功能已经趋于完善,主要包括服务管理.应用商店.Nginx配置.存储管理.CI/CD.权限管理等,支持100+业务线.3500+的容器运行.伴随公司去VMware以及DevOps.微服务不断推进的背景,后续还会有更多的业务迁移到容器云上,容器云在宜信发挥着越来越重要的作用.本次分享主要介绍宜信容器云平台的背景.主要功能.落地实践及未来规划. 一.宜信容器云平台背景 宜信容器云平台的建设背景主要包括: 提高资源利用率.容器云建设之前,每台物

宜信微服务任务调度平台建设实践|分享实录

本文主要围绕SIA平台展开,包括研发背景设计思路和技术架构,以及如何支持业务方. 内容来源:宜信技术学院第4期技术沙龙-线上直播|宜信微服务任务调度平台建设实践 主讲人:宜信高级架构师&开发平台负责人 梁鑫 导读:如今,无论是互联网应用还是企业级应用,都充斥着大量的批处理任务,常常需要一些任务调度系统帮助我们解决问题.随着微服务化架构的逐步演进,单体架构逐渐演变为分布式.微服务架构. 在此背景下,很多之前的任务调度平台已经不能满足业务系统的需求,于是出现了一些基于分布式的任务调度平台.这些平台各

宜信区块链实践-案例及探索

前段时间,在苏州的中国基金博物馆,举行了一场由中国基金博物馆以及中国区块链应用研究中心共同主办的"博物馆金融大讲堂第129期区块链大讲堂".宜信区块链实验室主任.翼启云服区块链业务总监于明扬受邀出席,并分享了主题为<区块链探索与财富管理>的内容,以下内容来自于明扬的现场演讲. (宜信区块链实验室主任.翼启云服区块链业务总监于明扬) 一.区块链在金融领域应用现状 作为一家金融科技企业,宜信在几年前就已经开始区块链技术产业方面的研究,因为我们意识到区块链的技术在整个供应链金融以

Ambari窥探分布式心跳机制

Ambari是在Hadoop大数据生态圈的基础上应运而生,Ambari的架构也借助了分布式的思想,细细品味,与Hadoop分布式架构有很多相似之处. Hadoop中单NN 与多DN的通信是借助netty封装的RPC机制实现,单Ambari server与多Agent通信则是基于restful api + json实现,rpc与rest api的争论不是本文要讨论的重点,我们追求的目标只有一个,完美实现业务需求. 心跳设计一个主要的原因是判断客户端是否在线,每隔一段时间会发送数据交互.Ambari

互联网推送服务原理:长连接+心跳机制(MQTT协议)

互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了,所以才会出现像MQTT这种轻量级低消耗的协议来维护长连接,那么要如何维护长连接呢: 在写之前,我们首先了解一下为什么Android维护长连接需要心跳机制,首先我们知道,维护任何一个长连接都需要心跳机制,客户端发送一个心跳给 服务器,服务器给客户端一个心跳应答,这样就形成客户端服务器的一次完整的握手