如何在 CentOS 7 上使用 Skyline 检测异常情况

介绍

如果使用监控系统(如Zabbix或Nagios),那么你知道监控是如何运作的. 简言之,可以描述如下: 监测系统得到各种衡量标准(CPU/模拟使用、网络利用等)。 一旦其中1个度量衡的值超出预定阈值,它就会激活相应的触发器,而监测系统通知您,其中1个度量衡在正常极限之外. 每个度量的阈值通常由人工设定,这并不总是方便的.

在本教程中,您将学习如何安装和配置 Skyline - 一个实时异常检测系统. 它能够实时分析一组指标,而不设定或调整每个门槛。

标签: Threshold Triggers

让我们看看一个手动设置门槛的监控系统的例子。下面的图表显示了CPU负载的图表。

Figure 1 Figure 1

在图 1 的第 1 点,一个过程已经开始,CPU 负载显著增加了。触发器已被激活,管理员注意到它。

过了一段时间后,触发器在图 1 的第 2 点再次启动,管理员发现第二个服务正在定期备份并导致负载增加。

现在,事件负载下降了,但管理员没有被告知,因为门槛没有超过。

这个简单的案例表明,试图设置门槛时存在一些困难,很难调整门槛值以捕捉性能问题,而不会触发虚假正面错误或虚假负面错误。

为了帮助解决这些问题,创建了 Skyline ,它使用了一组非参数算法来分类异常指标。

Skyline 组件

Skyline 由以下组件组成:Horizon Agent、Analyzer Agent 和 Webapp。

名称:Horizon Agent

Horizon Agent 负责收集数据. 它有 Listeners ,可以听取入口数据。

它接受两个格式的数据: pickle (TCP) 和 MessagePack (UDP) 它读取输入的指标,并将其放置在共享的队列中,由 Workers 读取。

分析员代理

分析器代理负责分析数据. 它从 Redis 收到指标列表,运行多个流程,并将指标分配给每个流程. 每个流程使用多个算法分析数据. 每个算法报告结果 - 无论数据是否异常。

所有异常指标都写在一个文件中. 基于此文件,在 Web 应用程序中创建并显示图像。

分析器也可以发送通知:电子邮件、HipChat 或 PagerDuty. 电子邮件通知将在本文中稍后配置。

Webapp 网站

Skyline 提供了一個小型網頁應用程式,可顯示異常指標. 它是一個簡單的網頁應用程式,用 Python 寫成 Flask 框架. 上方顯示兩個圖表 — 過去一小時和過去一天. 下方的圖表是所有異常指標的列表。

Redis 数据库

Redis是一个开源的关键值缓存和存储数据库。

Skyline 将所有指标和编码时间序列存储在一个 Redis 数据库中. 当数据点进入时,Horizon 工人将数据点包装到一个由 MessagePack 编码的二进制字符串中,并将该字符串附加到相应的指标密钥中。

_ 图 2_ 显示了 Skyline 组件的相互作用图。

Figure 2 Figure 2

前提条件

在您可以安装 Skyline 之前,您需要完成以下前提条件:

  • 部署 CentOS 7 Droplet. * 通过遵循 初始服务器设置教程添加一个 sudo 用户. 本教程中的所有命令都应该作为非根用户运行。 * 添加交换空间到您的服务器。

第1步:安装Skyline和Redis

要安装 Skyline,先安装所需的应用程序,包括一些与Python相关的工具和Apache Web 服务器:

1sudo yum install httpd gcc gcc-c++ git pycairo mod_wsgi python-pip python-devel blas-devel lapack-devel libffi-devel

从 GitHub 获取 Skyline 的最新源文件:

1cd /opt
2sudo git clone https://github.com/etsy/skyline.git

安装一些需要的 Python 包:

1cd /opt/skyline
2sudo pip install -U six
3sudo pip install -r requirements.txt

在此规定的顺序下安装下列 Python 包:

1sudo pip install numpy
2sudo pip install scipy
3sudo pip install pandas
4sudo pip install patsy
5sudo pip install statsmodels
6sudo pip install msgpack-python

安装某些软件包可能需要很长时间,所以请耐心。

