Skip to content

1.7_深入监控

elevenqq edited this page Sep 30, 2018 · 3 revisions

监控概览

监控的主要维度和指标如下所示:

监控维度 主要指标

Task监控

状态监控、延迟监控(延迟轨迹、延迟报警)、异常监控(异常明细、异常报警、历史记录)、同步监控(同步流量、写入速度等)

worker监控

运行状态、启动时间、自动重启、内存使用率、GC情况、线程数、CPU-load、CPU使用率、网络流量、TCP连接数

Manager监控

启动时间、自动重启

Rebalance监控

Group状态、Worker状态、Task分配状态

Manager内部通过运行对应的一系列Monitor,来对集群进行立体化的监控,监控相关的主要功能模块有:

  1. 数据收集
    首先,对各个维度的监控指标进行各种形式的数据收集,以满足后续监控报警的需要。
  2. 监控指标配置
    在新增Task或Worker时,会自动增加对Task和Worker的各项监控指标的默认配置,并在管理端列出每个监控项目的各个监控指标的详细配置,包括报警阈值、报警时间间隔(默认2分钟)、报警发送人、监控时间范围、是否有效等属性,可对任意一项监控指标进行修改、删除、开启或关闭等操作。
  3. 监控数据展现
    除了状态类监控,Task和Worker的每项监控指标都以曲线图的形式展现,默认展示当前时间之前一天的数据,并可以选择起始时间查询任意历史区间的监控数据,方便快速定位和排查问题,提高了可视性和易用性。

  4. 超过阈值报警
    当某项监控指标的数据超过所配置的报警阈值时,Monitor会触发报警,以邮件或者短信的形式将报警信息发送给接收人,以便我们能够快速及时地发现问题和处理问题。

指标详解

Task监控

Task监控指标 展现形式 正常参考指标 报警阈值 备注
运行状态 实时展现

PREPARING、

RUNNING、PAUSED

UNASSIGNED、FAILED

status节点随Task的启动在ZK注册,用来监控Task的实时运行状态。当出现Task的运行状态和目标状态不一致,或者status节点消失Task状态变为UNASSIGNED,或者Task出现异常状态变为FAILED时,进行报警,并且,若目标状态为STARTED而运行状态为FAILED,则重启Task。

常发生在ReBalance过程中或者Worker出现宕机等故障的情况。或者当Task实际运行状态和Task的TargetState设定的状态不匹配时也会触发报警。

状态冲突 历史记录 无冲突

产生即报警
有效时间5分钟

监控当Task重复运行产生状态冲突时,进行报警,常发生在ReBalance之后,宿主Worker发生改变的时候,应对极端情况下产生的数据不一致。
同步延迟时间 曲线图(分钟级平均值) <500ms

2000ms(默认)
有效时间3分钟

delay

单条写入耗时 曲线图(分钟级平均值) <2ms

write

同步数据条数 曲线图(分钟级平均值)

count

同步流量大小 曲线图(分钟级平均值)

size

读写交互次数 曲线图(分钟级累加值) 已在上面两曲线图中与同步数据条数和同步流量大小一同展现。

任务异常

曲线图(分钟级累加值)+实时+历史 无异常

产生即报警
有效时间3分钟

exception

注:异常个数以每分钟曲线展示,有无异常与异常详情均为实时展示,异常历史详情记录可任意查看

Worker监控

JVM监控

JVM监控指标 展现形式 正常指标 报警阈值 备注
运行状态 实时展示 正常运行 异常情况 主要用于监控Worker的运行状态是否正常,常发生在Worker进程没有启动起来或者假死等非正常运行的情况。
启动时间 实时展示 主要用于监控Worker最近一次的启动时间,有助于系统宏观监控和排查问题。
自动重启 自动执行 主要用于自动检测Worker是否发生宕机,并自动重启,来应对出现Worker进程意外终止的情况。
新生代内存使用情况 曲线图(分钟级当前值) 新生代和老年代已用内存的总和>90%(默认)

new

老年代内存使用情况 曲线图(分钟级当前值) 新生代和老年代已用内存的总和>90%(默认)

old

GC次数(新生代、老年代) 曲线图(分钟级累加值)

GC-count

GC时间(新生代、老年代) 曲线图(分钟级累加值)

GC-time

线程数 曲线图(分钟级当前值)

thread

系统监控

系统监控指标 展现形式 正常指标 报警阈值 备注
CPU平均负载 曲线图(分钟级当前值) <0.7

load

CPU使用率(系统、用户) 曲线图(分钟级当前值)

CPU

网卡流量(接收、发送) 曲线图(分钟级累加值)

net

TCP连接数 曲线图(分钟级当前值)

TCP

Manager监控

Manager监控指标 展现形式 正常指标 报警阈值 备注
启动时间 实时展示 主要用于监控其最近一次的启动时间,有助于系统宏观监控和排查问题。
自动重启 自动执行 实现了自动检测Manager进程与自动重启,用于应对出现manager进程意外终止的情况。

Rebalance监控

进行ReBalance的基本单位是Group,每个Group有若干个Worker,每个Worker又运行着若干个Task,因此,通过监控每个Group当前的状态和Generation、Worker的运行状态和Task的分配情况,便于把控整个ReBalance的阶段、过程与结果。

