基于 Scheduled SQL 对 VPC FlowLog 实现细粒度时间窗口分析
簡介: 針對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: 18Log#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 條日志:
到這里,基本思路就有了。但一定請注意:
為了減少日志條數,我們將拆分后的秒級日志再按照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 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緊接著創建 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 实现细粒度时间窗口分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谈谈C++新标准带来的属性(Attrib
- 下一篇: 安全之心:一文读懂可信计算