介绍
收集有关您的系统和应用程序的信息可以为您提供对基础架构、服务器和软件做出明智决策所需的信息。
有许多不同的方法可以获取此类信息,并以易于理解的方式显示它。 这些应用程序之一称为 Graphite。
Graphite 是一种出色的工具,用于组织和呈现从系统收集的数据的可视化表示。 它非常灵活,并且可以进行配置,这样您就可以从详细表示以及对您正在跟踪的指标的性能和健康状况的广泛概述中获益。
在之前的指南中,我们查看了 图形和统计数据收集应用程序的概述 ,您可以将它们串在一起创建一个强大的系统来显示统计数据。 在本指南中,我们将向您展示如何在您的 Ubuntu 14.04 服务器上设置 Graphite。 在以后的指南中,我们将讨论如何从 collectd 和 Statsd 提供 Graphite 统计信息。
安装石墨
首先,我们需要下载并安装 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 使用。
我们可以使用 psql
命令以 postgres
系统用户身份登录交互式 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
参数并将值更改为长且唯一的值。
SECRET_KEY = ' a_salty_string '
接下来,我们应该指定时区。 这会影响我们图表上显示的时间,所以设置很重要。 将其设置为此列表 中“TZ”列 指定的时区。
TIME_ZONE = '美国/纽约'
我们还想配置身份验证以保存图形数据。 当我们同步数据库时,我们将能够创建一个用户帐户,但我们需要通过取消注释此行来启用身份验证:
USE_REMOTE_USER_AUTHENTICATION = True
接下来,查找 DATABASES
字典定义。 我们想要更改这些值以反映我们的 Postgres 信息。 您应该更改 NAME
、ENGINE
、USER
、PASSWORD
和 HOST
键。
完成后,它应该如下所示:
数据库 = { 'default': { 'NAME': ' graphite ', 'ENGINE': 'django.db.backends. postgresql_psycopg2 ','用户':'石墨','密码':'密码','主机':' 127.0.0.1 ','端口':''}}
红色区域是您需要更改的值。 确保将密码修改为您在 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
在里面,您会发现如下所示的条目:
[碳] 模式 = ^碳。 保留 = 60:90d [default_1min_for_1day] 模式 = .* 保留 = 60s:1d
该文件当前定义了两个部分。 第一个是决定如何处理来自 Carbon 本身的数据。 Carbon 实际上被配置为存储其自身性能的一些指标。 底部定义是一个包罗万象的定义,旨在应用于其他部分未匹配的任何数据。 它定义了一个默认策略。
括号中的词是用于定义新定义的节标题。 在每个部分下,都有一个模式定义和一个保留策略。
模式定义是一个正则表达式,用于匹配发送给 Carbon 的任何信息。 发送给 Carbon 的信息包括一个指标名称,这是它检查的内容。 在第一个示例中,该模式检查所讨论的指标是否以字符串“carbon.
”开头。
保留策略由一组数字定义。 每组包含一个度量间隔(度量的记录频率),后跟一个冒号,然后是存储这些值的时间长度。 您可以定义以逗号分隔的多组数字。
为了演示,我们将定义一个新模式,该模式将匹配我们稍后将使用的测试值。
在默认部分之前,为我们的测试值添加另一个部分。 让它看起来像这样:
[测试] 模式 = ^测试。 保留 = 10s:10m,1m:1h,10m:1d
这将匹配以“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
这看起来有点类似于最后一个文件。 您将找到如下所示的条目:
[min] 模式 = .min$ xFilesFactor = 0.1 aggregationMethod = min
部分名称和模式与 storage-schemas 文件完全相同。 它只是一个任意名称和一个模式来匹配您定义的指标。
XFilesFactor
是一个有趣的参数,因为它允许您指定 Carbon 应该进行聚合的值的最小百分比。 默认情况下,所有值都设置为 0.5
,这意味着如果要创建聚合点,则必须有 50% of 个更详细的数据点可用。
这可用于确保您不会创建可能歪曲实际情况的数据点。 例如,如果 70% of 您的数据由于网络问题而被丢弃,您可能不想创建一个仅真实表示 30% of 数据的点。
接下来定义聚合方法。 可能的值是平均值、总和、最后、最大值和最小值。 它们是不言自明的,但非常重要。 选择错误的值将导致您的数据以不正确的方式记录。 正确的选择完全取决于您实际跟踪的指标。
注意:重要的是要意识到如果您发送Graphite数据点的频率超过最短存档间隔长度,您的一些数据将会丢失!
这是因为 Graphite 仅在从详细存档到通用存档时才应用聚合。 创建详细数据点时,它只在间隔过去时写入发送给它的最新数据。 我们将在另一个指南中讨论 StatsD,它可以通过缓存和聚合以更频繁的时间间隔传入的数据来帮助缓解这个问题。
保存并关闭文件。
完成后,您可以通过键入以下内容来启动 Carbon:
sudo service carbon-cache start
安装和配置 Apache
为了使用 Web 界面,我们将安装和配置 Apache Web 服务器。 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 地址:
http:// server_domain_name_or_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 秒但小于 1 分钟),您应该会看到不同的情况:
这是因为我们的第一个存档在 15 分钟内没有保存数据,因此 Graphite 查找我们的第二个存档以获取渲染数据。 它看起来不同,因为我们向 Graphite 发送了一个“计数”指标,它与我们的聚合定义之一相匹配。
计数聚合告诉 Graphite 将在其较大间隔过程中收到的值相加,而不是平均。 如您所见,我们选择的聚合方法非常重要,因为它定义了如何从更详细的点创建泛化数据点。
结论
您现在已经安装并设置了 Graphite,但它的功能仍然相当有限。 我们不希望一直手动向其提供数据,并且如果我们在最小间隔内有多个指标,我们希望它不会丢弃数据。 我们需要配套工具来帮助我们解决这些问题。
在下一个指南中,我们将讨论如何设置 collectd 一个系统统计信息收集守护程序,该守护程序可用于提供 Graphite 数据并解决这些限制。 在以后的指南中,我们还将介绍如何使用 Graphite 配置 StatsD 以及如何更深入地使用 Graphite 接口。