最近在团队中给大家做了一个分享,泛泛地聊了一些有关「监控」的话题。
其实做分享对分享者的作用往往大于参与者。
这是一次将自己知识的梳理的过程,于是我将这次分享整理成这篇文章。

201706/stock-exchange.png

目的 ?

我们先来聊聊,什么是「监控」,以及我们期望通过「监控」完成哪些目的?

传统意义上的监控,是指:

通过一些手段和工具,关注运行中的硬件、软件、用户体验的关键数据,将其暴露出来。
当关键数据出现异常时候发出警告,进行人工或者自动的响应。

我们平时看到的最常见的监控系统,比如 Zabbix,提供了丰富的模板,
可以监控服务器的 Load / CPU Usage / Alive 这些常规指标。
并在出现问题时候,对其进行报警通知。
随后运维工程师们会上线进行应急操作,case by case 的处理故障。

我将上面的使用目的归纳为:

  • 故障发生时提供数据报警
  • 提供历史数据以供分析

故事到这里似乎可以结束了,可监控真的是这么简单的么?
当然没,随着时代的进步,用户对服务提出了更为严苛的要求,
同时我们也有能力进一步控制平均故障修复时间
(MTBF),
上述描述的做法已经不能满足我们了。

现在让我们切换一下视角,从传统的 OPS 的视角切换到 SRE
(Site Reliability Engineering)的视角。
当我们在关注网站整体的可用性时,我们会发现:
故障警报处理当然很重要,但是我们根本上想减少甚至避免 MTBF。
我们有两种手段:
一种是去除单点故障,让问题自然发生,但是不对线上造成影响;
另一种是在问题出现的早期就发现并进行及时修复。
前者是高可用范畴,后者就是我们今天关注的「监控」了。

监控的目的是要将灾难消灭在襁褓里;在灾难即将出现或者发生问题时,
给大家展示直接的原因

那为了达成这两个目标,我们需要回到问题的本质,重新思考两个问题:

  1. 监控哪些对象?
  2. 如何识别故障?

对象 ??

我们说的监控对象,一般指的都是某个资源,
资源即持有某种其他方需要的某些属性的载体,包括硬件、软件。
除了资源这种类型,还有一种常见的监控对象是「体验」,即终端用户的访问感受,
这块内容我们暂时略去。

让我们来先看一下常见的资源:

  • 硬件

    • 服务器
    • 网络设备
  • 软件
    • Application
    • Infrastructure

这个分类是粗粒度的描述,为了落地地描述监控对象对象的健康状况,
我们还要进一步细化。以「服务器」为例,我们可以将其监控的内容细化为以下监控项:

  • CPU
  • Memory
  • Network interface
  • Storage devices
  • Controllers

如何评估这些监控项的健康状况?我们使用
SLI(Service Level Indicator)。
比如可用性就是一个最容易理解的 SLI。
这里我将资源归为两类,面向用户提供服务的资源和面向存储的资源,
以下是针对这两类资源的常见 SLI:

  • User-facing Service

    • Availability
    • Latency
    • Throughput
  • Storage System
    • Latency
    • Throughput
    • durability

基于 SLI 建立的数字关键指标,称之为
Service Level Objective。
SLO 往往是一组数字范围,比如 CPU 负载的 SLO 可以设置为 0.0-6.0(针对 8 核 CPU)。
不同的资源、不同的业务场景,会有不一样的 SLO 设计。

看到这里,我们已经聊了要监控哪些指标,那么接下来我们聊聊如何用量化的思想,
帮助指标更易于识别、分析和决策。

量化的思想 ?

刚开始担任线上救火队成员时候,当有个系统出现问题时候,我经常听到这样的描述:
网站挂了、页面打不开了,CPU 出问题了,内存爆了,线程池炸了等等。
这样的表述虽然没错,但带来的可用价值太少,信息熵太低。
这样的说辞多了,就给人产生一种不靠谱,不科学的感觉。

那怎样才能成为科学的描述?
古希腊哲学家在思考宇宙的时候,提出了一种心智能力,
从而打开了科学的窗子,这就是 Reasonable,中文名叫理智,这成为了自然科学的基石。
使用 Reasonable 探讨意味着探讨要深入问题的本质,不停留在表象,挖掘出真正有价值的内容。

