经历
记得14年的时候我在公司负责支付资金对账系统,整体逻辑类似定时跑批比对,如果数据对账成功要通知支付系统,如果发现差错账后要进行告警
由于整个系统在拉取数据时存在多种方式与各种不可靠情况,比如第三方的对账数据没有在约定时间内放置,数据拉取失败,数据放置错误。还有数据中各种长短账的情况处理,状态与异常情况比较多
由于那时候公司也没有监控系统,所以那时候为了方便排查问题,自己做了一个
不过现在看来那时候的监控手段还是比较挫的,不过当时不想天天因为排查问题而浪费一上午时间的我能做出这么一个东西也是很有意义的,哈哈
整体设计
为了不影响线上的对账程序,在后台上开发了这个功能,其实这也是现在监控系统设计的要素之一,就是绝对不能影响核心业务系统的运行
开发了一个页面,上面在页面加载的时候会去将各种异常与正常的情况通过SQL去查询数据库,然后将数据统计结果显示在页面上,因为是定时任务,所以为了方便修复数据,在每个统计点都提供了一个按钮可以重新调度定时任务执行一次
这个按钮就是一个数据修复的能力了,所以准确说这不止是个监控系统,还是个灰度控制系统
整个系统起名叫:上帝模式(当时同事听说这个名字后,都为之称赞~)
这个系统在初期帮了我很大的忙,每次排查问题,先看这个界面,上面数字对不上的我都会去确认,一个不漏,非常方便排查问题,而且如果排查完问题,就要重新对某个环节重新执行,只要点一下那个环节的按钮就可以了,so easy!
不过之后就发现这个页面要很久才能打开,因为上面执行了太多的SQL,而且越来越慢,这些SQL查询有些字段需要优化:限制时间范围、增加索引 于是又可以继续使用了
反思
可以说这是一个简单的看板系统,就是通过SQL语句查询数据库,然后判断异常的数据显示而已,但是足够当时的检查数据的需求
真实的监控系统是可以告警,处理业务执行中的数据的,比如打点与异常的监视,不依赖业务方数据库存储的
所以真实的监控系统都是采用业务逻辑层主动发送监控数据到监控系统中的,而不是像我这种设计思路,通过扫描存储的数据来监控
- 业务存储的数据只为了业务场景而优化查询,而监控可能是有多维度的需求,不适合在业务库中加索引优化
- 直接在业务库中查询也会影响真实业务使用,顶多查下从库
- 如果业务改变了表结构,监控的逻辑也要跟着改
- 业务数据中很多监控的数据不会存储,而监控需要的数据也只是业务字段的一部分
可能最重要的还是第4点,业务落地的数据并不能满足监控需要的数据,比如调用异常,不落地的数据,存储在redis缓存中的业务场景,所以监控系统还是不要基于业务表进行监控
基于表的数据分析其实是BI(数据智能)他们的方式,他们其实解决了前3个问题,通过大数据中的Hadoop、HDFS、Hbase、Hive、离线数据分析等技术通过ETL(抽取、过滤、清洗)把业务表变为BI表数据用于统计分析,毕竟落地的数据才是有价值的业务数据
而监控关注的是产生这些业务数据的过程,业务逻辑调用过程中的问题,所以要通过业务逻辑层植入监控的逻辑
监控系统
现在监控通过业务监控指标日志打印、日志采集、消息系统、日志信息入库、日志加工分析存储这样的方式