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