01 以史鉴今:监控是如何一步步发展而来的? 你好,我是翁一磊。

这几年有一个新兴的概念在云计算时代下发展起来了,叫做可观测性。Gartner 在今年(2022 年度)的基础设施和运维自动化技术成熟度周期图里,把“可观测性”放在膨胀期波峰最顶端位置,可以说是风头正盛。

图片

可观测性其实并不是一个新概念,它的英文是Observability,这个词是由工程师鲁道夫·卡尔曼提出的。他在自己1960年的论文中,用可观测性来描述数学领域的控制系统。可观测性被定义为一种度量方法,这是控制论的一部分,可观测性意味着从系统向外部输出的信息可以推断出系统内部状态的好坏。

在这个概念进入到计算机软件领域前,我们其实是通过监控这种方式去保障系统整体的稳定性的。可观测性和监控并不是一回事,但二者也有着联系,所以在我们正式进入可观测性的讲述之前,先来一起看看计算机和监控软件的发展史。

单机电脑时代

最早的电脑大部分是单机运行的,还没有网络的概念。那个时候在操作系统层面就有很多的工具软件可以供我们观测操作系统的运行状态。

对于 Windows 用户来说,最著名的工具就是任务管理器了,而 Linux 也有一堆类似 Top、PS 的命令帮助我们知道操作系统的运行状态。一部分应用为了进一步方便我们排查问题,设计出了日志,它可以输出文本展示应用的运行情况。如 Windows 的事件关联,Linux 的 syslog等。这个时期,我们是通过操作系统和应用本身的一些功能来了解并掌控系统的。

局域网时代

随着时代的进步,计算机在 20 世纪 90 年代进入了局域网时代,出现了C/S架构(Client/Server),服务器出现了。服务器,顾名思义就是服务别人的机器。客户端通过与该服务器进行数据交互来实现各种业务需求,这样,客户端之间就通过服务器协同起来了。

图片

随后,开始出现早期的分布式系统。

最早,分布式系统的诉求是高可用。因为一旦服务器出现故障,客户端就无法正常工作了。接下来人们发现可以让不同的服务器处理不同的客户端请求,降低故障出现的频率。随着连接的客户端增多,业务越来越复杂性,“集群”的概念出现了。当时人们将服务器放在一起,通过交换机、路由器等网络设备串联起来。随着需要管理的服务器变多,人们不可能随时登录到每一台服务器上面去巡检系统的状态,这时候监控需求就变化了。

这一时期,网络监控工具开始出现,包括nmon、MTRG 以及 Big Brother 等等。这些工具大多都基于 SNMP 协议构建,可以跟踪网络硬件和资源的性能,还可以监控多个物理通信接口的运行状况和性能,同时提供系统多用户的活动和流量数据。

互联网时代

时间不停歇,技术不断发展,互联网出现之后,统一客户端产品的浏览器(最初来自于Netscape 网景)也问世了。这之后,我们有了一种统一的内容展示形态——Web。Web利用了 HTML 语言,而浏览器恰恰就是 HTML 语言解析器,它将文本变成了可视化的网页,而网景提供的编程语言 JavaScript 又实现了静态文本协议的动态化。

紧随着这些技术出现了一个概念叫B/S(Browser/Server,浏览器/服务器),意思是浏览器作为统一的客户端与服务器进行交互。由于互联网的兴起和越来越多用户的接入,出现了大量基于Web 技术的网站。网站一端放在服务器上,另一端通过浏览器获取服务器提供的服务。

图片

当时如果人们要创建自己的网站,需要将个人电脑接入互联网,不过,通常只有具备互联网地址的大学才方便操作。但后来,电信运营商提供了一种统一将服务器接入互联网的方式——IDC(互联网数据中心)。与之相对的,传统企业自己建设机房,大规模存放服务器,并用专线连接各个办公室,这种被称为数据中心。

数据中心最初的用户都是国家、银行、电信公司等,他们主要是为了满足机构内部的业务需求。后来,互联网公司将应用服务通过互联网提供给了全世界。互联网上的服务器变得越来越多,系统也变得越来越复杂,有些公司如网景开始提供类似网站托管服务,让用户可以快速拥有一个网站,而不再需要到 IDC 托管服务器了(这也是云计算的前身)。

然而,到21世纪初,越来越明显的是,网站和基于互联网的服务与典型的办公室局域网的监控需求不同。这开始促成了新一批监控工具的出现,例如 Cacti,Nagios和Zabbix。这些工具支持标准的 Internet 协议,可以在多个平台上使用,通常具有相当可扩展性,并且通常具有基于Web的界面。

