-
Notifications
You must be signed in to change notification settings - Fork 412
1.7_深入监控
监控的主要维度和指标如下所示:
监控维度 | 主要指标 |
---|---|
Task监控 |
状态监控、延迟监控(延迟轨迹、延迟报警)、异常监控(异常明细、异常报警、历史记录)、同步监控(同步流量、写入速度等) |
worker监控 |
运行状态、启动时间、自动重启、内存使用率、GC情况、线程数、CPU-load、CPU使用率、网络流量、TCP连接数 |
Manager监控 |
启动时间、自动重启 |
Rebalance监控 |
Group状态、Worker状态、Task分配状态 |
Manager内部通过运行对应的一系列Monitor,来对集群进行立体化的监控,监控相关的主要功能模块有:
- 数据收集
首先,对各个维度的监控指标进行各种形式的数据收集,以满足后续监控报警的需要。 - 监控指标配置
在新增Task或Worker时,会自动增加对Task和Worker的各项监控指标的默认配置,并在管理端列出每个监控项目的各个监控指标的详细配置,包括报警阈值、报警时间间隔(默认2分钟)、报警发送人、监控时间范围、是否有效等属性,可对任意一项监控指标进行修改、删除、开启或关闭等操作。 -
监控数据展现
除了状态类监控,Task和Worker的每项监控指标都以曲线图的形式展现,默认展示当前时间之前一天的数据,并可以选择起始时间查询任意历史区间的监控数据,方便快速定位和排查问题,提高了可视性和易用性。 - 超过阈值报警
当某项监控指标的数据超过所配置的报警阈值时,Monitor会触发报警,以邮件或者短信的形式将报警信息发送给接收人,以便我们能够快速及时地发现问题和处理问题。
Task监控指标 | 展现形式 | 正常参考指标 | 报警阈值 | 备注 |
---|---|---|---|---|
运行状态 | 实时展现 |
PREPARING、 RUNNING、PAUSED |
UNASSIGNED、FAILED |
status节点随Task的启动在ZK注册,用来监控Task的实时运行状态。当出现Task的运行状态和目标状态不一致,或者status节点消失Task状态变为UNASSIGNED,或者Task出现异常状态变为FAILED时,进行报警,并且,若目标状态为STARTED而运行状态为FAILED,则重启Task。 常发生在ReBalance过程中或者Worker出现宕机等故障的情况。或者当Task实际运行状态和Task的TargetState设定的状态不匹配时也会触发报警。 |
状态冲突 | 历史记录 | 无冲突 |
产生即报警 |
监控当Task重复运行产生状态冲突时,进行报警,常发生在ReBalance之后,宿主Worker发生改变的时候,应对极端情况下产生的数据不一致。 |
同步延迟时间 | 曲线图(分钟级平均值) | <500ms |
2000ms(默认) |
|
单条写入耗时 | 曲线图(分钟级平均值) | <2ms | 无 |
|
同步数据条数 | 曲线图(分钟级平均值) | 无 | 无 |
|
同步流量大小 | 曲线图(分钟级平均值) | 无 | 无 |
|
读写交互次数 | 曲线图(分钟级累加值) | 无 | 无 | 已在上面两曲线图中与同步数据条数和同步流量大小一同展现。 |
任务异常 |
曲线图(分钟级累加值)+实时+历史 | 无异常 |
产生即报警 |
注:异常个数以每分钟曲线展示,有无异常与异常详情均为实时展示,异常历史详情记录可任意查看 |
【JVM监控】
JVM监控指标 | 展现形式 | 正常指标 | 报警阈值 | 备注 |
---|---|---|---|---|
运行状态 | 实时展示 | 正常运行 | 异常情况 | 主要用于监控Worker的运行状态是否正常,常发生在Worker进程没有启动起来或者假死等非正常运行的情况。 |
启动时间 | 实时展示 | 无 | 无 | 主要用于监控Worker最近一次的启动时间,有助于系统宏观监控和排查问题。 |
自动重启 | 自动执行 | 无 | 无 | 主要用于自动检测Worker是否发生宕机,并自动重启,来应对出现Worker进程意外终止的情况。 |
新生代内存使用情况 | 曲线图(分钟级当前值) | 无 | 新生代和老年代已用内存的总和>90%(默认) |
|
老年代内存使用情况 | 曲线图(分钟级当前值) | 无 | 新生代和老年代已用内存的总和>90%(默认) |
|
GC次数(新生代、老年代) | 曲线图(分钟级累加值) | 无 | 无 |
|
GC时间(新生代、老年代) | 曲线图(分钟级累加值) | 无 | 无 |
|
线程数 | 曲线图(分钟级当前值) | 无 | 无 |
|
【系统监控】
系统监控指标 | 展现形式 | 正常指标 | 报警阈值 | 备注 |
---|---|---|---|---|
CPU平均负载 | 曲线图(分钟级当前值) | <0.7 | 无 |
|
CPU使用率(系统、用户) | 曲线图(分钟级当前值) | 无 | 无 |
|
网卡流量(接收、发送) | 曲线图(分钟级累加值) | 无 | 无 |
|
TCP连接数 | 曲线图(分钟级当前值) | 无 | 无 |
|
Manager监控指标 | 展现形式 | 正常指标 | 报警阈值 | 备注 |
---|---|---|---|---|
启动时间 | 实时展示 | 无 | 无 | 主要用于监控其最近一次的启动时间,有助于系统宏观监控和排查问题。 |
自动重启 | 自动执行 | 无 | 无 | 实现了自动检测Manager进程与自动重启,用于应对出现manager进程意外终止的情况。 |
进行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同步性能的采集通过在TaskReader中埋点,当向Writer发送同步数据时,进行延迟时间、任务异常、同步性能的统计,即将每次同步的延迟时间、异常信息、数据条数、流量大小、写入时间存储到内存中。
同时,在Worker内部有对应的延迟时间、任务异常、同步性能的Probe,运行着每分钟一次的定时任务,定时取出内存中的统计数据进行处理,计算出各项一分钟的平均值作为Task的同步性能监控指标,包括Task的延迟时间、异常个数、异常详情、每分钟同步的数据记录数,每分钟同步的流量大小、每分钟的读写交互次数、单条记录的写入速度。
Task的当前运行状态通过读取其在ZK的status节点信息来获取。
Task状态冲突的采集通过Task每次启动生成的一个唯一的UUID——ExecutionId,存放到ZK的status节点中,当Task每次更新或删除ZK的status节点时,会检测其当前ExecutionId是否和ZK节点中保存的ExecutionId一致,若一致则正常更新,若冲突则说明发生了重复运行的情况,此时,把重复运行的时间段和相关上下文信息记录到日志表,作为Task状态冲突监控指标。
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的启动时间同样通过构建当前JvmSnapshot,从JVM快照信息中获取。
Manager的自动重启功能同Worker类似,也是通过利用linux的cron机制,在startup.sh中用shell脚本实现。
在Manager的Coordinator中,管理着当前进行ReBalance的Group、Task和Worker成员信息,可以随时获取Group状态、每个Group下的Worker运行状态和每个Worker的Task分配状态,用于ReBalance过程与结果的监控。
Sigar是一个用于系统信息收集和报表的开源工具,提供了跨平台的系统信息收集的API,运用简便,信息全面,功能强大。
Java项目引入Sigar的流程:
-
下载最新版本的sigar.jar,在自己的Java项目中引入sigar.jar。本项目为Maven项目,在pom.xml文件中引入sigar:
<dependency> <groupId>org.fusesource</groupId> <artifactId>sigar</artifactId> <version>1.6.4</version></dependency>
-
Sigar API 是依赖本地库文件工作的,内部通过
java.library.path
加载本地库文件。所以需要将对应的dll文件或者so文件添加到系统目录。例如:Windows操作系统下Sigar.jar 依赖sigar-amd64-winnt.dll或sigar-x86-winnt.dll,linux 操作系统下则依赖libsigar-amd64-linux.so或libsigar-x86-linux.so(这些库文件可以在下载的Sigar压缩包中找到)。但是,如果为了使用几个API,每部署到一台电脑还要去折腾一遍库文件,这样代价就太大了,因此,最终采用的办法是:
(1)将 Sigar 的本地库文件放到本地项目中的src/main/resources/sigar
目录下;
(2)在项目中通过代码获取此Sigar路径,并将路径追加到java.library.path
中。