opengauss源码分析—指标采集预测与分析

本文介绍了opengauss数据库的Anomaly-Detection系统,用于指标采集、预测与异常检测。该系统由Agent和Detector组成,Agent收集数据库指标数据,Detector进行数据转储、特征分析和异常检测。关键代码涉及数据源采集、内存通道处理和预测算法,包括使用auto_arima等方法进行未来走势预测,异常检测则基于时序预测算法。Anomaly-Detection提供了启动、停止、预测等运行模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

              

一.指标采集、预测与异常检测简介

数据库指标监控与异常检测技术,通过监控数据库指标,并基于时序预测和异常检测等算法,发现异常信息,进而提醒用户采取措施避免异常情况造成严重后果。

二,使用场景

用户操作数据库的某些行为或某些正在运行的业务发生了变化,都可能会导致数据库产生异常,如果不及时发现并处理这些异常,可能会导致严重的后果。通常,数据库监控指标(metric,如CPU使用率、QPS等)能够反映出数据库系统的健康状况。通过对数据库指标进行监控,分析指标数据特征或变化趋势等信息,可及时发现数据库异常状况,并及时将告警信息推送给运维管理人员,从而避免造成损失。

实现原理

指标采集、预测与异常检测是通过同一套系统实现的,在openGauss项目中名为Anomaly-Detection,它的结构如图8-14所示。该工具主要可以分为Agent和Detector两部分,其中Agent是数据库代理模块,负责收集数据库指标数据并将数据推送到Detector;Detector是数据库异常检测与分析模块,该模块主要有三个作用。

(1) 收集Agent端采集的数据并进行转储。

(2) 对收集到的数据进行特征分析与异常检测。

(3) 将检测出来的异常信息推送给运维管理人员。

1. Agent模块的组成

Agent模块负责采集并发送指标数据,该模块由DBSource、MemoryChannel、HttpSink三个子模块组成。

(1) DBSource作为数据源,负责定期去收集数据库指标数据并将数据发送到数据通道MemoryChannel中。

(2) MemoryChannel是内存数据通道,本质是一个FIFO队列,用于数据缓存。HttpSink组件消费MemoryChannel中的数据,为了防止MemoryChannel中的数据过多导致OOM(out of Memory,内存溢出),设置了容量上限,当超过容量上限时,过多的元素会被禁止放入队列中。

(3) HttpSink是数据汇聚点,该模块定期从MemoryChannel中获取数据,并以Http(s)的方式将数据进行转发,数据读取之后从MemoryChannel中清除。

2. Detector 模块组成

Detector模块负责数据检测,该模块由Server、Monitor两个子模块组成。

(1) Server是一个Web服务,为Agent采集到的数据提供接收接口,并将数据存储到本地数据库内部,为了避免数据增多导致数据库占用太多的资源,我们将数据库中的每个表都设置了行数上限。

(2) Monitor模块包含时序预测和异常检测等算法,该模块定期从本地数据库中获取数据库指标数据,并基于现有算法对数据进行预测与分析,如果算法检测出数据库指标在历史或未来某时间段或时刻出现异常,则会及时的将信息推送给用户。

8.5.3 关键源码解析

1 总体流程解析

智能索引推荐工具的路径是openGauss-server/src/gausskernel/dbmind/tools/anomaly_detection,下面的代码详细展示了程序的入口。

def forecast(args):

    …

    # 如果没有指定预测方式,则默认使用’auto_arima’算法

    if not args.forecast_method:

        forecast_alg = get_instance('auto_arima')

    else:

        forecast_alg = get_instance(args.forecast_method)

    # 指标预测功能函数

    def forecast_metric(name, train_ts, save_path=None):

        …

            forecast_alg.fit(timeseries=train_ts)

            dates, values = forecast_alg.forecast(

                period=TimeString(args.forecast_periods).standard)

        date_range = "{start_date}~{end_date}".format(start_date=dates[0],

                                               end_date=dates[-1])

        display_table.add_row(

            [name, date_range, min(values), max(values), sum(values) / len(values)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值