其中大多数是用于科学和技术计算的开源Python库,而msgpack-python包是读取和写入MessagePack(http://msgpack.org/)数据所必需的。

将示例 Skyline 设置文件复制到正确的文件位置:

1sudo cp /opt/skyline/src/settings.py.example /opt/skyline/src/settings.py

创建以下目录:

1sudo mkdir /var/log/skyline
2sudo mkdir /var/run/skyline
3sudo mkdir /var/log/redis
4sudo mkdir /var/dump/

正如我们上面提到的,Skyline 将所有指标存储在 Redis 数据库中,因此您还需要安装它:

1sudo yum install redis

您可以在教程中找到有关 Redis 的更多信息 如何安装和使用 Redis

启动 Skyline 和 Redis 服务:

1cd /opt/skyline/bin
2sudo redis-server redis.conf
3sudo ./horizon.d start
4sudo ./analyzer.d start
5sudo ./webapp.d start

要测试安装,运行包含的测试脚本:

1python /opt/skyline/utils/seed_data.py

你应该看到以下结果:

1Loading data over UDP via Horizon...                                           
2Connecting to Redis...                                                         
3Congratulations! The data made it in. The Horizon pipeline seems to be working.

Skyline 的安装和基本配置已经完成,现在您需要向其发送数据。

步骤2 - 将数据带入天线

如前所述,Skyline 接受两种格式的数据: pickle (TCP) 和 MessagePack (UDP)。

您可以将自己的脚本或模块写给您最喜欢的监控代理,并让它用 MessagePack 编码数据,以便将其发送到 Skyline 进行分析。Skyline 接受以 UDP 形式的 MessagePack 编码字符串的指标。MessagePack 是一种对象序列化规格,如 JSON。 格式为 `, [, ]]。 MessagePack 拥有大多数编程语言的 API。 更多信息和 API 示例可以在 MessagePack 官方网站找到。

本教程将向您展示如何从 Graphite 发送数据并收集到 Skyline。

从图形中获取数据

Graphite 由几个组件组成,其中一个是 carbon-relay 服务. Carbon-relay 将输入的指标转发到另一个 Graphite 实例中以获取冗余性。

Figure 3 Figure 3

图3显示了数据流的方案图。从外部监测代理(collectd,diamond,statsd等)或系统(Nagios,Icinga,Sensu等)的数据转移到格拉菲特。接下来,碳传输将数据转移到Skyline。碳传输,碳缓存和Skyline可以在单个主机上或单独的主机上运行。

您需要配置 Graphite、collected 和 Skyline 以使此数据流工作。

如果您以前没有将例子 `relay-rules.conf' 复制到碳-relay 配置文件的正确位置,您现在必须这样做:

1sudo cp /opt/graphite/conf/relay-rules.conf.example /opt/graphite/conf/relay-rules.conf

让我们打开relay-rules.conf配置文件来编辑:

1sudo vi /opt/graphite/conf/relay-rules.conf

将您的 Skyline 主机添加到目的地列表中,其中 YOUR_SKYLINE_HOST 是您的 Skyline 主机的 IP 地址:

1[label /opt/graphite/conf/relay-rules.conf]
2[default]
3default = true
4destinations = 127.0.0.1:2004, YOUR_SKYLINE_HOST:2024

在「relay-rules.conf」中使用的所有目的地也必须在「carbon.conf」配置文件中定义。

打开carbon.conf配置文件以进行此更改:

1sudo vi /opt/graphite/conf/carbon.conf

然後找到「[轉移]」部分,並編輯「目的地」行:

1[label /opt/graphite/conf/carbon.conf]
2[relay]
3...
4DESTINATIONS = 127.0.0.1:2004, YOUR_SKYLINE_HOST:2024
5...

一旦您完成了这些更改,请启动碳连接服务:

1sudo systemctl start carbon-relay

允许 Skyline 访问图形网

CentOS 7 上如何使用 Graphite, Carbon, and collectd 有效保留历史日志中,如果您选择通过密码保护 Graphite 网页接口,则必须允许 localhost 无密码访问 Skyline。

要做到这一点,请编辑 Graphite 配置文件:

1sudo vi /etc/httpd/conf.d/graphite.conf

<位置>块中添加以下红色的行:

 1[label /etc/httpd/conf.d/graphite.conf]
 2<Location "/"> 
 3  AuthType Basic
 4  AuthName "Private Area" 
 5  AuthUserFile /opt/graphite/secure/.passwd
 6  Require user sammy
 7    Order Deny,Allow
 8    Deny from all
 9    Allow from localhost
10    Satisfy Any
11</Location>

然后重新启动 Apache 服务:

1sudo systemctl restart httpd

从 Collectd 获取数据

您也可以配置 collectd 以将数据发送到 Skyline. 打开其配置文件:

1sudo vi /etc/collectd.conf

更改<Plugin write_graphite>块中的端口号为2013:

1[label /etc/collectd.conf]
2<Plugin write_graphite>
3    . . .		
4    Port "2013"
5    . . .

然后重新启动收集:

1sudo systemctl restart collectd.service

为了避免混淆,图4显示了一种简化方案,使用正确的端口号码。

Figure 4 Figure 4

正确的端口号码如下:

  1. Carbon-relay listens for incoming data in plaintext format on port 2013 2. Carbon-relay sends the data in pickle format 3. Carbon-cache listens for incoming data in pickle format on port 2004 4. Horizon agent listens for incoming data in pickle format on port 2024

注意!如果您在同一主机上启动 Horizon 代理和可选的碳聚合器,则必须更改其端口。

第3步:设置天线

Skyline 配置文件包含许多设置. 打开文件以编辑:

1sudo vi /opt/skyline/src/settings.py

该文件中的每个设置都通过文件本身的信息评论来记录,至少您需要设置以下参数,以您的值代替红色文本:

  • GRAPHITE_HOST = 'Your_GRAPHITE_HOST' * HORIZON_IP = '0.0.0.0' * `WEBAPP_IP = 'Your_SKYLINE_HOST_IP'

其他选项可以留给它们的默认值,它们如下:

  • `FulL-Dulation ' -- -- 本备选案文具体规定了将数据储存在Redis并进行分析的最大时间。 较长的长度需要较长的时间进行分析,但它们能帮助减少噪音并提供更准确的异常探测. 默认值为"86400"秒.
  • 港口 ' - 此选项指定了碳端口 。 默认值为2003'。
  • `ANALYZER-PROECESSES'-本选项具体规定了天线分析器将产生的过程的数量。 建议将这个参数设置为数个小于您主机的CPU总数. 默认值为"5".
  • WORKER_PROCESESES'——本选项规定从地平线队列中消耗的工人流程数量。 默认值为2'。
  • 港口 ' - 此选项指定了监听 Graphite 泡菜的 TCP 端口 。 默认值为2024'。
  • UDP_Port ' - 此选项指定了收听 MessagePack 编码包的 UDP 端口 。 默认值为2025'。 *WEBAPP_Port ' - 此选项指定了 Skyline Webapp 的端口 。 默认值为1500'。 .

完成这些更改后,您必须重新启动相应的应用程序:

1sudo /opt/skyline/bin/horizon.d restart
2sudo /opt/skyline/bin/analyzer.d restart
3sudo /opt/skyline/bin/webapp.d restart

然后你可以打开链接 http://your_server_ip:1500 并查看天线网页(图5)。

Figure 5 Figure 5

若要讓 Skyline 運行滿足容量,您需要等到「FULL_DURATION」秒過了,預設為「FULL_DURATION」為 1 天(「86400」秒)。

您应该至少等待一个小时才能开始跟踪异常,这会让Skyline有时间收集有关正常负载水平的信息,不要在Skyline建立基线时对系统产生额外的负载。

步骤4:启用电子邮件警报

默认情况下,Skyline 在其 Web 界面(http://your_server_ip:1500)中显示已检测到的异常,因为它们被发现,而它们仍在发生。一旦异常消失,其相应的指标从此界面中消失。因此,您必须监控 Web 页面以查看这些异常,这并不总是方便。

您可以配置电子邮件警报,以免错过它们。

要做到这一点,打开 Skyline 配置文件:

1sudo vi /opt/skyline/src/settings.py

确保已启用警报:

1[label /opt/syline/src/settings.py]
2ENABLE_ALERTS = True

然后找到以下警报部分,并在红色中添加以下方案:

1[label /opt/syline/src/settings.py]
2ALERTS = (
3    (^)("collectd", "smtp", 1800)(^),
4)

该方案中的第一个值是监控的过程,在这种情况下,它是collectd。该方案的第二个值是smtp,它代表电子邮件警报,最后的值是1800在秒内,这意味着警报不会在30分钟(1800秒)内发射超过一次,即使检测到触发器。

也找到下面的部分,并对您想要使用的电子邮件地址进行修改. 电子邮件警报将发送到 (^)[email protected](^)帐户,从(^)[email protected](^)。

1[label /opt/syline/src/settings.py]
2SMTP_OPTS = {
3    "sender": "(^)[email protected](^)",
4    "recipients": {
5    	"collectd": ["(^)[email protected](^)"],
6    },
7}

完成所有这些更改后,您必须重新启动分析器 DAEMON:

1sudo /opt/skyline/bin/analyzer.d restart

步骤5:测试天线

要测试 Skyline,我们可以使用 bash 命令创建一个 CPU 峰值:

1dd if=/dev/zero of=/dev/null

您可以随时停止命令,按CTRL-C. 几分钟应该足以创建异常。

如果您在运行此命令时查看 Skyline Web 界面,您将看到检测到的异常。

Figure 6 Figure 6

您可以看到,由于CPU负载高,Skyline的组件的速度下降了。所有检测到的异常指标都显示为网页底部的列表。当您横跨一个指标的名称时,在顶部图表中,您可以看到最后一小时和一天的相应时间序列。点击指标的名称来打开一个更详细的图表,由Graphite生成(参见图7为示例)。

Figure 7 Figure 7

CPU负载在本示例中没有达到极高的值,并且门槛没有被超过,在这种情况下,经典监控系统无法找到偏差。

与传统的监控系统不同,Skyline可以快速找到偏差并通知您。

第6步:调整算法(可选)

如前所述,Skyline正在使用一组算法来检测异常,目前正在实施以下算法:

  • 平均绝对偏差 * 格鲁布斯测试 * 第一小时平均值 * 标准偏差比平均值 * 标准偏差比移动平均值 * 最小平方 * 历史图板 * 科尔莫戈洛夫 - 斯米尔诺夫测试

他们中的大多数是基于 ** kontroll 图表** (也称为 Shewhart 图表)和 ** 三sigma 规则** ,他们在计算中使用 Python 库 SciPy 和 NumPy。

您可以自定义任何使用的算法,您也可以修改、删除或添加新的算法。

1sudo vi /opt/skyline/src/analyzer/algorithms.py

此檔案中的每個算法都提供了一個小型描述,例如,讓我們檢查下列算法:

 1[label /opt/skyline/src/analyzer/algorithms.py]
 2def median_absolute_deviation(timeseries):
 3    """
 4    A timeseries is anomalous if the deviation of its latest datapoint with
 5    respect to the median is X times larger than the median of deviations.
 6    """
 7        
 8    series = pandas.Series([x[1] for x in timeseries])
 9    median = series.median()
10    demedianed = np.abs(series - median)
11    median_deviation = demedianed.median()
12        
13    # The test statistic is infinite when the median is zero,
14    # so it becomes super sensitive. We play it safe and skip when this happens.
15    if median_deviation == 0:
16        return False
17        
18    test_statistic = demedianed.iget(-1) / median_deviation
19                                                                                    
20    # Completely arbitary...triggers if the median deviation is
21    # 6 times bigger than the median
22    if test_statistic > 6:
23        return True

根据您的数据的性质,您可能需要将门槛值从6更改为4,5,7等。

您还可以调节settings.py文件中的某些设置:

 1[label /opt/skyline/src/settings.py]
 2ALGORITHMS = [
 3    'first_hour_average',
 4    'mean_subtraction_cumulation',
 5     'stddev_from_average',
 6     'stddev_from_moving_average',
 7     'least_squares',
 8     'grubbs',
 9     'histogram_bins', 
10     'median_absolute_deviation',
11     'ks_test',
12]
13    
14CONSENSUS = 6

ALGORITHMS选项指定了分析器将运行的算法,您可以评论其中任何一个,以禁用它们或添加新的算法。 CONSENSUS选项指定了必须返回True的算法的数量,然后将指标归类为异常。

结论

Skyline在复杂的动态变化的IT系统中得到了很好的验证,这对经常对操作系统进行更改的程序员有用,并且想要在新软件发布后快速检测系统指标中的异常。

其主要优势包括:

  • 大量数据的高速分析 * 无需为每个指标设置个别参数 * 添加自己的异常检测算法的能力

它也有一些缺点:

  • 每个指标的数据由几个算法进行分析,这些算法需要大量的计算系统资源。 * 所有数据都存储在RAM中,使系统能够非常快地运作。
Published At
Categories with 技术
comments powered by Disqus