Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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一些可以动态修改的参数)


  • Clone this wiki locally

    AltStyle によって変換されたページ (->オリジナル) /