Zabbix使用了C/S架构,它将操作系统中可被观测的数据收集起来统一查看,包括根据收集的数据对阈值(即某个值大于或者小于一定的值)进行告警。但由于 Zabbix 诞生的年代计算机性能并不强,能收集的系统数据很少,收集的数据也不完整,所以Zabbix 的数据收集颗粒度就比较粗。并且由于性能原因,日志数据通常也是经过客户端(Zabbix agent)判断后(比如日志关键字中包含某些内容),再作为信号传输到 Zabbix 的服务器端。

因此,Zabbix 作为一个简单、开源的监控软件,普及率很高,直到今天仍然有大量用户。但它本身也有很大局限,例如只能采集系统固有的简单可观测性指标,还有通过脚本方式处理信号的模式。

在 Zabbix 开始流行时,也出现了一些同类型的软件,但是它们的处理能力不同,有些侧重于网络,有些侧重于特种软件(如数据库专门的监控软件)。与此同时,另一个产品 Splunk 悄然问世了。Splunk的目的是将日志数据从集群中收集过来,最终统一处理统一分析。这样的话,数据量就非常大了。Splunk 有着特殊的存储结构和算法,相较于 Zabbix ,它能够更加完整地收集和分析处理这些海量数据,所以人们也常把 Splunk 当作一种数据库对待。

然而,这些工具通常仍然专注于功能和性能指标,并强调服务器和通信硬件以及相关问题。它们扩展了旧网络监控工具的覆盖范围,但它们保留了这些工具的大部分基本性质。21世纪的第一个十年将看到对一种新型监测工具的需求日益增长。

移动互联网时代

这个时候出现了一个伟大的公司:Google。谷歌以爬虫(也是客户端)的方式去扫描整个互联网网站,对其内容进行索引,然后让人们可以通过搜索引擎快速找到自己想访问的内容。

同一时刻,大量的互联网应用诞生,包括即时通讯、小说网站、互联网游戏等等。在这期间,有一个叫 Shay Banon 的程序员为了帮助妻子更快地搜索菜谱,创造了 Elasticsearch(一个搜索引擎技术,简称 Es),并为此成立了 Elastic 公司。

只不过 Elastic 公司并没有选择去做下一个 Google,它选择与 Splunk 成为了对手,推出了 ELK 方案(包括 ElasticSearch、Logstash和Kibana)。ELK方案和 Splunk 一样,都负责收集和管理海量的日志数据。

技术发展到这个阶段,海量日志的处理已经变得有可能了,ELK 作为开源软件成为了非常流行的选择,当然,Splunk 也不甘示弱,作为商业软件快速发展。这两者都被视为基于日志的监控高效解决方案。

大规模的互联网应用又催生了 CDN 技术,CDN 技术会将用户访问的内容以缓存方式存储在不同物理位置的服务器上,提高用户的访问速度。与此同时,一种新的监控方式开始出现,那就是拨测。它指的是网站或者互联网服务的提供者,为了确保自己的网站或服务是在线正常提供服务的,会模拟自己是客户端去访问自己的网站或服务,以确保网站没有异常,他们还可以分析网站在不同区域的访问加速情况,以确认 CDN 是否在正常工作。

2007 年,苹果发布了 iPhone,这个产品的诞生彻底改变和加速了互联网的发展。Google 也针锋相对地推出了 Android 。无线通讯技术的高速发展,人类快速进入了移动互联网时代。

移动互联网带来了两个改变。第一个,由于乔布斯追求极致的体验,加上当时移动设备的计算能力,应用软件(Apps)这种移动操作系统上的客户端悄然出现(我们用Program代指 PC 上的应用,用 App 来指代移动端的应用);而另一个改变更加巨大,全球大量的设备接入了互联网,带来了大量的用户和访问。

为了管理海量的服务器,VMware 最早推出了虚拟化的方案。这个方案一开始只是想要让个人电脑适配不同的操作系统,到后来发展为将一个物理服务器集群以软件分割的方式来创建更多的虚拟机(Virtual Machine,简称 VM),以此提升服务器的利用率。2006年,亚马逊利用这项技术悄然推出了一个互联网服务 AWS(Amazon Web Service),最初是利用亚马逊的闲置服务器提供网站的大规模托管服务,而今天这个服务已经家喻户晓了,那就是云计算。

随之,游戏变成了互联网游戏,有了互联网的视频网站,有了全国甚至全球性质的电商、打车、外卖等互联网服务,企业级软件也开始以 PaaS、SaaS 的方式,通过互联网加浏览器或者移动客户端的方式提供服务了。

