基于 Scheduled SQL 对 VPC FlowLog 实现细粒度时间窗口分析
背景
阿里云专有网络(VPC)提供流日志功能,支持VPC网络中弹性网卡流量、VPC流量及交换机流量的记录与存储。对流日志分析可以监控访问控制规则、监控网络流量和排查网络故障。
流日志功能捕获的流量信息以日志方式写入SLS(阿里云日志服务)中。每条日志会捕获特定捕获窗口中的特定五元组网络流,捕获窗口大约为10分钟,该段时间内流日志功能先聚合数据,再发布日志。
在 SLS 上可以通过关键词搜索对指定目标地址被拒绝的请求:

也可以通过 SLS 的 SQL 进行统计分析,但这里涉及一个捕获窗口的问题,例如下面两条流日志(字段做了简化):
Log#1
start: 2021-05-31 00:00:00
end: 2021-05-31 00:08:30
bytes: 9000
packets: 18 Log#2
start: 2021-05-31 00:02:30
end: 2021-05-31 00:03:15
bytes: 5000
packets: 10
采集窗口内产生的 bytes,落到 start 时间点上去或是平均落到整个采集窗口,对于流量分析结果会产生明显的差异:

根据不同的业务背景,可以有不同的选择:
一种方法是按采集窗口开始时间计算,方法简单,select from_unixtime(start - start % 60) as dt, sum(bytes) as total_bytes group by dt order by dt asc limit 1000。
另一种较为复杂,拆分采集窗口后计算,本文介绍基于 SLS SQL 拆分日志后重新聚合的分析实践。
方案
如下是一条 start 与 end 相差501的日志,表示采集窗口横跨了 502 个秒级时间段(start、end 是左闭右闭区间):

利用数据函数 sequence 可以生成一个时间序列到 ta 字段:

接着将 ta 序列做 unest 展开,得到 502 条日志:

到这里,基本思路就有了。但一定请注意:
- packets、bytes 字段是在一个捕获窗口中获得的,所以展开后的每条日志,应该将指标值均分到每个拆分后的时间段。
- 窗口数据展开后,意味着日志量会膨胀,可能产生很大的计算压力与存储成本,建议减少聚合指标分组数目。
为了减少日志条数,我们将拆分后的秒级日志再按照10秒级粒度重新聚合,502 条秒级日志变为 51 条十秒级日志:

Scheduled SQL 实践
将以上方案常驻执行,就可以实现对于新日志的增量处理,如果将预处理结果保存到 Logstore,我们就可以在新的 Logstore 上做分析,可以做到更低的延迟。
Scheduled SQL 是一项由 SLS 全托管的功能,主要的场景包括:
- 定时分析数据:根据业务需求设置 SQL 语句或查询分析语句,定时执行数据分析,并将分析结果存储到目标库中。
- 全局聚合:对全量、细粒度的数据进行聚合存储,汇总为存储大小、精度适合的数据,相当于一定程度的有损压缩数据。

执行如下 SQL 预览并确认结果符合预期(如果希望预处理后的数据量更少一些,可以按照分钟粒度做聚合,将 10 替换为 60),SQL 代码:
* | select (t.time - t.time % 10) as __time__, srcaddr, srcport, dstaddr, dstport, action, protocol,
sum(bytes * 1.0 / ("end"-start + 1)) as bytes, sum(packets * 1.0 / ("end"-start + 1)) as packets
from (select start, "end", srcaddr, srcport, dstaddr, dstport, action, protocol, bytes, packets,
sequence(start, "end", 1) as ta from log), unnest(ta) as t(time)
group by time, srcaddr, srcport, dstaddr, dstport, action, protocol order by __time__ asc limit 1000000
紧接着创建 Scheduled SQL 作业:

保存作业,选择”增强型资源池“(收费、但资源可扩展,适用于有 SLA 要求的业务场景),设置存储预处理结果到目标 Logstore aligned_vpc_flowlog。

接下来,设置 SQL 作业从 5/28 日的数据开始处理,在存量数据追上进度后,新数据每 5 分钟执行一次,每次查询 5 分钟的数据做处理。
注意延迟执行参数,如果上游 Logstore 的数据到来可能延迟,建议设置大一些的值来保证计算数据的完整性。

Scheduled SQL 作业每 5 分钟一次的实例,可以在控制台上查看到。对于 SQL 执行失败(权限、SQL 语法等原因)或者数据迟到导致空跑情况,可以对指定实例做重试运行。

效果
在 SLS 上制作一个仪表盘对比两种计算方式的流量特征。
- 10秒聚合-原始窗口
* | select from_unixtime(start - start % 10) as dt, sum(packets) as packets, round(sum(bytes)/1024.0/1024.0, 3) as MB group by dt order by dt asc limit 10000
- 10秒聚合-拆分窗口数据
* | select from_unixtime(__time__ - __time__ % 10) as dt, sum(packets) as packetes, round(sum(bytes)/1024.0/1024.0, 3) as MB group by dt order by dt asc limit 10000
通过对比可以看到,拆分窗口后的数据统计更加均匀。