ReBalance监控指标 展现形式 正常指标 报警阈值 备注
Group状态 实时展示 Stable

Group的状态有:PreparingRebalance、AwaitingSync、Stable、Dead、Empty。Group状态监控主要用于监控ReBalance的各个阶段。

Worker状态 实时展示 正常运行 异常情况 主要用于监控ReBalance状态与系统整体的运行状况。
Task的分配状态 实时展示 只属于一个Worker 多个Worker重复运行 主要用于监控ReBalance的最终分配结果,当出现多个Worker重复运行一个Task时会触发报警。

数据采集

在监控数据展现之前,系统首先进行各项监控指标的采集,为Manager端进行监控、报警和统计提供数据基础。

Task同步指标采集

Task同步性能的采集通过在TaskReader中埋点,当向Writer发送同步数据时,进行延迟时间、任务异常、同步性能的统计,即将每次同步的延迟时间、异常信息、数据条数、流量大小、写入时间存储到内存中。
同时,在Worker内部有对应的延迟时间、任务异常、同步性能的Probe,运行着每分钟一次的定时任务,定时取出内存中的统计数据进行处理,计算出各项一分钟的平均值作为Task的同步性能监控指标,包括Task的延迟时间、异常个数、异常详情、每分钟同步的数据记录数,每分钟同步的流量大小、每分钟的读写交互次数、单条记录的写入速度。

Task的当前运行状态通过读取其在ZK的status节点信息来获取。

Task状态冲突的采集通过Task每次启动生成的一个唯一的UUID——ExecutionId,存放到ZK的status节点中,当Task每次更新或删除ZK的status节点时,会检测其当前ExecutionId是否和ZK节点中保存的ExecutionId一致,若一致则正常更新,若冲突则说明发生了重复运行的情况,此时,把重复运行的时间段和相关上下文信息记录到日志表,作为Task状态冲突监控指标。

Worker运行指标采集

JVM信息的采集通过ManagementFactory的各种MXBean获取,将启动时间、新生代和老年代的内存使用信息、累积的GC次数、累积的GC时间、当前线程数等信息封装成为JvmSnapshot。
同时,在Worker内部有对应的JVM状态的Probe,运行着每分钟一次的定时任务,定时构建当前JvmSnapshot信息,并进行统计和计算,得到各项一分钟的累加值或当前值作为Worker的JVM监控指标,包括新生代和老年代的最大可用内存、已用内存、一分钟内的GC次数、一分钟内的GC时间、当前线程数。

机器系统信息的采集通过引入开源工具Sigar获取,将平均负载、系统和用户的CPU使用率、接收和发送的总字节数、当前TCP连接数等信息封装成为SystemSnapshot。
同时,在Worker内部有对应的系统状态的Probe,运行着每分钟一次的定时任务,定时构建当前SystemSnapshot信息,并进行统计和计算,得到各项一分钟的累加值或当前值作为Worker的系统监控指标,包括一分钟平均负载、系统和用户的CPU使用率、一分钟内接收和发送的网卡流量、当前TCP连接数。

Worker的运行状态通过GroupMetadataManager中的成员信息来获取。

Worker的自动重启功能通过利用linux的cron机制,在startup.sh中用shell脚本实现,主要逻辑为:每分钟定时执行一次重启,在startup.sh脚本执行启动之前,判断是否存在Manager进程manager.pid,若存在则退出启动,若不存在则执行启动。

Manager监控指标

Manager的启动时间同样通过构建当前JvmSnapshot,从JVM快照信息中获取。
Manager的自动重启功能同Worker类似,也是通过利用linux的cron机制,在startup.sh中用shell脚本实现。

Rebalance监控指标采集

在Manager的Coordinator中,管理着当前进行ReBalance的Group、Task和Worker成员信息,可以随时获取Group状态、每个Group下的Worker运行状态和每个Worker的Task分配状态,用于ReBalance过程与结果的监控。

附:Sigar简介

Sigar是一个用于系统信息收集和报表的开源工具,提供了跨平台的系统信息收集的API,运用简便,信息全面,功能强大。
Java项目引入Sigar的流程:

  1. 下载最新版本的sigar.jar,在自己的Java项目中引入sigar.jar。本项目为Maven项目,在pom.xml文件中引入sigar:

    <dependency>
    <groupId>org.fusesource</groupId>
    <artifactId>sigar</artifactId>
    <version>1.6.4</version></dependency>
    
  2. Sigar API 是依赖本地库文件工作的,内部通过java.library.path加载本地库文件。所以需要将对应的dll文件或者so文件添加到系统目录。例如:Windows操作系统下Sigar.jar 依赖sigar-amd64-winnt.dll或sigar-x86-winnt.dll,linux 操作系统下则依赖libsigar-amd64-linux.solibsigar-x86-linux.so(这些库文件可以在下载的Sigar压缩包中找到)。但是,如果为了使用几个API,每部署到一台电脑还要去折腾一遍库文件,这样代价就太大了,因此,最终采用的办法是:
    (1)将 Sigar 的本地库文件放到本地项目中的src/main/resources/sigar 目录下;
    (2)在项目中通过代码获取此Sigar路径,并将路径追加到 java.library.path中。

进行ing

  • 监控Rebalance的速度和Reblance的时间
  • JVM动态开关(JVM一些可以动态修改的参数)