如何在 Ubuntu 14.04 服务器上安装和使用 Graphite
介绍
收集有关您的系统和应用程序的信息可以为您提供做出有关基础架构、服务器和软件的明智决策所需的信息。
有许多不同的方法可以获取此类信息,并以易于理解的方式显示它。这些应用程序之一称为 Graphite。
Graphite 是一种出色的工具,用于组织和呈现从系统收集的数据的可视化表示。它非常灵活并且可以进行配置,以便您可以获得所跟踪指标的性能和健康状况的详细表示和广泛概述的好处。
在之前的指南中,我们查看了 Statsd。
安装石墨
首先,我们需要下载并安装 Graphite 组件。如果您看过我们对绘图软件的介绍,您会注意到 Graphite 由几个组件组成:Web 应用程序、称为 Carbon 的存储后端和称为 whisper 的数据库库。
石墨过去很难安装。幸运的是,在 Ubuntu 14.04 中,我们需要的所有组件都可以在默认存储库中找到。
让我们更新本地包索引,然后安装必要的包:
sudo apt-get update
sudo apt-get install graphite-web graphite-carbon
在安装过程中,如果您决定清除安装,系统会询问您是否希望 Carbon 删除数据库文件。在这里选择“否”,这样您就不会破坏您的统计数据。如果您需要重新开始,您可以随时手动删除文件(保存在 var/lib/graphite/whisper
中)。
安装完成后,将安装 Graphite。不过,我们需要做一些额外的配置才能使一切正常运行。
为 Django 配置数据库
虽然 Graphite 数据本身由 Carbon 和 whisper 数据库库处理,但 Web 应用程序是一个 Django Python 应用程序,需要将其数据存储在某个地方。
默认情况下,这被配置为使用 SQLite3 数据库文件。然而,这些并不像成熟的关系数据库管理系统那样健壮,因此我们将配置我们的应用程序以改为使用 PostgreSQL。 PostgreSQL 对数据类型更加严格,并且会捕获可能导致问题的异常。
安装 PostgreSQL 组件
我们可以通过键入以下命令来安装所需的数据库软件和帮助程序包:
sudo apt-get install postgresql libpq-dev python-psycopg2
这将安装数据库软件,以及 Graphite 将用来连接到数据库并与之通信的 Python 库。
创建数据库用户和数据库
安装数据库软件后,我们需要创建一个 PostgreSQL 用户和数据库供 Graphite 使用。
我们可以以 postgres
系统用户身份使用 psql
命令登录到交互式 PostgreSQL 提示符:
sudo -u postgres psql
现在,我们需要创建一个数据库用户帐户,Django 将使用它来操作我们的数据库。我们将调用用户 graphite
。为此用户选择安全密码:
<前>
现在,我们可以创建一个数据库并赋予我们的新用户所有权。我们还将调用数据库 graphite
以便于识别它们的关联:
CREATE DATABASE graphite WITH OWNER graphite;
完成后,我们可以退出 PostgreSQL 会话:
\q
您可能会看到一条消息,指出 Postgres 无法保存文件历史记录。这对我们来说不是问题,所以我们可以继续。
配置 Graphite Web 应用程序
现在,我们已经准备好数据库和用户了。但是,我们仍然需要修改 Graphite 的设置以使用我们刚刚配置的组件。我们还应该查看一些其他设置。
打开 Graphite Web 应用程序配置文件:
sudo nano /etc/graphite/local_settings.py
首先,我们应该设置在创建哈希时将用作盐的密钥。取消注释 SECRET_KEY
参数并将值更改为长且唯一的值。
<前>
接下来,我们应该指定时区。这将影响我们图表上显示的时间,因此设置很重要。将其设置为此列表中“TZ”列指定的时区。
<前>
我们还想配置用于保存图形数据的身份验证。当我们同步数据库时,我们将能够创建一个用户帐户,但我们需要通过取消注释这一行来启用身份验证:
USE_REMOTE_USER_AUTHENTICATION = True
接下来,查找 DATABASES
字典定义。我们想更改值以反映我们的 Postgres 信息。您应该更改 NAME
、ENGINE
、USER
、PASSWORD
和 HOST
键.
完成后,它应该看起来像这样:
<前>
红色区域是您需要更改的值。确保将密码修改为您在 Postgres 中为 graphite
用户选择的密码。
此外,请确保设置了 HOST
参数。如果您将此留空,Postgres 会认为您正在尝试使用对等身份验证进行连接,在我们的例子中这将无法正确进行身份验证。
完成后保存并关闭文件。
同步数据库
现在我们已经填写了数据库部分,我们可以同步数据库以创建正确的结构。
您可以通过键入以下内容来执行此操作:
sudo graphite-manage syncdb
您将被要求为数据库创建一个超级用户帐户。创建一个新用户,以便您可以登录界面。你可以随意调用它。这将允许您保存图表并修改界面。
配置碳
现在我们有了一个数据库,我们可以开始配置 Carbon,即 Graphite 存储后端。
首先,让我们启用 carbon 服务以在引导时启动。我们可以通过打开服务配置文件来做到这一点:
sudo nano /etc/default/graphite-carbon
这只有一个参数,它指示服务是否将在启动时启动。将值更改为“true”:
CARBON_CACHE_ENABLED=true
保存并关闭文件。
接下来,打开 Carbon 配置文件:
sudo nano /etc/carbon/carbon.conf
此文件的大部分已针对我们的目的进行了正确配置。但是,我们会做一个小改动。
通过将此指令设置为 true 来打开日志轮换:
ENABLE_LOGROTATION = True
保存并关闭文件。
配置存储模式
现在,打开存储模式文件。这告诉 Carbon 存储值的时间以及这些值的详细程度:
sudo nano /etc/carbon/storage-schemas.conf
在里面,你会发现看起来像这样的条目:
<前>
[默认_1min_for_1day]
该文件当前定义了两个部分。第一个是决定如何处理来自 Carbon 本身的数据。 Carbon 实际上被配置为存储其自身性能的一些指标。底部定义是一个包罗万象的定义,旨在应用于任何未被其他部分匹配的数据。它定义了默认策略。
括号中的词是用于定义新定义的节标题。在每个部分下,都有一个模式定义和一个保留策略。
模式定义是一个正则表达式,用于匹配发送到 Carbon 的任何信息。发送到 Carbon 的信息包括一个度量名称,这是它检查的内容。在第一个示例中,该模式检查所讨论的指标是否以字符串 \carbon.
开头。
保留策略由数字集定义。每组包含一个度量间隔(记录度量的频率),后跟一个冒号,然后是存储这些值的时间长度。您可以定义多组数字,用逗号分隔。
为了演示,我们将定义一个新模式,该模式将匹配我们稍后将使用的测试值。
在默认部分之前,为我们的测试值添加另一个部分。让它看起来像这样:
<前>
这将匹配以 \test.
开头的任何指标。它将以不同的详细信息存储三次收集的数据。第一个存档定义 (10s:10m
)将每十秒创建一个数据点。它只会存储十分钟的值。
第二个存档 (1m:1h
) 将每分钟创建一个数据点。它将收集过去一分钟的所有数据(六个点,因为之前的存档每十秒创建一个点)并将其聚合以创建点。默认情况下,它通过对点进行平均来实现这一点,但我们可以稍后进行调整。它将此详细级别的数据存储一小时。
将创建的最后一个存档 (10m:1d
) 将每 10 分钟创建一个数据点,以与第二个存档相同的方式聚合数据。它将存储数据一天。
当我们从 Graphite 请求信息时,它将从最详细的存档中返回信息,这些存档衡量了我们所请求的时间范围。因此,如果我们询问过去五分钟的指标,将返回第一个存档中的信息。如果我们要求提供过去 50 分钟的图表,数据将从第二个存档中获取。
完成后保存并关闭文件。
关于存储聚合方法
Carbon 在将更详细的信息处理成一个通用数字时决定聚合数据的方式对于理解您是否想要准确的指标非常重要。这适用于每次 Graphite 制作不太详细的指标版本时,例如我们上面创建的测试模式中的第二个和第三个存档。
正如我们上面提到的,默认行为是在聚合时取平均值。这意味着,除了最详细的存档之外,Carbon 将对收到的数据点进行平均以创建数字。
但这并不总是可取的。例如,如果我们想要一个事件在不同时间段内发生的总次数,我们会希望将数据点相加来创建我们的广义数据点,而不是对它们进行平均。
我们可以在名为 storage-aggregation.conf
的文件中定义聚合发生的方式。将 Carbon 示例目录中的文件复制到我们的 Carbon 配置目录中:
sudo cp /usr/share/doc/graphite-carbon/examples/storage-aggregation.conf.example /etc/carbon/storage-aggregation.conf
在文本编辑器中打开文件:
sudo nano /etc/carbon/storage-aggregation.conf
这看起来与上一个文件有点相似。您会发现如下所示的条目:
<前>
部分名称和模式与存储模式文件完全相同。它只是一个任意名称和一个匹配您定义的指标的模式。
XFilesFactor
是一个有趣的参数,因为它允许您指定 Carbon 进行聚合时应该具有的最小值百分比。默认情况下,所有值都设置为 0.5
,这意味着如果要创建聚合点,则必须有 50% 的更详细的数据点可用。
这可用于确保您不会创建可能歪曲实际情况的数据点。例如,如果 70% 的数据由于网络问题而被丢弃,您可能不想创建一个仅真实代表 30% 数据的点。
接下来定义聚合方法。可能的值为平均值、总和、最后、最大值和最小值。它们不言自明,但非常重要。选择错误的值将导致您的数据以错误的方式记录。正确的选择完全取决于您实际跟踪的指标是什么。
注意:重要的是要意识到,如果您发送 Graphite 数据点的频率超过最短存档间隔长度,您的一些数据将会丢失!
这是因为 Graphite 仅在从详细档案到广义档案时应用聚合。创建详细数据点时,它仅写入间隔过去后发送给它的最新数据。我们将在另一篇指南中讨论 StatsD,它可以通过缓存和聚合以更频繁的间隔传入的数据来帮助缓解这个问题。
保存并关闭文件。
完成后,您可以通过键入以下命令启动 Carbon:
sudo service carbon-cache start
安装和配置 Apache
为了使用网络界面,我们将安装和配置 Apache 网络服务器。 Graphite 包含 Apache 的配置文件,因此选择起来非常简单。
通过键入以下内容安装组件:
sudo apt-get install apache2 libapache2-mod-wsgi
安装完成后,我们应该禁用默认的虚拟主机文件,因为它与我们的新文件冲突:
sudo a2dissite 000-default
接下来,将 Graphite Apache 虚拟主机文件复制到可用站点目录中:
sudo cp /usr/share/graphite-web/apache2-graphite.conf /etc/apache2/sites-available
然后我们可以通过键入以下内容来启用虚拟主机文件:
sudo a2ensite apache2-graphite
重新加载服务以实施更改:
sudo service apache2 reload
检查 Web 界面
现在我们已经配置好了所有内容,我们可以查看 Web 界面。
在您的网络浏览器中,访问您服务器的域名或 IP 地址:
<前>
您应该会看到如下所示的屏幕:

在继续之前,您应该登录以便保存您可能进行的任何图表设置。点击顶部菜单栏的“登录”按钮,输入同步Django数据库时配置的用户名和密码。
接下来,如果您在左窗格中打开 Graphite
的树,您应该会看到 Carbon 的条目。在这里您可以找到 Carbon 记录的关于自身的数据图表。单击其中几个选项。在这里,我绘制了收到的指标并更新了操作指标:

现在,让我们尝试向 Graphite 发送一些数据。当您执行这些步骤时,请注意您几乎不会像这样向 Graphite 发送统计信息。有很多更好的方法可以做到这一点,但这将有助于展示后台发生的事情,还将帮助您了解 Graphite 处理数据的方式的局限性。稍后我们将讨论如何通过配套服务来解决这些问题。
指标消息需要包含指标名称、值和时间戳。我们可以在我们的终端中执行此操作。让我们创建一个与我们创建的 test
存储模式相匹配的值。我们还将匹配其中一个定义,该定义将在聚合时将值相加。我们将使用 date
命令来制作我们的时间戳。类型:
echo "test.count 4 `date +%s`" | nc -q0 127.0.0.1 2003
如果您刷新页面然后查看左侧的 Graphite
树,您将看到我们的新测试指标。多次发送上述命令,中间至少等待 10 秒。请记住,当在其最小间隔内发送多个值时,Graphite 将抛出除最后一个值之外的所有值。
现在,在 Web 界面中,告诉 Graphite 显示过去 8 分钟。在测试指标的图表上,单击带有绿色箭头的白色矩形图标。当您将鼠标悬停在它上面时,它会说“选择最近的数据”:

从弹出窗口中选择 8 分钟。单击“更新图表”图标以获取最新数据。您应该看到一个几乎没有任何信息的图表。这是因为您只向它发送了几个值,每个值都是“4”,所以它没有变化。
但是,如果您查看过去 15 分钟的图表(假设您多次发送命令,间隔大于 10 秒但小于一分钟),您应该会看到一些不同的东西:

这是因为我们的第一个存档在 15 分钟内没有保存数据,因此 Graphite 查找我们的第二个存档以获取渲染数据。它看起来不同,因为我们向 Graphite 发送了一个“计数”指标,它与我们的聚合定义之一相匹配。
count 聚合告诉 Graphite 将它在较大间隔过程中收到的值相加,而不是取平均值。如您所见,我们选择的聚合方法非常重要,因为它定义了如何从更详细的点创建概括数据点。
结论
您现在已经安装并设置了 Graphite,但它的功能仍然相当有限。我们不想一直手动向它提供数据,我们希望它不会在最小间隔内有多个指标时丢弃数据。我们需要配套工具来帮助我们解决这些问题。
在下一篇指南中,我们将讨论如何使用 Graphite 设置 StatsD 以及如何更深入地使用 Graphite 界面。