如果您使用监控系统(如Zabbix或Nagios),那么您就知道监控的工作原理。简而言之,它可以描述如下:监控系统接收各种指标(CPU /内存使用,网络利用率等)。一旦其中一个指标的值超出预定阈值,它就会激活相应的触发器,监控系统会通知您其中一个指标超出正常限制。通常手动设置每个度量的阈值,这不太方便。
在本教程中,您将学习如何安装和配置[Skyline- 一个实时异常检测系统。它能够实时分析一组指标,而无需设置或调整每个指标的阈值。它被设计用于需要持续监控的大量时间序列(数十万)的任何地方。
要完成本教程,你需要具备一台已经设置好可以使用sudo
命令的非root账号的CentOS服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。
让我们看一个具有手动设置阈值的监控系统的示例。下图显示了CPU负载的图表。虚线表示触发器的阈值。
图1
在图1中的点1处,已启动进程,并且CPU负载已显着增加。触发器已激活,管理员注意到它。管理员确定它在正常值范围内,并将触发阈值更改为显示为上面的虚线。
经过一段时间后,触发器再次在图1中的第2点触发。管理员发现第二个服务正在定期进行备份并导致负载增加。然后问题出现了:你是否提高了门槛或保持原样,但忽略了警报?
让我们看看第3点。此时,事件负载下降,但未通知管理员,因为未超过阈值。触发器未激活。
这个简单的案例告诉我们,在尝试设置阈值时存在一些困难。很难调整阈值以捕获性能问题而不会触发误报错误或误报错误。
为了帮助解决这些问题,就要创建Skyline。它使用一组非参数算法来对异常指标进行分类。
Skyline包含以下组件:Horizon Agent,Analyzer Agent和Webapp。
Horizon Agent负责收集数据。它有监听器,可以监听传入的数据。
它接受两种格式的数据:pickle(TCP)和MessagePack(UDP)。它读取传入的指标并将它们放入Workers读取的共享队列中。Worker将数据编码到Messagepack中并将其附加到Redis数据库。Horizon Agent还使用Roombas定期修剪和清除旧指标。如果没有这样做,那么所有可用内存将很快耗尽。
Analyzer Agent负责分析数据。它从Redis接收指标列表,运行多个流程,并为每个流程分配指标。每个过程使用几种算法分析数据。每种算法都会报告结果 - 数据是否异常。如果大多数算法报告当前度量标准存在异常,则认为数据异常。
所有异常指标都写入文件。在此文件的基础上,将创建一个映像并在Web应用程序中显示。
Analyzer还可以发送通知:email,HipChat或PagerDuty。电子邮件通知在本文后面配置。
Skyline提供了一个小型Web应用程序来显示异常指标。这是一个使用Flask框架用Python编写的简单Web应用程序。上半部分显示了两个图表 - 过去一小时和过去一天。图表下方是所有异常指标的列表。
Redis是一个开源键值缓存和存储数据库。
Skyline将所有指标和编码时间序列存储在Redis数据库中。当数据点进入时,Horizon工作程序将带有模式[timestamp, value]
的数据点打包到MessagePack编码的二进制字符串中,并将此字符串附加到相应的度量标准键。
图2显示了Skyline组件的交互图。
图2
在安装Skyline之前,您需要完成以下准备:
要安装Skyline,首先安装所需的应用程序,包括一些与Python相关的工具和Apache Web服务器:
sudo yum install httpd gcc gcc-c++ git pycairo mod_wsgi python-pip python-devel blas-devel lapack-devel libffi-devel
从GitHub获取Skyline的最新源文件:
cd /opt
sudo git clone https://github.com/etsy/skyline.git
安装一些必需的Python包:
cd /opt/skyline
sudo pip install -U six
sudo pip install -r requirements.txt
按以下指定顺序安装以下Python包:
sudo pip install numpy
sudo pip install scipy
sudo pip install pandas
sudo pip install patsy
sudo pip install statsmodels
sudo pip install msgpack-python
安装一些包装可能需要很长时间,所以请耐心等待。
其中大多数是用于科学和技术计算的开源Python库。msgpack-python
包是读取和写入MessagePack数据所必需的。
将示例Skyline设置文件复制到正确的文件位置:
sudo cp /opt/skyline/src/settings.py.example /opt/skyline/src/settings.py
创建以下目录:
sudo mkdir /var/log/skyline
sudo mkdir /var/run/skyline
sudo mkdir /var/log/redis
sudo mkdir /var/dump/
如上所述,Skyline将所有指标存储在Redis数据库中,因此您还需要安装它:
sudo yum install redis
启动Skyline和Redis服务:
cd /opt/skyline/bin
sudo redis-server redis.conf
sudo ./horizon.d start
sudo ./analyzer.d start
sudo ./webapp.d start
要测试安装,请运行包含的测试脚本:
python /opt/skyline/utils/seed_data.py
您会看到以下输出:
Loading data over UDP via Horizon...
Connecting to Redis...
Congratulations! The data made it in. The Horizon pipeline seems to be working.
Skyline的安装和基本配置已完成。现在您需要将数据发送到它。
如前所述,Skyline接受两种格式的数据:pickle(TCP)和MessagePack(UDP)。
您可以将自己的脚本或模块编写到您喜欢的监视代理程序中,并使用MessagePack对数据进行编码,以将其发送到Skyline进行分析。Skyline通过UDP接受MessagePack编码字符串形式的指标。MessagePack是一个像JSON这样的对象序列化规范。格式是[<metric name>, [<timestamp>, <value>]]
。MessagePack有一个适用于大多数编程语言的API。可以在MessagePack官方网站上找到更多信息和API示例。
本教程将向您展示如何从Graphite发送数据并收集到Skyline。
Graphite由几个组件组成,其中一个组件是碳中继服务。碳中继将传入的指标转发到另一个Graphite实例以实现冗余。因此,您可以将碳中继服务指向运行Skyline的主机。
图3
图3显示了数据流的示意图。从外部监视代理(数据collectd,diamond,statsd等)或系统(Nagios,Icinga,Sensu等)被转移到石墨。接下来,碳中继将数据转发到Skyline。碳中继,碳缓存和Skyline可以在单个主机上运行,也可以在不同的主机上运行。
您需要配置Graphite,collectd和Skyline以使此数据流正常工作。
如果您之前未将示例relay-rules.conf
复制到碳中继配置文件的正确位置,则必须立即执行此操作:
sudo cp /opt/graphite/conf/relay-rules.conf.example /opt/graphite/conf/relay-rules.conf
让我们打开relay-rules.conf
配置文件进行编辑:
sudo vi /opt/graphite/conf/relay-rules.conf
将您的Skyline主机添加到目的地列表,其中您的SKYLINE HOST是您的Skyline主机的IP地址:
[default]
default = true
destinations = 127.0.0.1:2004, YOUR_SKYLINE_HOST:2024
用于relay-rules.conf
的所有目标也必须在carbon.conf
配置文件中定义。
打开carbon.conf
配置文件以进行此更改:
sudo vi /opt/graphite/conf/carbon.conf
然后找到[relay]
部分,并编辑DESTINATIONS
行:
[relay]
...
DESTINATIONS = 127.0.0.1:2004, YOUR_SKYLINE_HOST:2024
...
完成这些更改后,启动碳中继服务:
sudo systemctl start carbon-relay
如果你当选为密码保护石墨web界面,您必须允许无密码从本地主机访问的天际线工作。
为此,请编辑Graphite配置文件:
sudo vi /etc/httpd/conf.d/graphite.conf
将以下行以红色添加到<Location>
块中:
<Location "/">
AuthType Basic
AuthName "Private Area"
AuthUserFile /opt/graphite/secure/.passwd
Require user sammy
Order Deny,Allow
Deny from all
Allow from localhost
Satisfy Any
</Location>
然后重启Apache服务:
sudo systemctl restart httpd
您还可以配置collectd以将数据发送到Skyline。打开其配置文件:
sudo vi /etc/collectd.conf
将<Plugin write_graphite>
块中的端口号更改为2013
:
<Plugin write_graphite>
. . .
Port "2013"
. . .
然后重启collectd:
sudo systemctl restart collectd.service
为避免混淆,图4显示了具有正确端口号的简化方案。
图4
正确的端口号如下:
注意!如果在同一主机上启动Horizon代理和可选的碳聚合器,则必须更改其端口。默认情况下,它们都设置为相同的端口2024。
Skyline配置文件包含许多设置。打开文件进行编辑:
sudo vi /opt/skyline/src/settings.py
该文件中的每个设置都通过文件本身的信息性注释进行记录。至少,您需要设置以下参数,将参数值替换为您的值:
GRAPHITE_HOST = 'YOUR_GRAPHITE_HOST'
HORIZON_IP = '0.0.0.0'
WEBAPP_IP = 'YOUR_SKYLINE_HOST_IP'
其他选项可以保留其默认值。它们如下:
FULL_DURATION
- 此选项指定数据在Redis中存储并进行分析的最长时间。持续时间越长,分析时间越长,但它们可以帮助降低噪声并提供更准确的异常检测。默认值为86400
秒。CARBON_PORT
- 此选项指定碳端口。默认值是2003
。ANALYZER_PROCESSES
- 此选项指定Skyline分析器将生成的进程数。建议将此参数设置为小于主机上CPU总数的几个参数。默认值是5
。WORKER_PROCESSES
- 此选项指定将从Horizon队列中使用的工作进程数。默认值是2
。PICKLE_PORT
- 此选项指定侦听Graphite的pickle的TCP端口。默认值是2024
。UDP_PORT
- 此选项指定侦听MessagePack编码数据包的UDP端口。默认值是2025
。WEBAPP_PORT
- 此选项指定Skyline webapp的端口。默认值是1500
。进行这些更改后,您必须重新启动相应的应用程序:
sudo /opt/skyline/bin/horizon.d restart
sudo /opt/skyline/bin/analyzer.d restart
sudo /opt/skyline/bin/webapp.d restart
然后您可以打开链接http://your_server_ip:1500
并查看Skyline网页(图5)。它会在找到时显示异常指标。
图5
要让Skyline以其全部容量运行,您需要等到FULL_DURATION
秒数过去。默认情况下,FULL_DURATION
设置为1天(86400
秒)。
您应该等待至少一个小时才能开始跟踪异常情况。这将使Skyline有时间累积有关正常负载水平的信息。在Skyline建立基线时,尽量不要在系统上创建额外负载。
默认情况下,Skyline会在找到的Web界面(http://your_server_ip:1500
)中显示检测到的异常,并且当它们仍在发生时。一旦异常消失,其相应的度量标准将从此界面消失。因此,您必须监控网页以查看这些异常情况,这并不总是很方便。
您可以配置电子邮件警报,以免错过它们。
为此,请打开Skyline配置文件:
sudo vi /opt/skyline/src/settings.py
确保启用警报:
ENABLE_ALERTS = True
然后找到以下ALERTS部分并添加以下模式:
ALERTS = (
(^)("collectd", "smtp", 1800)(^),
)
模式中的第一个值是要监视的进程。在这种情况下,它是collectd.
架构的第二个值是smtp
,代表电子邮件警报。最后一个值1800
以秒为单位。这意味着即使检测到触发器,警报也不会在30分钟(1800秒)内触发多次。修改此值以最好地满足您的需求。
还可以找到以下部分并根据您要使用的电子邮件地址进行修改。电子邮件警报将从`[skyline-alerts@example.com]
`
发送到`[administrator@example.com]
`帐户。
SMTP_OPTS = {
"sender": "(^)skyline-alerts@example.com(^)",
"recipients": {
"collectd": ["(^)administrator@example.com(^)"],
},
}
完成所有这些更改后,您必须重新启动分析器守护程序:
sudo /opt/skyline/bin/analyzer.d restart
要测试Skyline,我们可以使用bash命令创建CPU峰值:
dd if=/dev/zero of=/dev/null
您可以通过按CTRL-C随时停止该命令。几分钟就足以造成异常。
如果在运行此命令时查看Skyline Web界面,您将看到检测到的异常。如图6所示是一个例子。
图6
您可以看到,由于高CPU负载,Skyline组件的速度降低了。所有检测到的异常指标都显示为网页底部的列表。将鼠标悬停在其中一个指标的名称上时,在上方的图表中可以看到最后一小时和当天的相应时间序列。单击度量标准的名称以打开由Graphite生成的更详细的图形(有关示例,请参见图7)。
图7
在此示例中,CPU负载未达到极高值,并且未超过阈值。在这种情况下,传统的监测系统无法找到偏差。之前提到过这种情况(图1,第3点)。
与传统的监控系统不同,Skyline可以快速找到偏差并通知您。
如前所述,Skyline使用一组算法来检测异常。目前实施以下算法:
其中大多数是基于сontrol图表(也称为休哈特图表)和三西格玛规则。他们在计算中使用Python库SciPy和NumPy。
您可以自定义任何使用的算法。您还可以修改,删除或添加新的。为此,您必须编辑配置文件:
sudo vi /opt/skyline/src/analyzer/algorithms.py
该文件中的每个算法都提供了一个小描述。例如,让我们检查以下算法:
def median_absolute_deviation(timeseries):
"""
A timeseries is anomalous if the deviation of its latest datapoint with
respect to the median is X times larger than the median of deviations.
"""
series = pandas.Series([x[1] for x in timeseries])
median = series.median()
demedianed = np.abs(series - median)
median_deviation = demedianed.median()
# The test statistic is infinite when the median is zero,
# so it becomes super sensitive. We play it safe and skip when this happens.
if median_deviation == 0:
return False
test_statistic = demedianed.iget(-1) / median_deviation
# Completely arbitary...triggers if the median deviation is
# 6 times bigger than the median
if test_statistic > 6:
return True
根据您的数据的性质,你可能需要将阈值改变从6
到别的东西- 4
,5
,7
等。
您还可以调整settings.py
文件中的一些设置:
ALGORITHMS = [
'first_hour_average',
'mean_subtraction_cumulation',
'stddev_from_average',
'stddev_from_moving_average',
'least_squares',
'grubbs',
'histogram_bins',
'median_absolute_deviation',
'ks_test',
]
CONSENSUS = 6
ALGORITHMS
选项指定Analyzer将运行的算法。您可以对其中的任何一个进行评论以禁用它们或添加新算法。CONSENSUS
选项指定在度量标准被归类为异常之前必须返回True
的算法数。要提高灵敏度,可以减少此选项,反之亦然。
Skyline在复杂的动态变化的IT系统中得到了充分证明。对于经常对操作系统进行更改并希望在新软件发布后快速检测系统指标异常的程序员可能会有所帮助。
其主要优点包括:
它也有一些缺点:
想要了解更多关于使用Skyline检测异常的相关教程,请前往腾讯云+社区学习更多知识。
参考文献:《How To Detect Anomalies with Skyline on CentOS 7》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。