但是光有 Reasonable 还不够,B站粉丝建了一个微博,每天会检查
今天B站炸了吗,
他只能告诉我们炸没炸,不能给工程师带来实际的用处。
在科学的发展历史上,我们可以发现在亚里士多德的著作里没有任何数据公式。
他对现象只有描述,只是定性分析,通过描述性状来阐述定理。
这个定性的研究方式到了伽利略那里才出现了突破。
这里我们可以引入第二个关键词是 Quantifier,量化。
伽利略率先使用定量分析的方法,并将其运用到动力学和天文学,从而开创了近代科学。

如果我们以定量的方式来描述网站挂没挂,就会变成:网站的响应耗时在 30s,基本无法使用。
描述线程池出问题,就会变成:active 线程数量是 200,已经到达 maxCount 数量,无法进行分配。
你看,通过这样的描述,我们一下子就能发现问题出在哪里。

USE ?

现在我们已经了解了「监控哪些对象?」,以及尝试用「量化」这个法宝来「识别故障」。
那有没有一些最佳实践帮助大家高效的识别故障呢?这里我推荐 Brend Gregg 大神的 USE 方法。
Brend Gregg 是 Netflix 的首席 SRE,著有 Systems Performance Book,
目前已经出版中文版 性能之巅:洞悉系统、企业与云计算。

USE 分别是三个单词的首字母缩写:

  • Utilization:使用率,CPU running percent,硬盘的 IO
  • Saturation:饱和度,一般偏存储型资源,内存使用,硬盘使用
  • Error:错误数

我们可以为每个资源找到各自的 USE 度量指标,具体的 Check List 清单可以参考
USE Method: Rosetta Stone of Performance Checklists。

这里举个例子,前段时间在设计 MySQL HA 方案时候,同时关注了 MySQL 的监控方案,
那么针对 MySQL,我们要做哪些监控呢?下面是使用 USE 方法设计出来的 SLI:

  • Business

    • Questions:语句计总,Throughput
    • Slow_queries:慢查询计总,Error
    • Com_select:查询语句计总,Throughput
    • Com_insert:插入语句计总,Throughput
    • Com_update:更新语句计总,Throughput
  • Threads & Connections
    • Threads_connected:当前连接数,Utilization
    • Threads_running:当前使用中连接数,Utilization
    • Aborted_connects:尝试连接失败数,Error
    • Connection_errors_max_connections:由于连接数超标从而失败的连接数,Error
  • Buffer
    • Innodb_buffer_pool_pages_total:内存使用页数,Utilization
    • Innodb_buffer_pool_read_requests:读请求数计总,Utilization

完 ?

如果你对我上面描述的还意犹未尽,建议你可以看 Effective Monitoring and Alerting。
虽然本书没有中文版,但是关于监控、报警的原理解析很到位,值得一看。
另外还有一本 SRE: Google运维解密,
里面有不少篇幅在讲「SLA」,也是和监控、报警息息相关的。

这次讲了一些概念性的内容,期望对大家有帮助,下一次我再分享一篇文章,聊聊 Metrics。


原文链接: blog.alswl.com/2017/06/mon…
欢迎关注我的微信公众号:窥豹

3a1ff193cee606bd1e2ea554a16353ee

