DevOps专题 |监控,可观测性与数据存储
对于DevOps而言,监控是其中重要的一环,上一次的专题内容中,我们与大家分享了大型企业级监控系统的设计。今天我们将和大家从另一个角度进一步探讨互联网工程技术领域的监控设计(monitoring):系统的可观测性(observerbality)。
无论监控,还是可观测性,都是工程界的术语,并非严格定义的概念。人们可以描述它,但很难定义它。所以本文不会纠结于这些名词之间的区别。
在实践中,所有这些概念/术语,目标都是增强工程师对于线上系统运行情况的了解。
对工程师而言,监控/可观测性工程存在的意义,是帮助工程师发现问题,定位问题,解决问题。
对系统自身而言,这些工作都是通过数据的采集/存储/分析,以及进一步迭代来完成。
一、监控需求的产生
当程序被交付,部署到生产环境,才是其生命周期中最长的部分的开始。人们需要了解生产环境是否一切正常,监控需求自然而然产生。
互联网发展过程中涌现大量监控相关的工具/系统,Ganlia, Zabbix, RRDTools, Graphite,各自在不同的层面为“是否正常”提供答案。
监控本身,无论是业界对监控的认知,监控工具/系统自身的能力,也在以下两个方向演进着:
- 黑盒到白盒
- 资源到业务
这个阶段监控的愿景是很明确的,如何落地则各显神通。
直到 Etsy 于 2011 年通过博客公开了他们的 监控实践,利用 StatsD(已开源),以非常简单统一的方式,实现资源/业务层面的数据采集/存储/分析。后来的监控系统,尤其是基于 metrics 的监控系统,大多受过 StatsD 的启发和影响。
二、可观测性的提出
互联网工程界,Twitter 应该是最早提出可观测性 的组织。在这系列文章中,Twitter 集中阐述了他们的可观测性技术栈,其中包括了 Zipkin,Google Dapper 的开源实现。
如前言所说,本文不纠结于几个名词之间的包含关系。
抛开这些名词的辩论,可观测性相对于过去监控,最大的变化就是系统需要处理的数据,从 metrics 为主,扩展到了更广的领域。综合起来,大约有几类数据被看作是可观测性的支柱(pillar)
- metrics
- logging
- tracing
- events
因此,一个现代化的监控系统/可观测性工程系统,也就必须具备妥善存储以上几种数据的能力。
三、存储
Metrics
Metrics,通常是数值类型的时间序列数据。这类需求的存在如此广泛,以至于衍生了专门服务于这个目标的数据库子类,时间序列数据库,TSDB。
TSDB 经历了大约如下几个方面的重要演进
- 数据模型。描述信息从 metric naming 中剥离出来,形成 tag。现代的 tsdb 通常都已采用 tag 化的数据模型。
- 数据类型。从简单的数值记录,到为不同场景衍生出 gauge, counter, timer 等等更多的数据类型
- 索引结构。索引结构跟数据模型密切相关,在 tag 为主的现代 tsdb, 倒排索引已经是主流索引结构。
- 数据存储。从 rrdtool写环形队列到文件的时代,到 OpenTSDB 这样自行编解码写入底层数据库,再到 Facebook提出的时序数据压缩算法,通常会是若干种技术的综合使用,并且针对不同的数据类型采用不同方案
Metrics 存储,或者是 TSDB 的研究和演进,我们会有另外的文章专门介绍。
logging
logging 通常会是工程师定位生产环境问题最直接的手段。日志的处理大约在如下几个方面进行演进
- 集中存储/检索。使得工程师免于分别登陆机器查看日志之苦,日志被统一采集,集中存储于日志服务,并提供统一的检索服务。这个过程牵扯到例如日志格式统一,解析,结构化等等问题。
- 日志的监控。
- 原文中的关键字,例如 error, fatal 大概率意味着值得关注的错误产生
- 从日志中提取的 metrics,例如 access log 中携带的大量数据,都可以被提取成有用的信息。至于提取的手段,有的通过客户端在日志本地进行解析,有的在集中存储过程中进行解析。
tracing
随着互联网工程日渐复杂,尤其是微服务的风潮下,分布式 tracing 通常是理解系统,定位系统故障的最重要手段。
在存储层面,tracing 已经有相对明确的方案,无论是 OpenZipkin,还是 CNCF 的 Jaeger ,都提供几乎开箱即用的后端软件,其中当然包括存储。
Tracing 的存储设计主要考虑
1、稀疏数据:tracing 数据通常是稀疏的,这通常有几个原因
- 不同业务的 trace 路径通常不同,也就是 span 不同,因而稀疏
- 同种业务的 trace,在不同内外部条件下,路径也不同。例如访问数据库,是否命中缓存,都会产生不同的 span 链
- 访问正常/异常的 trace ,产生不同span
2、多维度查询:通常的解决思路
- 二级索引:在以 HBase, Cassandra 为基础的方案中比较常见
- 引入倒排索引,在二级索引方案无法满足全部查询请求时,可能会引入Elasticsearch 辅助索引,提升查询灵活性
Events
同样是一个难以定义,但是很容易描述的术语。我们把,一次部署,一次配置变更,一次dns 切换,诸如此类的变更,称为事件。
它们通常意味着生产环境的变更。而故障,通常因为不恰当的变更引起。
对 events 的处理主要包括
- 集中存储:事件种类很多,较难归纳共同的查询纬度,所以倒排索引在这种无法事先确定查询纬度的场景下,是非常合适的存储结构
- Dashboard:以恰当的方式,把事件查询 /展示出来。上文提到 Etsy 的博客中,展示了很好的实践方法,使得工程师能够通过 dashboard,非常轻松确认网站登陆失败,与登录模块部署事件之间的关系。
总结
现代的监控,或者可观测性工程,通常是对不同类型数据的采集/存储/分析。这些数据各有特点,因而存储也不存在银弹。通常是根据各自特点,独立设计存储方案,上层提供一个统一、综合的存储系统。
京东云监控具有实时展现监控数据变化及迅速报警等优势,能够满足日常业务监控管理和处理异常等场景。
目前京东云监控提供免费服务,点击【阅读】,了解更多关于京东云监控的内容。
欢迎点击“京东云”了解更多精彩内容
DevOps专题 |监控,可观测性与数据存储的更多相关文章
- 物联网架构成长之路(33)-EMQ数据存储到influxDB
一.前言 时隔一年半,技术变化特别快,学习也要跟上才行.以前写过EMQ数据转存问题,当时用了比较笨的方法,通过写插件的方式,把MQTT里面的数据发送到数据库进行存储.当时也是为了学习erlang和em ...
- DevOps专题 | 大型企业级监控系统设计
10月30日,全球权威数据调研机构IDC正式发布<IDCMarketScape: 中国DevOps云市场2019,厂商评估>报告.京东云凭借丰富的场景和实践能力,以及高质量的服务交付和平台 ...
- SpringBoot 2.0 + InfluxDB+ Sentinel 实时监控数据存储
前言 阿里巴巴提供的控制台只是用于演示 Sentinel 的基本能力和工作流程,并没有依赖生产环境中所必需的组件,比如持久化的后端数据库.可靠的配置中心等.目前 Sentinel 采用内存态的方式存储 ...
- 冰河,能不能讲讲如何实现MySQL数据存储的无限扩容?
写在前面 随着互联网的高速发展,企业中沉淀的数据也越来越多,这就对数据存储层的扩展性要求越来越高.当今互联网企业中,大部分企业使用的是MySQL来存储关系型数据.如何实现MySQL数据存储层的高度可扩 ...
- docker解决数据存储问题的方案
现在docker在云计算领域发展的势头很猛,各个公司不论大小都开始研究这个开源工具和技术,围绕docker的开源项目和创业公司也多如牛毛,就是一个简单管理container的web ui都有很多开源项 ...
- zabbix数据存储
一.zabbix数据库 zabbix-server将采集到的数据存储在数据库中,最常用的Mysql,数据存储的大小和每秒处理的数据量有关,数据存储取决于每秒处理的数据量和Housekeeper的删除数 ...
- Chrome浏览器扩展开发系列之八:Chrome扩展的数据存储
Google Chrome浏览器扩展可以使用如下任何一种存储机制: HTML5的localStorage API实现的本地存储(此处略) Google的chrome.storage.* API实现的浏 ...
- Hashtable数据存储结构-遍历规则,Hash类型的复杂度为啥都是O(1)-源码分析
Hashtable 是一个很常见的数据结构类型,前段时间阿里的面试官说只要搞懂了HashTable,hashMap,HashSet,treeMap,treeSet这几个数据结构,阿里的数据结构面试没问 ...
- Elasticsearch集群搭建及使用Java客户端对数据存储和查询
本次博文发两块,前部分是怎样搭建一个Elastic集群,后半部分是基于Java对数据进行写入和聚合统计. 一.Elastic集群搭建 1. 环境准备. 该集群环境基于VMware虚拟机.CentOS ...
随机推荐
- imagenet下载及训练
imagenet 种子 迅雷打开验证集http://academictorrents.com/download/5d6d0df7ed81efd49ca99ea4737e0ae5e3a5f2e5.tor ...
- L2d插件
<script src="https://blog-static.cnblogs.com/files/yyhh/L2Dwidget.min.js"></scrip ...
- 《从Lucene到Elasticsearch全文检索实战》的P184页
curl -XPOST "http://localhost:9200/_bulk?pretty" --data-binary @books.json 这句话在书中是以crul的命令 ...
- Nachos-Lab2-线程调度模块实现
源码获取 https://github.com/icoty/nachos-3.4-Lab 内容一:总体概述 本实习希望通过修改Nachos系统平台的底层源代码,达到"扩展调度算法" ...
- Tess4j/Tess4j 多线程调用 过程中报错问题记录 Invalid memory access
最近使用 Tess4j 做一些 OCR图片文字识别的代码. 然后想当然的将这个 ITesseract ocr_robot = new Tesseract(); 作为了工具类做成了成员变量. 当多线程调 ...
- 118-PHP调用带参数的成员方法
<?php class ren{ //定义人类 public function info($name,$age=3){ //定义有两个参数的成员方法 echo "我是{$name},年 ...
- jQuery获取display为none的隐藏元素的宽度和高度的解决方案
1.利用给元素添加行内样式:visibility:hidden;display:block 2.让隐藏元素变成有物理尺寸存在,但不可见,获取元素宽高 3.再给它还原成display为none,去除vi ...
- ActiveMQ消息队列和SignalR之日志实时监控及警报小实例
主要技术: log4net-生成日志. ActiveMQ-生成日志的时候发送消息,并实时监控日志. SignalR-将ActiveMQ监控的日志实时显示到浏览器上,而不用刷新浏览器. 小实例介绍: 左 ...
- 【CF1154G】Minimum Possible LCM
题意 给你 \(n\) 个数 \(a_i\) ,求出 \(\text{lcm}\) 最小的一对数. \(n\le 10^6, a_i\le 10^7\) 题解 直接枚举 ,找到当前数最小的两个倍数,统 ...
- HDU 1542 线段树离散化+扫描线 平面面积计算
也是很久之前的题目,一直没做 做完之后觉得基本的离散化和扫描线还是不难的,由于本题要离散x点的坐标,最后要计算被覆盖的x轴上的长度,所以不能用普通的建树法,建树建到r-l==1的时候就停止,表示某段而 ...