而为了满足互联网的各种各样的服务,以及移动设备带来的不同的应用形态,大量的新形态的数据库、消息队列、中间件被创造出来了,包括 NoSQL,其实就是一系列满足特定场景需要的数据库,而单一的关系型数据已经不能满足客户的需求了(数据库历史也很长,就不展开了)。

海量的用户必然意味着庞大的数据量,为了分析这些数据,大数据这个概念也诞生了。为了顺应时代潮流,满足用户对于服务越来越高的要求,互联网公司的开发测试环节变得越来越敏捷,DevOps 出现了。尤其最近几年,为了让应用更敏捷,更方便管理,容器技术和为了适应容器技术的云原生概念出现了(云原生是基于容器编排框架 Kubernetes 构建的生态软件的统称)。

这个时候,人们为了进一步提升应用性能,提出了一个 APM 的概念(Application Performance Monitering),它旨在将服务端和客户端的代码执行情况统一地收集起来,不仅仅是解决故障的问题,更为了提升应用的性能。很多厂商推出了相应的 APM 服务。但这也带来了一个问题,一个复杂的互联网的 IT 服务需要全面被监测起来才能完整地掌控这套系统,因此我们需要大量的监控类产品,从基础设施、云、云原生、数据库、中间件、大数据、拨测到安全。

需要监测的对象从原先的服务器,变成虚拟机,又变成现在的容器。同时我们需要监测更多的数据库中间件、AWS 云服务,甚至部署在不同云平台上的应用,传统的 Zabbix 已经无法承担这么多的监控任务。

为了解决这些数据观测问题,开源世界出现了基于时序数据库的监控软件,如Prometheus、Telegraf + InfluxDB 等,APM 则出现了 ZipKin、Jaeger、Pinpoint、Skywalking 这些软件。然而,如果我们要完整地“观测”一个互联网系统,还是需要将各种形态的开源监控产品组合起来使用。

在商业世界里,大家都在往这个方向靠拢:

  • DataDog 作为 SaaS 化的全方位的可观测监控服务横空出世,目前已是全球市值最高的 IT 监控管理类厂商;
  • ELK 也不再仅仅是一个日志平台,还推出了 ELK APM 等功能;
  • Splunk 也不想停留在单纯处理日志的阶段,因此它收购了 DataDog 的主要竞争对手 SignalFX;
  • 而 New Relic、Dynatrace、AppDynamic 也不再将自己定位成单一的 APM 厂商,而是会进一步提供完整的可观测能力。

OpenTelemetry 这个组织的出现标志着业界意识的产生,也就是,我们需要将系统的可观测性变成一种统一的标准和规范。OpenTelemetry 致力于推动更多的应用和服务遵循这一规范,同时也会提供相应的可观测性能力。在专栏的第四讲,我们还会对它进行更详细的讲解。

总结

刚才,我们几乎是把整个计算机监控和可观测性的发展史粗略地讲了一遍。这里我再总结一下。

  • 在单机电脑时代,Windows系统的任务管理器,Linux的Top、PS 的命令帮助我们随时了解操作系统的运行状态。这时候,监控数据是存放在单机里的。
  • 局域网时代,为了应对分布式系统和日益复杂的“集群”,像nmon、MTRG、Big Brother 这样的监控工具开始出现,从这里开始,我们就可以监控网络系统了。
  • 互联网时代,网站、基于互联网的服务以及数据中心的发展带来了新的监控需求,新一代监控工具被开发出来。Zabbix 是其中的代表,它在基础设施的监控方面比较全面。
  • 移动互联网时代,随着应用系统的架构越来越复杂,在监控工具的基础上,日志分析、应用性能监控 APM 等产品也逐渐发展起来。

你可以看到,特定产品的发展和计算机本身以及互联网的发展其实是密不可分的。

但是“可观测性”的具体内涵是什么?它跟监控又有什么实质性的差别?下节课我们会逐一分析。

思考题

在这节课的最后,留给你一道思考题。

你在平时工作中使用过哪些监控工具,这些工具哪些地方好用,哪些地方需要改善?

欢迎你在留言区和我交流讨论,我们下节课见!

参考资料

https://learn.lianglianglee.com/%e4%b8%93%e6%a0%8f/%e6%b7%b1%e5%85%a5%e6%b5%85%e5%87%ba%e5%8f%af%e8%a7%82%e6%b5%8b%e6%80%a7/01%20%e4%bb%a5%e5%8f%b2%e9%89%b4%e4%bb%8a%ef%bc%9a%e7%9b%91%e6%8e%a7%e6%98%af%e5%a6%82%e4%bd%95%e4%b8%80%e6%ad%a5%e6%ad%a5%e5%8f%91%e5%b1%95%e8%80%8c%e6%9d%a5%e7%9a%84%ef%bc%9f.md