当我们在聊监控,我们在聊什么?相关推荐

  1. 户外私密Party| 在大峡谷中聊点平时不能聊的产品干货(报名结束)

    Hi 咖友们: 在冰天雪地的深山美景里聊一点平时不能聊的私密干货. 在大峡谷里赏着美景涮着火锅和产品大神聊聊什么是真正的产品. 这可能是产品圈有史以来最有趣的一次私密趴体,体验一次,永生难忘! 所有参 ...

  2. 户外私密Party | 在大峡谷里聊一点平时不能聊的干货(报名ing...)

    这可能是产品圈有史以来最有趣又有料的一次私密Party: 安全保障,专业户外领队导游,沿途一路保护您: 神秘产品大神同行,严格筛选参与者,禁止录音和笔记: 单身汉福利,妹纸们听说这活动就兴奋的不要不要 ...

  3. vue+websokect实现实时聊天,可单聊、可群聊(一)

    效果图 效果网站链接,安全性不符合实际上线使用,仅供学习交流 https://livequeen.top 效果小程序二维码 (需现在web端获取账号)          思路 一个实时聊天功能 第一, ...

  4. 【ReactJs+springBoot项目——租房】第6章:MongoDB入门+SpringBoot整合MongoDB+搭建微聊系统+实现微聊功能

    MongoDB入门 MongoDB的java api的使用 SpringBoot整合MongoDB使用 搭建微聊系统 实现微聊功能 分布式WebSocket解决方案分析 1.MongoDB入门 1.1 ...

  5. smack+openfire创建IM群聊、加入群聊、发送消息、退出群聊(openfire学习记录二)...

    第一步: 在pom.xml文件中,引入依赖项 <dependency><groupId>org.igniterealtime.smack</groupId>< ...

  6. html群聊插件,团队群聊.html

     团队群聊 $axure.utils.getTransparentGifPath = function() { return 'resources/images/transparent.gif'; ...

  7. LYNC2013部署系列PART4:群聊部署

    前言:本篇文章将介绍LYNC2013群聊服务器的部署,在LYNC2010中,群聊服务还没集成到LYNC2010产品中,需要单独额外部署,群聊客户端也没有集成到LYNC2010客户端中.到LYNC201 ...

  8. 一套高可用、易伸缩、高并发的IM群聊、单聊架构方案设计实践

    本文原题为"一套高可用群聊消息系统实现",由作者"于雨氏"授权即时通讯网整理和发布,内容有些许改动,作者博客地址:alexstocks.github.io.应作 ...

  9. 面试官:群聊消息的已读未读功能,你来设计一个?

    欢迎关注方志朋的博客,回复"666"获面试宝典 一朋友和我讨论他前段时间面试某大公司的一题目 : 企业IM比如企业微信.钉钉里面的群消息的有个已读未读的功能,发送者刚发出消息时,当 ...

最新文章

  1. 在温系统下制作马克系统引导安装镜像启动U盘安装马克OS
  2. 互联网企业烧钱抢占公交Wi-Fi市场
  3. 坡道行驶电动小车_事发红绿灯路口!东莞一女子骑电动滑板车被撞致颅内出血…...
  4. python 编码文件json.loads json.dumps
  5. 获取另一个驱动的设备结构体_字符设备驱动的另一种写法
  6. mongodb 如何更改端口号_Centos7配置MongoDB以及端口修改
  7. Javascript的防抖和节流、VUE的防抖和节流
  8. C语言中malloc,calloc,realloc,free的语法与作用
  9. 人脸库对比(百度人脸识别)(Java版)
  10. phpcms手机端去掉index.php,如何取消phpcms v9手机门户中文章详情页模板中内容被自动分页...
  11. 怎样更改itunes备份位置_什么是iTunes备份文件?
  12. ArcGIS技巧】下载偏移影像后纠偏操作
  13. 生成带参数微信公众号二维码
  14. 自定义ActionBar -- 更换返回键图标
  15. 电脑没有串口怎么办?
  16. ncbi查找目的基因序列_如何获得基因序列——在NCBI中查找目的基因实例.PDF
  17. android 横屏竖屏设置,Android中强制设置横屏与竖屏,与横竖屏生命周期的设置
  18. linux中常见中英文单词对照表
  19. 【论文翻译】EIDETIC 3D LSTM: A MODEL FOR VIDEO PREDICTION AND BEYOND
  20. 时间复杂度(算法的渐进时间复杂度)

热门文章

  1. matlab 判断元素索引_matlab – 获取矩阵中n个最大元素的索引
  2. P2597 [ZJOI2012]灾难(倍增LCA+拓扑排序)
  3. Tomcat+nginx+keepalived+memcached实现双VIP负载均衡及Session会话保持
  4. Asp.net操作数据库方法
  5. Copy List with Random Pointer
  6. 解决 Microsoft Excel has stopped working
  7. hadoop高速扫盲帖,从零了解hadoop
  8. [转] 移动平台Html5的viewport使用经验
  9. c#中控件重绘(放大缩小移动隐藏恢复后不消失)实例
  10. mysql环境安装与配置