介绍
收集关于您的系统和应用程序的信息可以为您提供有关基础架构、服务器和软件的决策所需的信息。
有许多不同的方法可以获取这种信息,并以便于理解的方式显示出来。其中一个应用程序就是Graphite。
Graphite是一个出色的工具,用于组织和呈现从系统中收集的数据的可视化表示。它非常灵活,可以配置,以便您既可以获得详细的表示,又可以获得对您正在跟踪的指标的性能和健康状况的广泛概述的好处。
在以前的指南中,我们曾经概述了一些图形和统计信息收集应用程序,您可以将它们串联在一起,创建一个强大的系统来显示统计信息。在本指南中,我们将向您展示如何在Ubuntu 14.04服务器上设置Graphite。在将来的指南中,我们将讨论如何从collectd和Statsd向Graphite提供统计信息。
安装Graphite
要开始,我们需要下载并安装Graphite组件。如果您看过我们的图形软件介绍,您会注意到Graphite由几个组件组成:Web应用程序,称为Carbon的存储后端,以及称为whisper的数据库库。
Graphite以前安装起来相当困难。幸运的是,在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库。
创建数据库用户和数据库
安装完数据库软件后,我们需要为Graphite创建一个PostgreSQL用户和数据库。
我们可以使用psql
命令以postgres
系统用户的身份登录到交互式的PostgreSQL提示符中:
sudo -u postgres psql
现在,我们需要创建一个数据库用户帐户,Django将用它来操作我们的数据库。我们将用户称为graphite
。为这个用户选择一个安全的密码:
CREATE USER graphite WITH PASSWORD '<span class="highlight">password</span>';
现在,我们可以创建一个数据库,并将我们的新用户指定为其所有者。我们也将称这个数据库为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 = '<span class="highlight">a_salty_string</span>'
接下来,我们应该指定时区。这将影响我们图表上显示的时间,因此设置它很重要。将其设置为您的时区,如此列表中“TZ”列所指定的那样。
TIME_ZONE = '<span class="highlight">America/New_York</span>'
我们还希望为保存图表数据配置身份验证。当我们同步数据库时,我们将能够创建用户帐户,但我们需要通过取消注释此行来启用身份验证:
USE_REMOTE_USER_AUTHENTICATION = True
接下来,查找DATABASES
字典定义。我们要更改值以反映我们的Postgres信息。您应该更改NAME
、ENGINE
、USER
、PASSWORD
和HOST
键。
完成后,它应该看起来像这样:
DATABASES = { 'default': { 'NAME': '<span class="highlight">graphite</span>', 'ENGINE': 'django.db.backends.<span class="highlight">postgresql_psycopg2</span>', 'USER': '<span class="highlight">graphite</span>', 'PASSWORD': '<span class="highlight">password</span>', 'HOST': '<span class="highlight">127.0.0.1</span>', 'PORT': '' } }
红色区域是您需要更改的值。确保您将密码修改为您在Postgres中为graphite
用户选择的密码。
还要确保设置HOST
参数。如果将其留空,Postgres将认为您正在尝试使用对等身份验证进行连接,这在我们的情况下不会正确进行身份验证。
完成后保存并关闭文件。
同步数据库
现在我们已经填写了数据库部分,我们可以同步数据库以创建正确的结构。
您可以通过输入以下命令来执行此操作:
sudo graphite-manage syncdb
系统会要求您为数据库创建一个超级用户帐户。创建一个新用户,以便您可以登录到界面中。您可以随意命名。这将允许您保存您的图表并修改界面。
配置 Carbon
现在我们有了一个数据库,我们可以开始配置 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
在文件中,您会找到类似以下的条目:
[carbon]
pattern = ^carbon\.
retentions = 60:90d
[default_1min_for_1day]
pattern = .*
retentions = 60s:1d
文件当前已经定义了两个部分。第一个部分用于决定如何处理来自 Carbon 本身的数据。实际上,Carbon 被配置来存储一些关于自身性能的指标。底部的定义是一个通用的定义,旨在适用于任何未被其他部分匹配的数据。它定义了一个默认策略。
方括号中的词是用于定义新定义的部分标题。在每个部分下面,有一个模式定义和一个保留策略。
模式定义是一个正则表达式,用于匹配发送到 Carbon 的任何信息。发送到 Carbon 的信息包括度量名称,这就是这个检查的内容。在第一个示例中,模式检查度量是否以字符串 “carbon.
” 开头。
保留策略由一组数字定义。每组由度量间隔(记录度量的频率)、冒号和存储这些值的时间长度组成。您可以用逗号分隔多组数字。
为了演示,我们将定义一个新的模式,以匹配稍后我们将使用的测试值。
在默认部分之前,添加另一个部分用于我们的测试值。使其看起来像这样:
[test]
pattern = ^test\.
retentions = 10s:10m,1m:1h,10m:1d
这将匹配任何以 “test.
” 开头的度量。它将以三种不同的详细程度存储它收集的数据。第一个存档定义(10s:10m
)将每十秒创建一个数据点。它仅存储这些值十分钟。
第二个存档(1m:1h
)将每分钟创建一个数据点。它将收集过去一分钟的所有数据(因为前一个存档每十秒创建一个数据点,所以会有六个数据点),并将其聚合以创建数据点。默认情况下,它通过对点进行平均值来执行此操作,但我们稍后可以调整这一点。它以这种详细程度存储数据一小时。
将要创建的最后一个存档(10m:1d
)将每十分钟创建一个数据点,以相同的方式聚合数据。它将存储这些数据一天。
当我们从 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]
pattern = \.min$
xFilesFactor = 0.1
aggregationMethod = min
部分名称和模式与 storage-schemas
文件完全相同。这只是一个任意名称和一个用于匹配您正在定义的度量的模式。
XFilesFactor
是一个有趣的参数,它允许您指定 Carbon 应该具有的进行聚合的最低百分比值。默认情况下,所有值都设置为 0.5
,这意味着如果要创建聚合点,必须有 50% 的更详细数据点可用。
这可以用于确保您不会创建可能误代实际情况的数据点。例如,如果由于网络问题而丢弃了 70% 的数据,您可能不希望创建仅真实代表 30% 数据的数据点。
接下来定义聚合方法。可能的值包括 average、sum、last、max 和 min。它们相当直观,但非常重要。选择错误的值将导致您的数据以不正确的方式记录。正确的选择完全取决于您实际跟踪的度量是什么。
注意:重要的是要意识到,如果您发送的 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 界面了。
在您的 Web 浏览器中,访问服务器的域名或 IP 地址:
http://<span class="highlight">server_domain_name_or_IP</span>
您应该会看到如下所示的屏幕:
!Graphite 默认界面
在继续之前,您应该登录,以便保存可能进行的任何图形设置。单击顶部菜单栏上的 “登录” 按钮,并输入在同步 Django 数据库时配置的用户名和密码。
接下来,如果您在左侧窗格中展开 Graphite
,您应该会看到一个名为 Carbon 的条目。这是您可以找到有关 Carbon 记录的数据图形的地方。单击其中的一些选项。在这里,我正在绘制有关接收的指标和更新操作指标的图形:
!Graphite 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 分钟的数据。在测试指标的图形上,单击一个白色矩形带有绿色箭头的图标。当鼠标悬停在上面时,它将显示 “选择最近的数据”:
!Graphite 最近的数据
从弹出窗口中选择 8 分钟。单击 “更新图形” 图标以获取最新数据。您应该会看到一个几乎没有信息的图形。这是因为您只发送了一些值,每个值都是 “4”,因此没有变化。
但是,如果您查看过去 15 分钟的图形(假设您发送了几次命令,间隔大于 10 秒但小于一分钟),您应该会看到不同的情况:
!Graphite 聚合
这是因为我们的第一个存档不保存 15 分钟的数据,因此 Graphite 查看我们的第二个存档以获取渲染数据。它看起来不同,因为我们向 Graphite 发送了一个 “count” 指标,这与我们的聚合定义之一匹配。
计数聚合告诉 Graphite 在其较大的间隔内收到的值相加,而不是求平均值。正如您所看到的,我们选择的聚合方法非常重要,因为它定义了如何从更详细的点创建概括数据点。
结论
您现在已经安装并设置了 Graphite,但它在功能上仍然相当有限。我们不希望一直手动提供数据,并且希望它在最小间隔内有多个度量时不丢弃数据。我们需要伴随工具来帮助我们解决这些问题。
在下一个指南中,我们将讨论如何设置 collectd,这是一个系统统计信息收集守护程序,可用于提供 Graphite 数据并解决这些限制。在未来的指南中,我们还将介绍如何配置 StatsD 与 Graphite 以及如何更深入地使用 Graphite 界面。