如何在CentOS7上使用Graphite、Carbon和collectd保持有效的历史日志
介绍
监控系统在运行时接收并积累大量数据。 监控系统运行的时间越长,它收集的数据就越多。
大多数监控系统没有用于长期数据分析和存储的工具。 他们要么保留每次读数,这会导致存储问题,要么会在达到某个阈值时删除旧数据,这会阻止我们长时间分析我们的系统性能。
一些监控系统,例如 Zabbix,能够存储精确和平均数据值,但它们的定制能力非常有限。
时间序列数据库帮助我们解决存储大量历史数据的问题。 时间序列只是随时间变化的数据点序列,时间序列数据库经过优化以存储此类数据。
在本教程中,我们将向您展示如何安装和配置 Graphite - 一种用于存储数字时间序列数据和呈现该数据图形的工具。 它由三个软件组件组成:
- Carbon - 一个监听时间序列数据并使用存储后端写入磁盘的守护进程
- Whisper - 一个类似于 RRDTool 的简单数据库,用于存储时间序列数据
- Graphite-Web - 一个 Django Web 应用程序,它呈现图形并提供功能丰富的可视化和分析所获得的数据
在我们的最终配置中,我们的监控代理将数据点发送到 Carbon,它具有 carbon-relay、carbon-aggregator 和 carbon-cache 组件。 Carbon 将数据写入 Whisper 数据库。 Graphite-Web 将数据显示在网页上,供用户查看。
先决条件
在开始之前,请确保您已完成以下步骤:
- 部署 CentOS 7 Droplet
- 按照 Initial Server Setup 添加 sudo 用户
- 添加交换空间到你的服务器; 示例 4 GB 量很好
- 启用 EPEL(企业 Linux 的额外软件包)存储库:
sudo yum -y install epel-release
更新您的系统:
sudo yum -y update
关于 EPEL 存储库的更多信息可以在 fedoraproject.org 上找到。
第 1 步 — 安装 Graphite 和 Carbon
安装所需的应用程序,包括 Python 相关工具和 Apache Web 服务器:
sudo yum install httpd mod_wsgi python-pip python-devel git pycairo libffi-devel
从 GitHub 获取 Graphite 和 Carbon 的最新源文件:
cd /usr/local/src sudo git clone https://github.com/graphite-project/graphite-web.git sudo git clone https://github.com/graphite-project/carbon.git
检查要求:
python /usr/local/src/graphite-web/check-dependencies.py
您将看到以下消息:
[REQUIRED] Unable to import the 'whisper' or 'ceres' modules, please download this package from the Graphite project page and install it. . . . 6 optional dependencies not met. Please consider the optional items before proceeding. 5 necessary dependencies not met. Graphite will not function until these dependencies are fulfilled.
所以你必须安装缺少的模块。 首先安装gcc
:
sudo yum install gcc
然后安装模块:
sudo pip install -r /usr/local/src/graphite-web/requirements.txt
然后查看django-tagging
包的版本:
pip show django-tagging
如果包的版本低于 0.3.4,那么你应该更新它:
sudo pip install -U django-tagging
再次检查要求:
python /usr/local/src/graphite-web/check-dependencies.py
现在您应该看到以下输出:
[OPTIONAL] Unable to import the 'ldap' module, do you have python-ldap installed for python 2.7.5? Without python-ldap, you will not be able to use LDAP authentication in the graphite webapp. [OPTIONAL] Unable to import the 'python-rrdtool' module, this is required for reading RRD. 2 optional dependencies not met. Please consider the optional items before proceeding. All necessary dependencies are met.
在本教程中,我们不需要 LDAP 身份验证或 RRD 数据库。
安装碳:
cd /usr/local/src/carbon/ sudo python setup.py install
安装网络应用程序:
cd /usr/local/src/graphite-web/ sudo python setup.py install
现在所有组件都已安装,您可以配置 Graphite。
Graphite 包含几个示例配置文件。 您只需要复制和编辑它们,如下一步所示。
第 2 步 - 配置 Carbon
Carbon 包括多项服务:
carbon-cache
- 接受指标并将它们写入磁盘carbon-relay
- 复制数据carbon-aggregator
- 在carbon-cache
前面运行,以随着时间的推移缓冲指标,然后将它们转发到 Whisper
最后两个是可选的。
碳配置文件
主配置文件是 carbon.conf
。 它定义了每个 Carbon 守护进程的设置。
让我们复制示例文件:
sudo cp /opt/graphite/conf/carbon.conf.example /opt/graphite/conf/carbon.conf
此文件中的每个设置都通过文件本身中的信息注释进行记录。 您可以检查它们,但对于我们的教程,默认设置是合适的。
存储模式
接下来,您需要编辑描述存储指标的保留率的 storage-schemas.conf
文件。 它将度量路径与模式相匹配,并告诉 Whisper 要存储的数据点的频率和历史记录。
数据占用的磁盘空间大小取决于该文件中的设置。
首先,复制示例文件:
sudo cp /opt/graphite/conf/storage-schemas.conf.example /opt/graphite/conf/storage-schemas.conf
让我们打开文件进行编辑:
sudo vi /opt/graphite/conf/storage-schemas.conf
默认情况下,它包含两个部分:
[carbon] pattern = ^carbon\. retentions = 60:90d [default_1min_for_1day] pattern = .* retentions = 60s:1d
每个部分都有:
- 名称,在方括号内指定
- 正则表达式,在
pattern=
之后指定 - 保留率线,在
retentions=
之后指定
例如,让我们添加一个新部分:
[zabbix_server] pattern = ^Zabbix_server\. retentions = 30s:7d,5m:30d,10m:1y
正则表达式模式将匹配任何以 Zabbix_server
开头的指标。 此外,此示例使用多个保留:
- 每个数据点代表 30 秒,我们希望以这种频率最多保留 7 天的数据
- 过去 30 天的所有历史数据以 5 分钟的间隔存储
- 过去一年的所有历史数据都以 10 分钟的间隔存储
当超过保留阈值时,Whisper 将对指标进行下采样。
注意: 这些部分按从上到下的顺序应用,并使用与度量名称匹配的第一个模式!
存储聚合(可选)
接下来,您可能需要 storage-aggregation.conf
文件,它定义了如何将数据聚合到较低精度的保留。 该文件是可选的。 如果不存在,将使用默认值。
复制示例文件:
sudo cp /opt/graphite/conf/storage-aggregation.conf.example /opt/graphite/conf/storage-aggregation.conf
让我们看一下文件:
sudo vi /opt/graphite/conf/storage-aggregation.conf
默认情况下,它包含 4 个部分:
[min] pattern = \.min$ xFilesFactor = 0.1 aggregationMethod = min [max] pattern = \.max$ xFilesFactor = 0.1 aggregationMethod = max [sum] pattern = \.count$ xFilesFactor = 0 aggregationMethod = sum [default_average] pattern = .* xFilesFactor = 0.5 aggregationMethod = average
与 storage-schemas.conf
文件类似,每个部分都有一个在方括号内指定的名称,并在 pattern=
之后指定一个正则表达式。 每个部分还有两个附加参数:
xFilesFactor
指定前一个保留级别的插槽中的哪一部分必须具有非空值才能聚合为非空值。 默认为0.5
aggregationMethod
指定用于聚合值的函数(average
、sum
、min
、max
、last
)下一个保留级别。 默认为average
默认情况下,当数据达到下一个保留间隔时,Graphite 将对所有以 .count
结尾的指标求和,分别获取所有以 .min/.max
结尾的指标的最小值/最大值,并对其他所有指标进行平均。
继电器(可选)
carbon-relay
用于复制和分片。 carbon-relay
可以与(或代替)carbon-cache
一起运行,并将传入的指标中继到在不同端口或主机上运行的多个后端 carbon-caches
。
要配置到其他主机的数据传输,您必须编辑相应的配置文件。 首先,复制示例文件:
sudo cp /opt/graphite/conf/relay-rules.conf.example /opt/graphite/conf/relay-rules.conf
打开文件进行编辑:
sudo vi /opt/graphite/conf/relay-rules.conf
默认情况下,它包含一个部分,将数据发送到 localhost:
[default] default = true destinations = 127.0.0.1:2004:a, 127.0.0.1:2104:b
(:a
和 :b
表示在同一主机上可以运行多个 carbon-cache 实例)
下面的示例显示 carbon-relay
设置将数据从 Zabbix_server
发送到一台主机,并将所有其他数据发送到其他三台主机:
[zabbix] pattern = ^Zabbix_server\. destinations = 10.0.0.4:2004 [default] default = true destinations = 127.0.0.1:2004, 10.0.0.2:2024, 10.0.0.3:2004
第一部分中的正则表达式模式将匹配以 Zabbix_server
开头的任何度量,并且所有数据都将传输到 IP 地址为 10.0.0.4
的主机。 所有其他数据将被传输到 localhost 和另外两个主机。
relay-rules.conf
中列出的所有目的地也必须在 /opt/graphite/conf/carbon.conf
文件中的 [relay]
部分的 DESTINATIONS
设置中列出:
sudo vi /opt/graphite/conf/carbon.conf
我们添加了三个新 IP:
[relay] ... DESTINATIONS = 127.0.0.1:2004, 10.0.0.2:2024, 10.0.0.3:2004, 10.0.0.4:2004 ...
聚合(可选)
carbon-aggregator
用于在将指标报告给 Whisper 数据库之前随时间缓冲指标。 可以在carbon-cache
前面运行。 聚合规则允许您将多个指标添加在一起,从而减少在每个 URL 中汇总许多指标的需要。
要配置数据聚合,首先复制示例文件:
sudo cp /opt/graphite/conf/aggregation-rules.conf.example /opt/graphite/conf/aggregation-rules.conf
这个文件中每一行的格式应该如下:
output_template (frequency) = method input_pattern
这将捕获与 input_pattern
匹配的任何接收到的指标,以计算聚合指标。 计算将每 frequency
秒发生一次。 可用的聚合方法有:sum
或 avg
。 聚合指标的名称将来自 output_template
填充从 input_pattern
捕获的任何字段。
例如,假设您的组织有 25 个分支机构,并且您想要构建其互联网总流量的图表。
- collectd.monitoring-host.branch-01.if_octets.rx
- collectd.monitoring-host.branch-02.if_octets.rx
- collectd.monitoring-host.branch-03.if_octets.rx
- …
- collectd.monitoring-host.branch-25.if_octets.rx
您可以存储来自每个分支机构的数据,为每个分支机构构建图表,然后对它们求和。
然而,这种类型的操作代价高昂:为了呈现汇总图,您首先需要读取 25 个不同的指标,然后需要通过求和函数组合结果,最后构建图。
如果您只对总流量感兴趣,您可以预先计算这些值。 为此,您可以定义匹配正则表达式上的指标的规则,将它们缓冲指定的时间量,对缓冲的数据应用函数,并将结果存储在单独的指标中。 所以配置如下:
collectd.monitoring-host.branches.if_octets.rx (60) = sum collectd.monitoring-host.*.if_octets.rx
鉴于此配置,指标将被缓冲 60 秒,使用 sum 函数组合,并存储到新的指标文件中。
第 3 步 — 启动 Carbon 即服务
配置 Carbon 的初始化脚本。
首先,将它们复制到 /etc/init.d/
并使其可执行:
sudo cp /usr/local/src/carbon/distro/redhat/init.d/carbon-* /etc/init.d/ sudo chmod +x /etc/init.d/carbon-*
开始carbon-cache
:
sudo systemctl start carbon-cache
如果您选择使用它们,请启动 carbon-relay
和 carbon-aggregator
:
sudo systemctl start carbon-relay sudo systemctl start carbon-aggregator
Carbon 的配置完成:Carbon 正在运行并准备好接收数据。 您现在可以配置 Web 界面。
第 4 步 — 配置 Graphite-Web 应用程序
Graphite-Web 是在 Apache/mod_wsgi 下运行的 Django Web 应用程序。
复制示例设置文件:
sudo cp /opt/graphite/webapp/graphite/local_settings.py.example /opt/graphite/webapp/graphite/local_settings.py
打开文件进行编辑:
sudo vi /opt/graphite/webapp/graphite/local_settings.py
找到 SECRET_KEY
并输入一个唯一值。 这用于提供加密签名; 你可以把任何东西放在这里,只要它是独一无二的。 找到TIME_ZONE
更新到时区进行安装。 如果需要,请参阅 时区列表 。
. . . SECRET_KEY = 'enter_your_unique_secret_key_here' . . . TIME_ZONE = 'America/Chicago' . . .
初始化一个新数据库:
cd /opt/graphite sudo PYTHONPATH=/opt/graphite/webapp/ django-admin.py syncdb --settings=graphite.settings
您将看到以下输出。 提示将询问您一些问题,以便为数据库创建超级用户帐户:
Operations to perform: Synchronize unmigrated apps: url_shortener, account, dashboard, tagging, events Apply all migrations: admin, contenttypes, auth, sessions Synchronizing apps without migrations: Creating tables... Creating table account_profile . . . Applying sessions.0001_initial... OK You have installed Django's auth system, and don't have any superusers defined. Would you like to create one now? (yes/no): yes Username (leave blank to use 'root'): root Email address: sammy@example.com Password: password Password (again): password Superuser created successfully.
运行以下命令以收集单个目录中的所有静态文件:
sudo PYTHONPATH=/opt/graphite/webapp/ django-admin.py collectstatic --settings=graphite.settings
您将看到以下输出。 出现提示时回答 yes
:
You have requested to collect static files at the destination location as specified in your settings: /opt/graphite/static This will overwrite existing files! Are you sure you want to do this? Type 'yes' to continue, or 'no' to cancel: yes Copying '/opt/graphite/webapp/content/js/browser.js' Copying '/opt/graphite/webapp/content/js/completer.js' ... 407 static files copied to '/opt/graphite/static'.
使 apache
用户拥有相应的 Graphite:
sudo chown -R apache:apache /opt/graphite/storage/ sudo chown -R apache:apache /opt/graphite/static/ sudo chown -R apache:apache /opt/graphite/webapp/
要运行 Web 应用程序,您需要 graphite.wsgi
文件。 此文件包含代码 mod_wsgi
在启动时执行以获取应用程序对象。 复制示例文件:
sudo cp /opt/graphite/conf/graphite.wsgi.example /opt/graphite/conf/graphite.wsgi
配置阿帕奇。 要了解有关 Apache 虚拟主机的更多信息,请参阅 本教程 。 从 Graphite 复制示例虚拟主机文件:
sudo cp /opt/graphite/examples/example-graphite-vhost.conf /etc/httpd/conf.d/graphite.conf
打开文件进行编辑:
sudo vi /etc/httpd/conf.d/graphite.conf
确保您的 ServerName
设置为您的域或 IP 地址。 Alias
行应该已经正确设置。 在其下方添加 <Directory>
块。
. . . ServerName your_server_ip . . . Alias /static/ /opt/graphite/static/ <Directory /opt/graphite/static/> Require all granted </Directory>
保存并关闭文件。
第 5 步 — 密码保护 Graphite(推荐)
默认情况下,任何知道运行 Web 应用程序的服务器地址的人都可以查看任何数据。 为了防止这种情况,您可以设置密码访问。
创建一个新文件夹并设置权限:
sudo mkdir /opt/graphite/secure sudo chown -R apache:apache /opt/graphite/secure
使用 htpasswd
创建一个新的用户名和密码,以限制对 Graphite-Web 应用程序的访问。 在下面的示例中,您可以看到如何创建用户 sammy
并添加新密码:
sudo htpasswd -c /opt/graphite/secure/.passwd sammy New password: password Re-type new password: password Adding password for user sammy
配置阿帕奇。 在 Require user
行中,您必须指定与上一步中相同的名称:
sudo vi /etc/httpd/conf.d/graphite.conf
在主虚拟主机块的任何位置添加这个新的 <Location>
块:
<Location "/"> AuthType Basic AuthName "Private Area" AuthUserFile /opt/graphite/secure/.passwd Require user sammy </Location>
保存并关闭文件。
第 6 步 — 运行 Graphite-Web
启动 Apache 服务并包含它以在启动时启动:
sudo systemctl start httpd sudo systemctl enable httpd
安装完成! 启动浏览器并转到地址 http://your_server_ip/
。
输入您在步骤 5 中设置的用户名和密码。
您将看到以下内容:
第 7 步 — 从 collectd 发布指标
Graphite 可以使用来自许多不同监控服务的数据。 在本例中,我们将使用 collectd。 它是一个守护进程,它定期收集系统性能统计信息并提供以各种方式存储或发送值的机制。
有关 collectd 的更多信息,请访问 官方网站 。
安装收集:
sudo yum install collectd
配置文件包含许多设置。 打开文件进行编辑:
sudo vi /etc/collectd.conf
完成以下:
- 在全局设置中设置
Hostname
。 这可以是您想要的任何名称,并将在 Web 界面中用于指定此主机。
Hostname "Monitor"
- 取消注释
write_graphite
插件设置
LoadPlugin write_graphite
- 将
<Plugin write_graphite>
块中的设置编辑为以下内容:
<Plugin write_graphite> <Node "localhost"> Host "localhost" Port "2003" Protocol "tcp" LogSendErrors true Prefix "collectd." # Postfix "collectd" StoreRates true AlwaysAppendDS false EscapeCharacter "_" </Node> </Plugin>
write_graphite
插件主要参数:
Host
(required) — Carbon 收集代理的主机名。 在我们的例子中,它在本地主机上工作Port
(required) — 碳收集代理使用的端口。 在我们的示例中,carbon-relay
侦听端口2003
Prefix
— 发送到 Carbon 的主机名前面的前缀字符串。 我们添加了这一点,以便 Graphite 可以自动对主机进行分组Postfix
— 发送到 Carbon 的主机名前面的后缀字符串。 我们不需要这个选项,因为我们设置了前缀,所以你可以禁用它
开始收集以开始向 Graphite 发送指标:
sudo systemctl start collectd.service
注意: 要解决问题,请使用命令sudo systemctl status collectd.service
检查ollectd状态的状态。 这将向您显示写入 Graphite 是否有任何问题。
Collectd 立即开始向 Graphite 发送数据。 刷新网页。 如果展开 Metrics 文件夹,您应该会看到列出的 collectd。 一段时间后,您将能够看到漂亮的数据图表,如下所示。
第 8 步 — 处理数据
Graphite 具有复杂的数据显示选项。 例如,要获得与上图类似的图像,您需要执行几个操作。
- 在左侧面板中,单击 Metrics > collectd > Monitor(或您在步骤 7 中配置的
Hostname
)> load[ X137X] > 加载 > 中期。 您将看到负载平均值的图表。
- 单击图形下方的 Graph Data 按钮。
- 单击弹出窗口右侧的添加按钮。
- 粘贴以下行:
collectd.Monitor.memory.*
。 这将选择所有与内存相关的图表。 如果您为主机使用了不同的名称,请使用该名称而不是Monitor
。 - 按 确定 。 您将在一个屏幕上看到多个图表。 由于规模的不同,负荷曲线变成了一条直线。 要解决此问题,您必须对图形执行以下操作。
- 再次单击 Graph Data 按钮。
- 选择
collectd.Monitor.load.load.midterm
行。 - 单击应用功能按钮。
- 选择特殊 > 在第二个Y轴上绘制
- 再次单击应用功能。
- 选择 特殊 > 颜色。
- 输入
black
并按OK。 - 选择
collectd.Monitor.memory.*
行。 - 单击应用功能。
- 选择 Special > Draw Stacked。
- 您将看到类似于第 7 步结束时显示的图像。
这只是显示服务器数据的一种方式。 您可以在同一张图表上混合和组合不同的数据、应用不同的函数、缩放数据、计算移动平均线、预测数据等等。
结论
Graphite 是用于存储和分析时间序列数据的强大工具。 完成本教程后,您应该大致了解如何安装它、进行基本设置、将数据放入其中以及操作累积的数据。
石墨可用作仪表板。 您可以监控关键指标:CPU 利用率、内存使用率、网络接口利用率等。
Graphite 具有许多用于数据分析的功能。 您可以使用这些函数对序列数据进行转换、组合和执行计算。 大多数功能可以按顺序应用。 例如,您可以汇总来自所有分支机构的传入流量,然后将其与传出流量的总和进行比较。 或者您可以汇总来自所有分支机构的所有传入和传出流量,构建长时间的汇总图,并查看未来容量规划的趋势。