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

介绍

如果您使用监控系统(如Zabbix或Nagios),那么您就知道监控的工作原理。简而言之,它可以描述如下:监控系统接收各种指标(CPU /内存使用,网络利用率等)。一旦其中一个指标的值超出预定阈值,它就会激活相应的触发器,监控系统会通知您其中一个指标超出正常限制。通常手动设置每个度量的阈值,这不太方便。

在本教程中,您将学习如何安装和配置[Skyline- 一个实时异常检测系统。它能够实时分析一组指标,而无需设置或调整每个指标的阈值。它被设计用于需要持续监控的大量时间序列(数十万)的任何地方。

要完成本教程,你需要具备一台已经设置好可以使用sudo命令的非root账号的CentOS服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

阈值触发器

让我们看一个具有手动设置阈值的监控系统的示例。下图显示了CPU负载的图表。虚线表示触发器的阈值。

图1

在图1中的点1处,已启动进程,并且CPU负载已显着增加。触发器已激活,管理员注意到它。管理员确定它在正常值范围内,并将触发阈值更改为显示为上面的虚线。

经过一段时间后,触发器再次在图1中的第2点触发。管理员发现第二个服务正在定期进行备份并导致负载增加。然后问题出现了:你是否提高了门槛或保持原样,但忽略了警报?

让我们看看第3点。此时,事件负载下降,但未通知管理员,因为未超过阈值。触发器未激活。

这个简单的案例告诉我们,在尝试设置阈值时存在一些困难。很难调整阈值以捕获性能问题而不会触发误报错误或误报错误。

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

Skyline组件

Skyline包含以下组件:Horizon Agent,Analyzer Agent和Webapp。

Horizon Agent

Horizon Agent负责收集数据。它有监听器,可以监听传入的数据。

它接受两种格式的数据:pickle(TCP)和MessagePack(UDP)。它读取传入的指标并将它们放入Workers读取的共享队列中。Worker将数据编码到Messagepack中并将其附加到Redis数据库。Horizon Agent还使用Roombas定期修剪和清除旧指标。如果没有这样做,那么所有可用内存将很快耗尽。

分析器代理

Analyzer Agent负责分析数据。它从Redis接收指标列表,运行多个流程,并为每个流程分配指标。每个过程使用几种算法分析数据。每种算法都会报告结果 - 数据是否异常。如果大多数算法报告当前度量标准存在异常,则认为数据异常

所有异常指标都写入文件。在此文件的基础上,将创建一个映像并在Web应用程序中显示。

Analyzer还可以发送通知:email,HipChat或PagerDuty。电子邮件通知在本文后面配置。

Web应用程序

Skyline提供了一个小型Web应用程序来显示异常指标。这是一个使用Flask框架用Python编写的简单Web应用程序。上半部分显示了两个图表 - 过去一小时和过去一天。图表下方是所有异常指标的列表。

Redis数据库

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

Skyline将所有指标和编码时间序列存储在Redis数据库中。当数据点进入时,Horizon工作程序将带有模式[timestamp, value]的数据点打包到MessagePack编码的二进制字符串中,并将此字符串附加到相应的度量标准键。

图2显示了Skyline组件的交互图。

图2

准备

在安装Skyline之前,您需要完成以下准备:

  • 部署CentOS 7 腾讯云CVM。
  • 添加sudo用户。本教程中的所有命令都应该以非root用户身份运行。
  • 将交换空间添加到服务器。4 GB很好。
  • 在CentOS 7上安装Graphite并收集有效历史日志。

第1步 - 安装Skyline和Redis

要安装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的安装和基本配置已完成。现在您需要将数据发送到它。

第2步 - 将数据导入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由几个组件组成,其中一个组件是碳中继服务。碳中继将传入的指标转发到另一个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

允许Skyline访问Graphite-Web

如果你当选为密码保护石墨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

正确的端口号如下:

  1. Carbon-relay 在端口2013上以纯文本格式侦听传入数据
  2. 碳中继以pickle格式发送数据
  3. Carbon-cache 在端口2004上以pickle格式侦听传入数据
  4. Horizon代理在端口2024上侦听pickle格式的传入数据

注意!如果在同一主机上启动Horizon代理和可选的碳聚合器,则必须更改其端口。默认情况下,它们都设置为相同的端口2024

第3步 - 设置天际线

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建立基线时,尽量不要在系统上创建额外负载。

第4步 - 启用电子邮件警报

默认情况下,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

第5步 - 测试天际线

要测试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可以快速找到偏差并通知您。

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

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

  • 平均绝对偏差
  • 格拉布斯的考验
  • 第一小时平均值
  • 与平均值的标准偏差
  • 与移动平均线的标准差
  • 最小二乘法
  • 直方图箱
  • Kolmogorov-Smirnov测试

其中大多数是基于с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到别的东西- 457 等。

您还可以调整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系统中得到了充分证明。对于经常对操作系统进行更改并希望在新软件发布后快速检测系统指标异常的程序员可能会有所帮助。

其主要优点包括:

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

它也有一些缺点:

  • 通过需要大量计算系统资源的若干算法来分析每个度量的数据。
  • 所有数据都存储在RAM中,这使系统可以非常快速地运行。使用大量指标和长时间的分析,您将需要大量的RAM。

想要了解更多关于使用Skyline检测异常的相关教程,请前往腾讯云+社区学习更多知识。


参考文献:《How To Detect Anomalies with Skyline on CentOS 7》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏黑白安全

绕过CDN获取网站IP地址

基于masscan扫描IP端中开放的80端口,程序自动连接每个IP测试,筛选出符合条件的ip保存到result.txt 后续程序会提供”基于扫描子域名获取IP段...

1183
来自专栏Python私房菜

实战 | 用aiohttp和uvloop实现一个高性能爬虫

asyncio于Python3.4引入标准库,增加了对异步I/O的支持,asyncio基于事件循环,可以轻松实现异步I/O操作。接下来,我们用基于asyncio...

1613
来自专栏Petrichor的专栏

tensorflow: 为什么 tensor型参数 可以接受 非tensor型输入

但是 manual 里面已经写明了 tf.multiply函数 的 参数项输入 必须要是 tensor型 的:

1203
来自专栏小白安全

批量检测SQL注入工具

0×01 前言 SQL注入,这个类型的漏洞我真的学了好久好久好久好久,即是我刚刚开始接触安全就学习的第一种漏洞,也是一个迄今为止还在学习的漏洞类型,只...

1.1K6
来自专栏FreeBuf

爬虫采集去重优化浅谈

以前在做漏洞Fuzz爬虫时,曾做过URL去重相关的工作,当时是参考了seay法师的文章以及网上零碎的一些资料,感觉做的很简单。近来又遇到相关问题,于是乎有了再次...

3576
来自专栏Python中文社区

Django 博客教程(三):创建应用和编写数据库模型

專 欄 ❈追梦人物,Python中文社区专栏作者。电子科技大学计算机学院研究生,从事大数据分析研究方向。主要使用 Python 语言进行相关数据的分析,熟练使...

2109
来自专栏编程

前端性能优化指南——网络篇

网络,在我们开发的页面的访问过程中,是最开始的一个环节,同时,也是一个非常重要的环节。 当我们在提及网络优化的时候,我们都会说些什么呢。 事实上来讲,如果可以话...

2289
来自专栏云计算

A Kubernetes Service Mesh(第9部分):使用gRPC的乐趣和收益

原文地址:https://dzone.com/articles/a-service-mesh-for-kubernetes-part-ix-grpc-for-f...

6549
来自专栏Linux内核

Linux OOM机制分析

oom_killer(out of memory killer)是Linux内核的一种内存管理机制,在系统可用内存较少的情况下,内核为保证系统还能够继续运行下去...

1.3K7
来自专栏机器学习算法原理与实践

scikit-learn 和pandas 基于windows单机机器学习环境的搭建

    很多朋友想学习机器学习,却苦于环境的搭建,这里给出windows上scikit-learn研究开发环境的搭建步骤。

872

扫码关注云+社区

领取腾讯云代金券