前言¶
计算机系统监控与可观测性发展史¶
目前有一个新兴的概念在云计算时代下发展起来了,叫做可观测性,英文是 “observability”,其实这个说法是来自于控制论(Cybernetics),控制论是起源于 1948 年诺伯特·维纳 Nobert Wiener 发明的著作《控制论-关于动物和机器中控制和通讯的科学》,控制理论中的可观测性(observability)是指系统可以由其外部输出推断其内部状态的程度。系统的可观测性和可控制性是数学上对偶的概念。可观测性最早是匈牙利裔工程师鲁道夫·卡尔曼针对线性动态系统提出的概念。若以信号流图来看,若所有的内部状态都可以输出到输出信号,此系统即有可观测性。
这并不是一个新的概念,在这个概念进入到计算机软件领域前,我们其实是通过监控这种方式去保障整体系统的稳定性,似乎计算机领域也很少有人提及可观测性。其实这里是存在一个误区的,因为如果我们要完成对一个计算机系统的监控,那么监控的就是计算机所产生的数据,而监控前提是被监控对象要能够产生可被观测的指标等数据,如果指标或者数据少,即我们可观测的数据少,那么监控带来的价值和意义就会变得少,根据控制论的对偶性概念,也就意味着我们能够控制这个系统的能力也较差。比如,我们仅仅能监控到一台服务器是否正常,那么只能判断这台服务器的状态,完全无法观察到上面的操作系统的状态,如果我们监控了操作系统的指标,那么我们仅仅能判断操作系统的状态,完全无法判断安装在这个操作系统之上应用的状态,如果要监控了应用,那就需要每个应用本身具备可观测性,否则我们可能也只能从操作系统的角度仅仅判断这个应用是不是在运行。所以监控是一个动作,而前提条件是被监控的对象要具备可观测性,而更多的可观测数据也就意味着我们能更好的掌控整个系统。
为什么今天这个可观测性的要求会变得越来越高,越来越迫切呢?我们来看看计算机本身的发展史和一种监控软件的发展史。最早的大部分电脑其实都是单机运行的,没有网络概念。那个时候其实在操作系统层面上就带着很多的工具软件来保障我们能够知道和观测这个操作系统的运行状态。对于 Windows 用户来说,最著名的就是任务管理器了,而 Linux 也有一堆类似 Top,PS 等命令帮助我们知道操作系统的运行状态。一部分应用也为了方便排查问题,就有了输出文本记录应用运行情况的日志这种形态,如windows的事件关联, Linux 中的 syslog。这个时候我们是通过操作系统本身和应用本身的一些功能来了解这个系统并掌控这个系统的。
随着时代的进步,计算机进入了局域网时代,这个时候一些出现 C/S 的架构(Client/Server),在这种情况下出现了局域网中的一台计算机成为了服务器,服务器顾名思义就是服务别人的机器,那么与之对应的就是客户端通过与这个服务器进行数据交互来实现各种业务的需求,客户端之间可以通过服务器协同起来了。开始出现了早期的分布式系统,最早分布式系统的诉求就是高可用,因为一旦服务器故障,那么客户端则无法正常工作了。后期又发现可以通过不同的服务器处理不同的客户端的请求,随着连接的客户端增多,业务的复杂性变大,这个时候出现了集群这个概念。当时人们将服务器放在一起,通过交换机,路由器等网络设备串联起来,这个时候的监控需求就变化了,随着需要管理的服务器变多,人们不可能随时登录到每一个服务器上面去巡检系统的状态,于是乎面向集群的监控软件便出现了,比如 Zabbix,其使用了 C/S 架构,将操作系统中的可被观测的数据收集过来,统一的进行查看,包括根据收集的数据的进行一些基于阈值(即某个值大于或者小于一定的值)进行告警(Alert)。但由于 Zabbix 诞生的年代整体计算机性能并不强,且能收集的系统的数据少,无法收集更完整的数据,Zabbix 的收集颗粒度就比较粗。并且由于性能原因,日志数据通常也是在 Client 端(Zabbix agent)进行判断后,比如日志关键字中包含某些内容,再作为信号传输到 Zabbix 的 Server 端。因此 Zabbix 作为一个简单的监控软件,且是开源免费的,获得了很大的普及,直到今天仍然有大量用户。但其本身仅仅面向系统固有的简单可观测性指标采集以及通过脚本方式处理信号的模式有也成了其最大的局限。在 Zabbix 开始流行的时候,也有一些同类型的软件,由于处理能力的不同,有些可能侧重于网络,有些可能侧重于特种的软件,如数据库专门的监控软件,这本质上是计算机能力决定的。与此同时,一个产品悄然问世了,Splunk,其目的是将日志数据能够从集群中收集过来,最终统一处理统一分析,这个数据量就非常恐怖了,当是 Splunk 也因为其特殊的存储结构和算法,相较于 Zabbix,他能完整的收集数据,并且能分析处理这些海量数据,很多时候人们也把 Splunk 看做一种数据库对待。
时间约不停歇,技术不断发展,互联网的出现了,一种统一的客户端产品浏览器问世(最初来自于 Netscape 网景),出现了一种统一的内容展示形态 Web,其利用了 HTML 语言,一种文本,而浏览器恰恰是 HTML 语言解析器,将文本变成了可视化的网页,并且网景一开始就提供了一种让这种静态的文本协议动态化的编程小语言(JavaScript)。随着这个技术出现了一个概念叫 B/S(Brower/Server)即浏览器/服务器。即浏览器作为统一的客户端与服务器进行交互。因为互联网的兴起和越来越多的用户接入,出现了大量的基于 Web 技术的 WebSite 网站。当是人们要创建自己的网站,网站的一端是放在服务器上,而人们通过浏览器作为统一客户端来获取服务器提供的服务。最初的形态是将个人电脑接入互联网,通常只有具备互联网地址的大学才有可能,而随着互联网越来越发展,电信运营商提供了一种统一的将服务器接入互联网的方式,IDC(互联网数据中心,而与之相对的传统大规模存放服务器,并且用专线连接各个办公室的被称为数据中心)。数据中心最初的用户都是国家,银行,电信公司等满足其内部业务的平台,后面互联网公司也出现了他们将应用服务通过互联网向全世界提供。互联网上的服务器变得越来越多,系统也变得越来越复杂,有些公司如网易也开始提供了类似网站托管服务,让用户可以快速拥有一个 WebSite,而不需要到 IDC 托管服务器(这也是云计算的前身)。这个时候出现了一个伟大的公司 Google,将快速增长的 WebSite 用搜索引擎的方式,以爬虫(也是客户端)的方式去扫描整个互联网网站,然后对其内容进行索引,然后提供个人们搜索的方式能够快速找到自己想访问的内容。同一时刻,大量的互联网应用诞生,有即时通讯,有小说网站,有互联网游戏,相对应的是背后的系统的复杂度越来越高,服务器集群规模也越来越大。期间,有一个程序员为了帮助其妻子更快的搜索菜谱,创造了 ElasticSearch,一个搜索引擎技术,并且为此成立了公司,只不过最终 Elastic 公司并没有去做下一个 Google,而是与 Splunk 成为了对手,推出了 ELK 方案(ElasticSearch,Logstash,Kibana)和 Splunk 去竞争海量的日志数据收集管理的事情,此时此刻随着计算机能力的提升和技术的发展,海量日志的处理已经变得有可能了,而 ELK 作为开源软件成为了非常流行的选择,而 Splunk 作为商业软件也快速发展,其与 ELK 都被视为基于日志的监控高效解决方案。大规模的互联网应用又催生了 CDN 技术,将用户访问的内容以缓存方式分布到不同物理位置的服务器上来为最终用户访问加速。与此同时一种新的监控方式开始出现,拨测,即网站或者互联网服务的提供者,为了确保自己的网站或服务是监控的,则需要模拟自己是客户端的方式去访问自己的网站或服务,以确保网站是健康的无异常的,同时还可以分析网站在不同区域的访问加速情况以确保 CDN 工作是否正常。
2007 年,苹果发布了伟大的产品 iPhone,这个产品的诞生彻底改变了和加速了互联网的发展,Google 的 Android 也针锋相对得推出,以及无线通讯技术的高速发展,人类快速进入了移动互联网时代。移动互联网带来了两个改变,第一个由于乔布斯对于体验极致追求,加上当是移动设备的计算能力,Apps 这种在移动操作系统上统一的客户端悄然出现(我们会将 Program 指 PC 上的应用,而用 App 来指代移动端的应用);而另一个改变更加巨大,全球大量的设备接入了互联网,大量的用户,大量的访问。同时一种大规模管理海量服务器的方式被发明,Vmware 最早推出了虚拟化的方案,从最初的只是解决个人的电脑适配不同的操作系统,到后来发展为将一个物理服务器集群以软件方式分割来创造更多的虚拟机(virtual machine)来提升服务器的利用率。而在 2006 年,亚马逊就开始利用这项技术悄然推出了一个互联网服务 AWS(Amazon Web Service),最初是其利用亚马逊作为电商网站的大量数据中心中的闲置服务器来提供一种网站的大规模托管服务,今天这个服务已经被人们称之为云计算了。随着游戏变成了互联网游戏,有了互联网的视频网站,有了全国甚至全球性质的电商,打车,外卖等互联网服务,企业级软件也开始以 Paas,SaaS 的方式通过互联网加浏览器或者移动客户端(App)的方式提供服务了。而为了满足互联网的各种各样的服务,以及移动设备带来的不同的应用形态,大量的新形态的数据库,消息队列,中间件被创造出来了,包括 NoSQL,其实就是一系列满足特定场景需要的数据库,而单一的关系型数据已经不满足客户的需求了(数据库历史也很长,就不展开了)。随着大量的用户出现,每个用户在不同的互联网应用的使用过程中又产生了大量的数据,人们为了分析处理这些数据,大数据这个概念也就出来了。包括最近几年随着用户对于服务的提升和更迭的诉求,以及互联网推送更新的流行,互联网公司的开发测试环节也变得越来越敏捷了,传统的一个应用程序开发需要大量测试才能发布的一个版本的方式越来越难以被接收,Devops 概念出现了。尤其最近几年,为了进一步让应用更敏捷,更方便管理,容器技术和为了适应容器技术的云原生概念出现了(云原生是基于容器编排框架 Kubernetes 构建的生态软件的统称)。回到文章的正题,这个时候人们为了进一步提升应用性能,提出了一个 APM 的概念(Application Performance Moniter),旨在通过数据收集的方式将服务端和客户端的代码执行情况统一的收集起来,不仅仅是解决故障的问题,更为了提升应用的性能,比如 New Relic,Dynatrace,AppDynamic 就推出了相应的 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 这个组织的出现也标志着业界意识到需要将系统的可观测性变成一种统一的标准和规范,提出了可观测性的三支柱的概念,即 Metric(指标),Log(日志),Trace(链路追踪),其目标是推动更多的应用或者服务能够遵循这一规范,提供相应的可观测性能力。
写到这里基本上是把整个计算机监控和可观测性的发展史初略的讲了一遍,但是可能大家对什么是可观测性,以及其于监控的区别并没有分得很清楚。事实上可观测性强调的是服务器,云服务,应用程序本身需要主动的将可观测性三支柱能够以某种形式提供出来,如开源的 Prometheus 提出一种叫 Exporter 的概念,号召所有的中间件,应用能够主动的将指标(Metric)暴露出来给监控软件调用。那么同时需要有软件支持读取提供了可观测性数据,然后对其进行进一步的性能分析和监控。计算机发展这么久,而可观测性标准仅仅在最近这一两年才被提出,因此要想让所有的系统支持可观测性是不可能的,最新的开源的数据库 Tidb 就默认开放了自己的可观测性接口,而老牌的 MySQL 则没有。那么这也是 DataDog 这家公司强大的地方,一方面他提供了 DataDog Agent,能够方便的专业的实现了大量系统的可观测性的接口,使得不具备可观测性的系统快速具备可观测性,另一方面他也提供了相应的服务,能够处理海量可观测性的数据,将这些可观测性数据可视化,同时提供分析以及告警等功能。而开源世界则没这么容易,比如 Prometheus,Telegraf 有大量的不成熟甚至存在安全隐患的爱好者开发的开源 Exporter,而大部分软件工程师也不可能自己去完成对于自己系统的可观测性的完整适配。所以与传统的监控软件或产品相比较,可以称之为可观察性能力的产品有两个要素,一个是能够将需要监控的对象变得可观测(收集其指标,日志和代码链路),二是能够存储,处理,分析这些海量的实时数据。
监控和可观测性发展史到此就写得差不多了,大家可以看到,这种特定的产品发展和计算机本身的发展以及互联网的发展是密不可分的。未来会这么样?我只能说人类的系统会变得越来越复杂,我们即将面对更多的互联网设备接入( IOT 技术下的物联网,工业互联网),同时会有更多的新的云技术,数据技术出现,而这些设备和新的技术也需要具备可观测性,以及能够监控管理他们的监控产品。为了保障一个个如此复杂构建的系统,我相信监控和可观测性也将不断的发展。
观测云作为驻云科技推出的云时代的可观测性平台也是随着历史的潮流和用户的需求应运而生。