原文链接
本文为阿里云原创内容,未经允许不得转载。
基于 Scheduled SQL 对 VPC FlowLog 实现细粒度时间窗口分析的更多相关文章
- kafka传数据到Flink存储到mysql之Flink使用SQL语句聚合数据流(设置时间窗口,EventTime)
网上没什么资料,就分享下:) 简单模式:kafka传数据到Flink存储到mysql 可以参考网站: 利用Flink stream从kafka中写数据到mysql maven依赖情况: <pro ...
- 浅析基于微软SQL Server 2012 Parallel Data Warehouse的大数据解决方案
作者 王枫发布于2014年2月19日 综述 随着越来越多的组织的数据从GB.TB级迈向PB级,标志着整个社会的信息化水平正在迈入新的时代 – 大数据时代.对海量数据的处理.分析能力,日益成为组织在这个 ...
- 转:浅析基于微软SQL Server 2012 Parallel Data Warehouse的大数据解决方案
综述 随着越来越多的组织的数据从GB.TB级迈向PB级,标志着整个社会的信息化水平正在迈入新的时代 – 大数据时代.对海量数据的处理.分析能力,日益成为组织在这个时代决胜未来的关键因素,而基于大数据的 ...
- 基于简单sql语句的sql解析原理及在大数据中的应用
基于简单sql语句的sql解析原理及在大数据中的应用 李万鸿 老百姓呼吁打土豪分田地.共同富裕,总有一天会实现. 全面了解你所不知道的外星人和宇宙真想:http://pan.baidu.com/s/1 ...
- OPPO数据中台之基石:基于Flink SQL构建实数据仓库
小结: 1. OPPO数据中台之基石:基于Flink SQL构建实数据仓库 https://mp.weixin.qq.com/s/JsoMgIW6bKEFDGvq_KI6hg 作者 | 张俊编辑 | ...
- 多表联合查询 - 基于注解SQL
作者:汤圆 个人博客:javalover.cc 前言 背景:Spring Boot + MybatisPlus 用MybatisPlus就是为了不写SQL,用起来方便: 但是如果需要多表联合查询,还是 ...
- 基于Python项目的Redis缓存消耗内存数据简单分析(附详细操作步骤)
目录 1 准备工作 2 具体实施 1 准备工作 什么是Redis? Redis:一个高性能的key-value数据库.支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使 ...
- 对Oracle 、SQL Server、MySQL、PostgreSQL数据库优缺点分析
对Oracle .SQL Server.MySQL.PostgreSQL数据库优缺点分析 Oracle Database Oracle Database,又名Oracle RDBMS,或简称Oracl ...
- SQL优化(三)—— 索引、explain分析
SQL优化(三)—— 索引.explain分析 一.什么是索引 索引是一种排好序的快速查找的数据结构,它帮助数据库高效的查询数据 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据 ...
- sql server 的cpu使用率过高的分析
有哪些SQL语句会导致CPU过高? 1.编译和重编译 编译是 Sql Server 为指令生成执行计划的过程.Sql Server 要分析指令要做的事情,分析它所要访问的表格结构,也就是生成执行计划的 ...
随机推荐
- 使用gitee
git全局设置 git config --global user.name "张xx" git config --global user.email "xxx@qq.co ...
- django(模版层)
一 模板语法传值 {{}}: 变量相关.过滤器 {%%}: 逻辑相关(静态文件配置.反向解析.标签相关.模版继承和 导入) def index(request): # 模板语法可以传递的后端pytho ...
- 记录--如何在H5中实现OCR拍照识别身份证功能
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 业务背景 由于当前项目中需要实现身份证拍照识别的功能,如果是小程序可以使用微信提供的 ocr-navigator 插件实现,但是在企业微信 ...
- KingbaseES V8R6集群运维案例--cluster模式备份sys_backup.sh init故障
KingbaseES V8R6集群运维案例--cluster模式备份sys_backup.sh init故障 案例说明: 通过脚本方式部署KingbaseES V8R6集群后,在'cluster'模式 ...
- KingbaseES 咨询锁
传统的事务性锁,读/写会自动加锁,读/写完成后会自动解锁(加解锁机制在细节上复杂),这是一种隐式的锁机制.对于加锁后的并发控制,也就是默认的写不阻塞读,是通过MVCC机制解决的.这种锁完全不需要人为干 ...
- Java对象序列化和反序列化
Java类的序列化和反序列化 序列化:指将对象转换为字节序列的过程,也就是将对象的信息转换成文件保存. 反序列化:将字节序列转换成目标对象的过程,也就是读取文件,并转换为对象. 几个关键点: 必须实现 ...
- 04 jQuery遍历器
04 jQuery遍历器 如果jQuery一次性选择了很多元素节点. 而我们又希望能拿到每一个元素中的相关信息. 此时可以考虑用jQuery的遍历器来完成对元素的循环遍历. 例如: <!DOCT ...
- [llama懒人包]ChatGPT本地下位替代llama-7b,支持全平台显卡/CPU运行
LLAMA的懒人包: 链接: https://pan.baidu.com/s/1xOw8-eP8QB--u6y644_UPg?pwd=0l08 提取码:0l08 模型来源:elinas/llama-7 ...
- Array and Set work process
目录 Array work principle 分析Array操作步骤数 read find insert delete Set work principle 分析Set操作步骤数 read find ...
- C++ 智能指针和内存管理:使用指南和技巧
C++是一门强大的编程语言,但是在内存管理方面却存在着一些问题.手动管理内存不仅费时费力,而且容易出错.因此,C++中引入了智能指针这一概念,以更好地管理内存. 什么是智能指针? 在C++中,内存的分 ...