对于DevOps来说,监控是其中重要的一环。在上期专题中,我们与大家分享了一个大型企业级监控系统的设计。今天我们将从另一个角度进一步讨论互联网工程技术领域的监控设计(monitoring):系统的可观察性(observerbality)。监控和可观察性都是工程界的术语,并不是严格定义的概念。人们可以描述它,但很难定义它。所以本文不会详述这些名词的区别。实际上,所有这些概念/术语的目的都是为了增强工程师对在线系统操作的理解。对于工程师来说,监控/可观测性工程的意义在于帮助工程师发现问题、定位问题、解决问题。对于系统本身来说,这些任务是通过数据的收集/存储/分析,以及进一步的迭代来完成的。1.监控需求的产生当程序交付并部署到生产环境时,是其生命周期最长部分的开始。人们需要知道生产环境一切顺利,监控的需求自然而然就来了。在互联网的发展过程中,出现了大量与监控相关的工具/系统。Ganlia、Zabbix、RRDTools和Graphite都在不同的层面上提供了“是否正常”的答案。监控本身,无论是行业对监控的认知,还是监控工具/系统的能力,也在向以下两个方向演进:从黑盒到白盒资源再到业务这个阶段监控的愿景非常清晰,如何落实到位,就各显神通。直到2011年Etsy通过博客公开了他们的监控实践,他们使用StatsD(开源)以非常简单和统一的方式实现了资源/业务层面的数据收集/存储/分析。后来的监控系统,尤其是那些基于指标的监控系统,大多受到StatsD的启发和影响。2.可观察性的提出在互联网工程界,推特应该是第一个提出可观察性的组织。在本系列文章中,Twitter重点介绍了他们的可观察性堆栈,其中包括Google的Dapper开源实现Zipkin。如前言所述,本文不详述几个名词之间的包含关系。抛开这些术语的争论不谈,可观察性与过去监控相比最大的变化是系统需要处理的数据,从指标扩展到更广泛的领域。综上所述,几类数据被视为可观察性(pillar)指标记录跟踪事件的支柱,因此现代监控系统/可观察性工程系统也必须具备妥善存储上述几类数据的能力。3.StoreMetricsMetrics,通常是数值型的时间序列数据。这种需求的存在是如此广泛,以至于衍生出数据库的一个子类,时间序列数据库,TSDB来服务于此目的。TSDB在以下几个方面经历了重要的演变:数据模型。描述信息从metric命名中剥离出来形成一个tag。现代tsdbs通常有一个标记数据模型。数据类型。从简单的数值记录,到针对不同场景衍生出更多数据类型的索引结构,如gauge、counter、timer等。索引结构与数据模型密切相关。在基于标签的现代tsdb中,倒排索引已经是主流的索引结构。数据存储。从rrdtool时代写环形队列到文件,到OpenTSDB自编解码到底层数据库,再到Facebook提出的时序数据压缩算法,通常是几种技术的综合运用,不同的方案是适用于不同的数据类型。Metrics存储,或者说TSDB的研究和演进,我们会有另一篇文章专门介绍。日志记录通常是工程师定位生产环境问题最直接的手段。日志处理在以下几个方面发展:集中存储/检索。免去了工程师登录机器单独查看日志的痛苦。日志集中收集,存储在日志服务中,并提供统一的检索服务。这个过程涉及统一日志格式、解析、结构化等问题。日志监控。原文中的关键字error、fatal等,大概率会引起错误,值得关注。从日志中提取的指标,例如访问日志中携带的大量数据,可以提取成有用的信息。至于提取方式,有的日志是通过客户端在本地解析,有的是在集中存储过程中解析。Tracing随着互联网工程越来越复杂,尤其是在微服务趋势下,分布式Tracing通常是了解系统、定位系统故障的最重要手段。在存储层面,已经有了比较明确的溯源方案。无论是OpenZipkin还是CNCF的Jaeger,它们都提供了几乎开箱即用的后端软件,其中当然包括存储。Tracing的存储设计主要考虑1.稀疏数据:Tracing数据通常是稀疏的。这通常有几个原因。不同业务的Trace路径通常是不同的,即跨度不同。因此,在不同的内部和外部条件下,同一业务的痕迹是稀疏的。其次,路径也不一样。比如访问数据库,不管是否命中缓存,都会产生不同的跨度链。访问正常/异常轨迹会产生不同的跨度。2.多维查询:通常的解决方案。倒排索引,当二级索引方案不能满足所有的查询请求时,可能会引入Elasticsearch辅助索引来提高查询的灵活性事件也是一个很难定义但很容易描述的术语。我们将部署、配置更改、dns切换和其他此类更改称为事件。它们通常表示对生产环境的更改。失败通常是由不适当的更改引起的。事件的处理主要包括集中存储:事件种类繁多,常见的查询纬度很难归纳,所以倒排索引在这种无法提前确定查询纬度的场景下是一种非常合适的存储结构。仪表板:以适当的方式,查询/显示事件。上面提到的Etsy博客展示了一个很好的实用方法,使工程师可以通过仪表板轻松确认网站登录失败与登录模块部署事件之间的关系。概括现代监控,或者说可观测性工程,通常就是对不同类型数据的采集/存储/分析。这些数据各有特点,存储没有灵丹妙药。通常,存储方案是根据各自的特点独立设计,上层提供统一、完善的存储系统。
