关于服务器端:vivo-服务端监控架构设计与实践
一、业务背景当今时代处在信息大暴发的时代,信息借助互联网的潮流在寰球自在的流动,产生了各式各样的平台零碎和软件系统,越来越多的业务也会导致系统的复杂性。 当外围业务呈现了问题影响用户体验,开发人员没有及时发现,发现问题时曾经为时已晚,又或者当服务器的CPU继续增高,磁盘空间被打满等,须要运维人员及时发现并解决,这就须要一套无效的监控系统对其进行监控和预警。 如何对这些业务和服务器进行监控和保护是咱们开发人员和运维人员不可漠视的重要一环,这篇文章全篇大概5000多字,我将对vivo服务端监控的原理和架构演进之路做一次系统性整顿,以便大家做监控技术选型时参考。 vivo服务端监控旨在为服务端利用提供包含系统监控、JVM监控以及自定义业务指标监控在内的一站式数据监控,并配套实时、多维度、多渠道的告警服务,帮忙用户及时把握利用多方面状态,事先及时预警发现故障,预先提供详实的数据用于追究定位问题,晋升服务可用性。目前vivo服务端监控累计接入业务方数量达到200+,本文介绍的是服务端监控,我司还有其余类型的优良监控包含通用监控、调用链监控和客户端监控等。 1.1 监控零碎的根本流程无论是开源的监控零碎还是自研的监控零碎,整体流程都大同小异。 1)数据采集:能够包含JVM监控数据如GC次数,线程数量,老年代和新生代区域大小;系统监控数据如磁盘应用使用率,磁盘读写的吞吐量,网络的进口流量和入口流量,TCP连接数;业务监控数据如谬误日志,拜访日志,视频播放量,PV,UV等。 2)数据传输:将采集的数据以音讯模式或者 HTTP 协定的模式等上报给监控零碎。 3)数据存储:有应用 MySQL、Oracle 等 RDBMS 存储的,也有应用时序数据库OpenTSDB、InfluxDB 存储的,还有应用 HBase 间接存储的。 4)数据可视化:数据指标的图形化展现,能够是折线图,柱状图,饼图等。 5)监控告警:灵便的告警设置,以及反对邮件、短信、IM 等多种告诉通道。 1.2 如何标准的应用监控零碎在应用监控零碎之前,咱们须要理解监控对象的根本工作原理,例如JVM监控,咱们须要分明JVM的内存构造组成和常见的垃圾回收机制;其次须要确定如何去形容和定义监控对象的状态,例如监控某个业务性能的接口性能,能够监控该接口的申请量,耗时状况,谬误量等;在确定了如何监控对象的状态之后,须要定义正当的告警阈值和告警类型,当收到告警揭示时,帮忙开发人员及时发现故障;最初建设欠缺的故障解决体系,收到告警时迅速响应,及时处理线上故障。 二、vivo服务端监控零碎架构及演进之路在介绍vivo服务端监控零碎架构之前,先带大家理解一下OpenTSDB时序数据库,在理解之前阐明下为什么咱们会抉择OpenTSDB,起因有以下几点: 1) 监控数据采集指标在某一时间点具备惟一值,没有简单的构造及关系。 2)监控数据的指标具备随着工夫一直变动的特点。 3)基于HBase分布式、可伸缩的工夫序列数据库,存储层不须要过多投入精力,具备HBase的高吞吐,良好的伸缩性等特点。 4)开源,Java实现,并且提供基于HTTP的应用程序编程接口,问题排查快可批改。 2.1 OpenTSDB简介1)基于HBase的分布式的,可伸缩的工夫序列数据库,主要用途就是做监控零碎。譬如收集大规模集群(包含网络设备、操作系统、应用程序)的监控数据并进行存储和查问,反对秒级数据采集,反对永恒存储,能够做容量布局,并很容易地接入到现有的监控零碎里,OpenTSDB的零碎架构图如下: (来自官网文档) 存储结构单元为Data Point,即某个Metric在某个工夫点的数值。Data Point包含以下局部: Metric,监控指标名称;Tags,Metric的标签,用来标注相似机器名称等信息,包含TagKey和TagValue;Value,Metric对应的理论数值,整数或小数;Timestamp,工夫戳。外围存储两张表:tsdb和tsdb-uid。表tsdb用来存储监控数据,如下图: (图片出处:https://www.jianshu.com) Row Key为Metric+Timestamp的小时整点+TagKey+TagValue,取相应的字节映射组合起来;列族t下的Qualifier为Timestamp的小时整点余出的秒数,对应的值即为Value。 表tsdb-uid用来存储方才提到的字节映射,如下图: (图片出处:https://www.jianshu.com) 图中的“001”示意tagk=hots或者tagv=static,提供正反查问。 2)OpenTSDB应用策略阐明: 不应用OpenTSDB提供的rest接口,通过client与HBase直连;工程端禁用compact动作的Thrd线程;距离10秒获取Redis缓冲数据批量写入OpenTSDB。2.2 OpenTSDB在实践中须要关注的点1)精确性问题 String value = "0.51";float f = Float.parseFloat(value);int raw = Float.floatToRawIntBits(f);byte[] float_bytes = Bytes.fromInt(raw);int raw_back = Bytes.getInt(float_bytes, 0);double decode = Float.intBitsToFloat(raw_back);/** * 打印后果: * Parsed Float: 0.51 * Encode Raw: 1057132380 * Encode Bytes: 3F028F5C * Decode Raw: 1057132380 * Decoded Float: 0.5099999904632568 */System.out.println("Parsed Float: " + f);System.out.println("Encode Raw: " + raw);System.out.println("Encode Bytes: " + UniqueId.uidToString(float_bytes));System.out.println("Decode Raw: " + raw_back);System.out.println("Decoded Float: " + decode);如上代码,OpenTSDB在存储浮点型数据时,无奈知悉存储用意,在转化时会遇到精确性问题,即存储"0.51",取出为"0.5099999904632568"。 ...