使用Graphite、StatsD和CollectD跟踪统计信息简介
介绍
收集有关服务器、应用程序和流量的统计信息是一个好主意的原因有很多。 收集和组织数据可以让您对有关扩展、故障排除和跟踪配置中的痛点的决策充满信心。
有多种工具可用于跟踪我们机器上的指标,它们通常被委派给流程的一小部分。 我们可以将这些工具连接在一起,以创建一个用于收集、记录和显示结果的系统。
在本指南中,我们将讨论一些允许您收集、存储和可视化服务器和应用程序生成的数据的技术。
我们将讨论 Graphite,这是一个由多个组件组成的图形库,可用于随着时间的推移呈现数据的可视化表示。 我们还将研究 collectd,这是一个系统统计守护进程,可以收集有关正在运行的服务器的近实时信息。 我们列表中的最后一个是 StatsD,这是一个灵活的统计聚合器,可用于收集和组织任意数据。
在后面的指南中,我们将介绍如何在 Ubuntu 14.04 服务器上安装和配置这些组件以帮助您启动和运行。
我们为什么要跟踪数据?
我们需要确定的第一件事是我们在服务器或应用程序环境中跟踪数据的原因。
最重要的原因实际上很简单:我们拥有的数据越多,我们就越有可能了解在任何给定时刻发生的事情。 这使我们具有非凡的能力,可以用硬数据支持我们的决策,并提前查看更改是否可能针对正确的组件。 跟踪统计信息为我们提供了应用程序日志中可能不存在的补充信息源。
大多数(但不是全部)日志系统无法关联来自各种应用程序的数据或将事件连接到某些系统状态,因为它们基本上代表独立的应用程序输出。 这可能会使构建事件周围环境的整体视图变得棘手。
我们可以想象一下,您的数据库服务器发生了故障。 在阅读日志时,您可能会注意到在 15:35:28 UTC,您的 MySQL 服务因 OOM(内存不足)错误而被终止。 我们现在知道内存使用是问题所在,但我们可能不知道是什么导致了以前稳定的服务器中的内存使用峰值。
如果我们正在跟踪有关我们的服务器和我们的应用程序的数据,我们可以开始将明显不同的系统数据片段汇集在一起,以帮助我们了解问题发生时环境的确切情况。 我们可能会发现内存使用量稳步攀升,这可能来自内存泄漏。 如果我们有关于应用程序级内存使用的信息,我们很可能可以准确地看到哪个程序是罪魁祸首。 我们可能还会看到有一个不寻常的峰值,这可能意味着完全不同的事情。
在不同的场景中,我们可以看到系统在部署之前和之后的样子。 如果新代码产生了一些奇怪的情况,我们可以看到它对我们其他组件的影响,并将它的性能与我们的旧代码进行比较。 我们可以确定我们的新代码显示改进的地方,以及我们可能犯错误的地方。
通过智能数据收集,我们可以将我们的系统视为一个系统,而不是一组松散的不相关组件。
石墨组件
我们将在这里稍微倒退一点,首先讨论图形库 Graphite。 然后,我们将回过头来介绍 Graphite 可以用来获取数据的一些软件。
Graphite 是一个图形库,负责存储和呈现数据的可视化表示。 这意味着 Graphite 需要其他应用程序来收集和传输数据点。
Graphite 项目本身由几个不同的组件组成,每个组件都有一个特定的、专注的目的。
石墨网络应用程序
Graphite 安装中最明显和最动态的组件是 Graphite Web 应用程序。
您可以在这里设计绘制数据的图表:
Graphite 为您提供了一个非常灵活的界面来设计图形。 您可以组合不同类型的指标、控件标签、字体、颜色和线条属性,并且可以随意调整数据大小和操作数据。
这里要消化的关键思想是 Graphite 根据接收到的数据点和您给出的方向来渲染 图形。 它不只是打印出图表然后丢弃数据。 您可以即时以所需的任何数据呈现数据。
Web 应用程序还允许您保存图形属性和布局,以便您可以使用您想要的所有设置调出监控界面。 您可以拥有任意数量的仪表板视图,这意味着您可以为每台机器或应用程序拥有一个单独的仪表板。 如果您需要关联这些数据,只需拖放图表即可组合显示。
然而,灵活性并没有就此结束。 Graphite 允许您以裸 URL 呈现图形以嵌入到其他界面中。 您还可以以 JSON 或 CSV 等非图形表示形式导出数据,或输出带有嵌入数据信息的 SVG。
既然您知道在获取数据时可以对数据做什么,那么让我们谈谈其他 Graphite 组件以了解允许我们执行此操作的过程。
碳
Carbon 是 Graphite 配置的存储后端。 单个 Graphite 配置将具有一个或多个 Carbon 守护进程,负责处理由收集和传输统计信息的其他进程发送的数据(收集器不是 Graphite 的一部分)。
有多种不同的 Carbon 守护进程,每个守护进程都以不同的方式处理数据。 其中最基本的称为 carbon-cache.py
。 这个守护进程是直截了当的。 它侦听端口上的数据,并在数据到达时以有效的方式将数据写入磁盘。
它在数据到来时存储数据,然后在预定时间后将其刷新到磁盘。 重要的是要认识到 Carbon 组件处理数据接收和刷新过程。 它不处理实际的存储机制。 这留给我们稍后将讨论的 whisper
组件。
carbon-cache.py
守护进程被告知要使用什么格式、协议和端口。 它还被告知用于数据存储的数据保留策略。 这些都交给耳语了。 对于大多数基本配置,单个 carbon-cache.py
实例足以处理数据接收。
随着设置的增长,可以一次运行多个实例。 这些可以通过前面的 carbon-relay.py
或 carbon-aggregator.py
守护进程来平衡。
carbon-relay.py
守护进程可用于向所有后端守护进程发送请求以获得一些冗余。 它还可用于跨不同 carbon-cache.py
实例分片数据,以将读取负载分散到多个存储位置。
carbon-aggregator.py
守护程序可以缓冲数据,然后在一段时间后将其转储到 carbon-cache.py
。 这可以帮助减少统计处理对系统的影响,但会牺牲细节。
耳语
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 可以收集有关服务器环境的许多不同组件的统计信息。 它允许您轻松跟踪常见指标,如内存使用情况、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 和 StatsD 连接到 Graphite 以输入统计数据进行监控。