介绍
有很多理由可以解释为什么收集关于服务器、应用程序和流量的统计数据是一个好主意。收集和组织数据可以让您对扩展、故障排除和跟踪配置中的痛点做出自信的决策。
有各种工具可以用来跟踪我们的机器上的指标,它们通常被委托给某个过程的一小部分。我们可以将这些工具连接在一起,创建一个用于收集、记录和显示结果的系统。
在本指南中,我们将讨论一些技术,这些技术将允许您收集、存储和可视化服务器和应用程序生成的数据。
我们将讨论Graphite,这是一个由几个组件组成的图形库,可用于随时间呈现数据的可视表示。我们还将研究collectd,这是一个系统统计守护程序,可以收集关于运行中服务器的几乎实时信息。我们列表中的最后一个是StatsD,这是一个灵活的统计聚合器,可用于收集和组织任意数据。
在以后的指南中,我们将介绍如何在 Ubuntu 14.04 服务器上安装和配置这些组件,让您快速上手。
为什么要跟踪数据?
我们需要确定的第一件事是在服务器或应用程序环境中跟踪数据的原因。
总体原因实际上非常简单:我们拥有的数据越多,我们就越有可能能够了解在任何给定时刻发生了什么。这使我们能够用硬数据支持我们的决策,并提前看到是否更改可能针对正确的组件。跟踪统计数据为我们提供了一个可能不在应用程序日志中的补充信息来源。
大多数(但不是全部)日志系统无法将来自各种应用程序的数据相关联,或将事件连接到某些系统状态,因为它们基本上代表独立的应用程序输出。这可能使得构建围绕事件的环境的整体视图变得棘手。
我们可以想象一下,当您的数据库服务器宕机时发生了一起事件。在阅读日志时,您可能会注意到在协调世界时 15:35:28,您的 MySQL 服务因内存不足(OOM)错误而被终止。现在我们知道内存使用是问题所在,但我们可能不知道是什么导致了曾经稳定的服务器的内存使用量激增。
如果我们正在跟踪我们的服务器和应用程序的数据,我们可以开始汇集看似不相关的系统数据片段,以帮助我们了解问题发生时环境的确切情况。我们可能会发现我们的内存使用量稳步上升,这可能来自内存泄漏。如果我们有关于应用程序级内存使用的信息,我们很可能可以看到哪个程序是罪魁祸首。我们还可能会看到有异常的内存使用激增,这可能意味着完全不同的问题。
在另一种情况下,我们可以看到部署前后系统的情况。如果新代码创建了一些奇怪的条件,我们可以看到它对其他组件的影响,并将其性能与旧代码进行比较。我们可以确定新代码表现出改进的地方,以及我们可能犯了错误的地方。
通过智能数据收集,我们可以将我们的系统视为一个系统,而不是一组不相关的组件。
Graphite 组件
我们将从后面开始,首先讨论图形库 Graphite,然后再回过头来介绍 Graphite 可以使用的一些软件来获取数据。
Graphite 是一个负责存储和呈现数据的图形库。这意味着 Graphite 需要其他应用程序来收集和传输数据点。
Graphite 项目本身由几个不同的组件组成,每个组件都有特定的、专注的目的。
Graphite Web 应用程序
Graphite 安装中最显眼和动态的组件是 Graphite web 应用程序。
这是您可以设计绘制数据的图形的地方:
!Graphite example graph
Graphite 为您提供了一个非常灵活的界面来设计图形。您可以组合不同类型的指标,控制标签、字体、颜色和线属性,您可以随意调整和操作数据。
这里需要理解的关键思想是,Graphite 根据接收到的数据点和您给定的指示呈现图形。它不仅仅打印出图形然后丢弃数据。您可以随意呈现数据。
Web 应用程序还允许您保存图形属性和布局,这样您就可以调出您想要的所有设置的监控界面。您可以拥有尽可能多的仪表板视图,这意味着您可以为每台机器或应用程序单独创建一个仪表板。如果您需要在这些仪表板之间进行数据相关性,只需拖放图形以组合显示。
灵活性并不止于此。Graphite 允许您在裸 URL 上呈现图形,以嵌入到其他界面中。您还可以将数据导出为非图形表示,如 JSON 或 CSV,或输出带有嵌入数据信息的 SVG。
现在您知道了获取数据后可以做什么,让我们来谈谈其他 Graphite 组件,看看允许我们这样做的过程。
Carbon
Carbon 是 Graphite 配置的存储后端。单个 Graphite 配置将拥有一个或多个 Carbon 守护进程,负责处理由其他收集和传输统计数据的进程发送过来的数据(收集器不是 Graphite 的一部分)。
有各种不同的 Carbon 守护进程,每个都以不同的方式处理数据。其中最基本的是称为 carbon-cache.py
的守护进程。这个守护进程很直接。它在一个端口上监听数据,并在数据到达时以高效的方式将数据写入磁盘。
它会在数据到达时存储数据,然后在预定的时间后将其刷新到磁盘上。重要的是要认识到 Carbon 组件处理数据接收和刷新过程,而不处理实际的存储机制。这留给了我们即将讨论的 whisper
组件。
carbon-cache.py
守护进程会告知要处理的格式、协议和端口,还会告知要使用的数据保留策略。这些信息会传递给 whisper。对于大多数基本配置,单个 carbon-cache.py
实例足以处理数据接收。
随着设置的增长,可以同时运行多个实例。这些可以由前置的 carbon-relay.py
或 carbon-aggregator.py
守护进程进行负载均衡。
carbon-relay.py
守护进程可用于向所有后端守护进程发送请求以实现冗余。它还可以用于在不同的 carbon-cache.py
实例之间分片数据,以在多个存储位置上分散读取负载。
carbon-aggregator.py
守护进程可以缓冲数据,然后在一段时间后将其转储到 carbon-cache.py
中。这有助于减轻系统对统计处理的影响,但会牺牲细节。
Whisper
Whisper 是 Graphite 用于存储发送的信息的数据库库。
它非常灵活,允许以极大的细节存储时间序列数据。它在不同的级别创建不同的存档,因此在实际使用中,当数据通过特定配置的老化阈值时,信息会优雅地降级为较低的分辨率。
例如,您可以为某个指标每秒存储一个数据点。您可以告诉 whisper 保留这些详细数据 5 小时。您还可以有一个存储较低分辨率数据的存档。它可能只存储每分钟一个数据点,并保留 6 个月。
较低分辨率存档中的每个点都是从相同数据计算而来的,这些数据记录在较高分辨率存档中。您可以拥有任意数量的不同分辨率和保留率的存档。您可以根据被跟踪的指标类型配置 whisper 如何计算较低分辨率存档的数据。
例如,某个指标可能是在短时间内发生某事件的次数的总计。要在较低分辨率的较大时间范围内创建一个点,您需要将较高分辨率存档的数据点相加,以总结较大时间跨度上的数据值。
Whisper 可以根据指标的性质以其他方式计算较低分辨率数据。例如,某些数据通过平均值进行泛化,而另一些可能跟踪最大值。对于平均值,会从较高分辨率点计算出实际的平均值以创建较低分辨率点。对于最大值,应保留最高值并丢弃其余值以保持数字的含义。
Whisper 在接收数据后(收集必要值所需的时间后)计算并记录较低分辨率数据。它只收集执行数据聚合技术(平均值、最大值等)所需的数据点,然后写入。
当 Graphite 查询要渲染图形的数据时,它将使用包含请求时间范围的最高分辨率存档。
统计数据收集和传递
正如我们上面提到的,Graphite 本身不关心数据收集。相反,它依赖于从其他服务获取信息。这使得项目能够保持狭窄的焦点,并能够模块化地与各种输入服务进行交互。
下面,我们将讨论 Graphite 理解的协议,然后讨论两个流行的收集程序 collectd 和 StatsD,它们可以用于将数据传递给 Carbon 进行处理。
协议
有三种不同的协议可用于将数据发送到 Graphite。
首先,Graphite 接受并能理解纯文本。这是最灵活的格式,因为几乎任何应用程序或服务都可以生成文本输出,并且这可以用于向 Graphite 或中间工具提供数据。
纯文本消息包括有关指标名称、给定值和该值的时间戳的信息。这些消息可以直接发送到 Carbon 的纯文本端口,无需额外格式。
由于 Graphite 是用 Python 创建的,Graphite 还接受 “pickle” 数据序列化格式。这种 Python 标准允许您在单个事务中缓冲和发送多个时间值。
Graphite 还可以接受使用 AMQP 消息发送数据。这使您能够更优雅地处理大量数据负载。您可以输入大量统计数据,并在远程主机之间的网络连接中断时处理中断,而不会丢失数据。
Collectd
收集详细服务器信息的最简单方法之一是使用一个名为 collectd 的守护程序。
Collectd 可以收集关于服务器环境许多不同组件的统计信息。它允许您轻松跟踪常见指标,如内存使用、CPU 负载、网络流量等。这使您能够轻松地将事件与系统状态相关联。
除了收集标准系统信息外,collectd 还具有一个插件系统,可以扩展其功能。这意味着您可以轻松跟踪常见软件,如 Apache、Nginx、iptables、memcache、MySQL、PostgreSQL、OpenVPN 等。
Collectd 提供了一种从预构建应用程序和服务器上的常见服务获取数据的简单方法。这应该用于跟踪基础架构和您依赖的服务的行为。
StatsD
StatsD 是一个非常简单的守护程序,可用于将其他数据发送到 Graphite。这种方法的好处是可以轻松地将统计跟踪集成到您正在创建的应用程序和系统中。
StatsD 通过在接口上监听简单的 UDP 数据包来运行,这些数据包代表一个数据点。这意味着它可以以无连接的方式接受大量信息。然后,它可以聚合接收到的值,并将其传递给 Graphite。
这个系统允许您发送大量的统计数据,而不必担心增加应用程序的延迟。StatsD 服务将收集所有数据,进行聚合,然后以 Graphite 期望的时间框架发送漂亮的总结数据点。
由于这些优势,实际上它是发送到 Graphite 的任何类型数据的良好中间件。但我们可以利用这一点的主要方式是监视我们自己创建的应用程序和工具。
StatsD 非常适合这个用途,因为它是一个接受 UDP 流量的通用守护程序。各种编程语言中有许多不同的客户端库,可以直接将数据发送到 StatsD 实例。这意味着您正在构建的应用程序可以轻松地发送要跟踪的数据。
结论
到目前为止,您应该已经对如何将不同统计信息和图形化工具集成在一起,以便为您的环境提供完整的图片有了相当好的理解。