基于 Scheduled SQL 对 VPC FlowLog 实现细粒度时间窗口分析
簡(jiǎn)介: 針對(duì)VPC FlowLog的五元組和捕獲窗口信息,在分析時(shí)使用不同時(shí)間窗口精度,可能得到不一樣的流量特征,本文介紹一種方法將原始采集日志的時(shí)間窗口做拆分,之后重新聚合為新的日志做分析,達(dá)到更細(xì)粒度的分析效果。
背景
阿里云專有網(wǎng)絡(luò)(VPC)提供流日志功能,支持VPC網(wǎng)絡(luò)中彈性網(wǎng)卡流量、VPC流量及交換機(jī)流量的記錄與存儲(chǔ)。對(duì)流日志分析可以監(jiān)控訪問(wèn)控制規(guī)則、監(jiān)控網(wǎng)絡(luò)流量和排查網(wǎng)絡(luò)故障。
流日志功能捕獲的流量信息以日志方式寫(xiě)入SLS(阿里云日志服務(wù))中。每條日志會(huì)捕獲特定捕獲窗口中的特定五元組網(wǎng)絡(luò)流,捕獲窗口大約為10分鐘,該段時(shí)間內(nèi)流日志功能先聚合數(shù)據(jù),再發(fā)布日志。
在 SLS 上可以通過(guò)關(guān)鍵詞搜索對(duì)指定目標(biāo)地址被拒絕的請(qǐng)求:
也可以通過(guò) SLS 的 SQL 進(jìn)行統(tǒng)計(jì)分析,但這里涉及一個(gè)捕獲窗口的問(wèn)題,例如下面兩條流日志(字段做了簡(jiǎn)化):
Log#1 start: 2021-05-31 00:00:00 end: 2021-05-31 00:08:30 bytes: 9000 packets: 18Log#2 start: 2021-05-31 00:02:30 end: 2021-05-31 00:03:15 bytes: 5000 packets: 10采集窗口內(nèi)產(chǎn)生的 bytes,落到 start 時(shí)間點(diǎn)上去或是平均落到整個(gè)采集窗口,對(duì)于流量分析結(jié)果會(huì)產(chǎn)生明顯的差異:
根據(jù)不同的業(yè)務(wù)背景,可以有不同的選擇:
一種方法是按采集窗口開(kāi)始時(shí)間計(jì)算,方法簡(jiǎn)單,select from_unixtime(start - start % 60) as dt, sum(bytes) as total_bytes group by dt order by dt asc limit 1000。
另一種較為復(fù)雜,拆分采集窗口后計(jì)算,本文介紹基于 SLS SQL 拆分日志后重新聚合的分析實(shí)踐。
方案
如下是一條 start 與 end 相差501的日志,表示采集窗口橫跨了 502 個(gè)秒級(jí)時(shí)間段(start、end 是左閉右閉區(qū)間):
利用數(shù)據(jù)函數(shù) sequence 可以生成一個(gè)時(shí)間序列到 ta 字段:
接著將 ta 序列做 unest 展開(kāi),得到 502 條日志:
到這里,基本思路就有了。但一定請(qǐng)注意:
為了減少日志條數(shù),我們將拆分后的秒級(jí)日志再按照10秒級(jí)粒度重新聚合,502 條秒級(jí)日志變?yōu)?51 條十秒級(jí)日志:
Scheduled SQL 實(shí)踐
將以上方案常駐執(zhí)行,就可以實(shí)現(xiàn)對(duì)于新日志的增量處理,如果將預(yù)處理結(jié)果保存到 Logstore,我們就可以在新的 Logstore 上做分析,可以做到更低的延遲。
Scheduled SQL 是一項(xiàng)由 SLS 全托管的功能,主要的場(chǎng)景包括:
- 定時(shí)分析數(shù)據(jù):根據(jù)業(yè)務(wù)需求設(shè)置 SQL 語(yǔ)句或查詢分析語(yǔ)句,定時(shí)執(zhí)行數(shù)據(jù)分析,并將分析結(jié)果存儲(chǔ)到目標(biāo)庫(kù)中。
- 全局聚合:對(duì)全量、細(xì)粒度的數(shù)據(jù)進(jìn)行聚合存儲(chǔ),匯總為存儲(chǔ)大小、精度適合的數(shù)據(jù),相當(dāng)于一定程度的有損壓縮數(shù)據(jù)。
執(zhí)行如下 SQL 預(yù)覽并確認(rèn)結(jié)果符合預(yù)期(如果希望預(yù)處理后的數(shù)據(jù)量更少一些,可以按照分鐘粒度做聚合,將 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 packetsfrom (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緊接著創(chuàng)建 Scheduled SQL 作業(yè):
保存作業(yè),選擇”增強(qiáng)型資源池“(收費(fèi)、但資源可擴(kuò)展,適用于有 SLA 要求的業(yè)務(wù)場(chǎng)景),設(shè)置存儲(chǔ)預(yù)處理結(jié)果到目標(biāo) Logstore aligned_vpc_flowlog。
接下來(lái),設(shè)置 SQL 作業(yè)從 5/28 日的數(shù)據(jù)開(kāi)始處理,在存量數(shù)據(jù)追上進(jìn)度后,新數(shù)據(jù)每 5 分鐘執(zhí)行一次,每次查詢 5 分鐘的數(shù)據(jù)做處理。
注意延遲執(zhí)行參數(shù),如果上游 Logstore 的數(shù)據(jù)到來(lái)可能延遲,建議設(shè)置大一些的值來(lái)保證計(jì)算數(shù)據(jù)的完整性。
Scheduled SQL 作業(yè)每 5 分鐘一次的實(shí)例,可以在控制臺(tái)上查看到。對(duì)于 SQL 執(zhí)行失敗(權(quán)限、SQL 語(yǔ)法等原因)或者數(shù)據(jù)遲到導(dǎo)致空跑情況,可以對(duì)指定實(shí)例做重試運(yùn)行。
效果
在 SLS 上制作一個(gè)儀表盤(pán)對(duì)比兩種計(jì)算方式的流量特征。
- 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秒聚合-拆分窗口數(shù)據(jù)
* | 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
通過(guò)對(duì)比可以看到,拆分窗口后的數(shù)據(jù)統(tǒng)計(jì)更加均勻。
原文鏈接
本文為阿里云原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的基于 Scheduled SQL 对 VPC FlowLog 实现细粒度时间窗口分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 谈谈C++新标准带来的属性(Attrib
- 下一篇: 安全之心:一文读懂可信计算