基於 Scheduled SQL 對 VPC FlowLog 實現細粒度時間視窗分析

簡介: 針對VPC FlowLog的五元組和捕獲視窗資訊,在分析時使用不同時間視窗精度,可能得到不一樣的流量特徵,本文介紹一種方法將原始採集日誌的時間視窗做拆分,之後重新聚合為新的日誌做分析,達到更細粒度的分析效果。

背景

阿里雲專有網路(VPC)提供流日誌功能,支援VPC網路中彈性網路卡流量、VPC流量及交換機流量的記錄與儲存。對流日誌分析可以監控訪問控制規則、監控網路流量和排查網路故障。

流日誌功能捕獲的流量資訊以日誌方式寫入SLS(阿里雲日誌服務)中。每條日誌會捕獲特定捕獲視窗中的特定五元組網路流,捕獲視窗大約為10分鐘,該段時間內流日誌功能先聚合資料,再發布日誌。

在 SLS 上可以透過關鍵詞搜尋對指定目標地址被拒絕的請求:

基於 Scheduled SQL 對 VPC FlowLog 實現細粒度時間視窗分析

也可以透過 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 時間點上去或是平均落到整個採集視窗,對於流量分析結果會產生明顯的差異:

基於 Scheduled SQL 對 VPC FlowLog 實現細粒度時間視窗分析

根據不同的業務背景,可以有不同的選擇:

一種方法是按採集視窗開始時間計算,方法簡單,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 是左閉右閉區間):

基於 Scheduled SQL 對 VPC FlowLog 實現細粒度時間視窗分析

利用資料函式 sequence 可以生成一個時間序列到 ta 欄位:

基於 Scheduled SQL 對 VPC FlowLog 實現細粒度時間視窗分析

接著將 ta 序列做 unest 展開,得到 502 條日誌:

基於 Scheduled SQL 對 VPC FlowLog 實現細粒度時間視窗分析

到這裡,基本思路就有了。但一定請注意:

packets、bytes 欄位是在一個捕獲視窗中獲得的,所以展開後的每條日誌,應該將指標值均分到每個拆分後的時間段。 視窗資料展開後,意味著日誌量會膨脹,可能產生很大的計算壓力與儲存成本,建議減少聚合指標分組數目。

為了減少日誌條數,我們將拆分後的秒級日誌再按照10秒級粒度重新聚合,502 條秒級日誌變為 51 條十秒級日誌:

基於 Scheduled SQL 對 VPC FlowLog 實現細粒度時間視窗分析

Scheduled SQL 實踐

將以上方案常駐執行,就可以實現對於新日誌的增量處理,如果將預處理結果儲存到 Logstore,我們就可以在新的 Logstore 上做分析,可以做到更低的延遲。

Scheduled SQL 是一項由 SLS 全託管的功能,主要的場景包括:

定時分析資料:根據業務需求設定 SQL 語句或查詢分析語句,定時執行資料分析,並將分析結果儲存到目標庫中。 全域性聚合:對全量、細粒度的資料進行聚合儲存,彙總為儲存大小、精度適合的資料,相當於一定程度的有失真壓縮資料。

基於 Scheduled SQL 對 VPC FlowLog 實現細粒度時間視窗分析

執行如下 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 作業:

基於 Scheduled SQL 對 VPC FlowLog 實現細粒度時間視窗分析

儲存作業,選擇」增強型資源池「(收費、但資源可擴充套件,適用於有 SLA 要求的業務場景),設定儲存預處理結果到目標 Logstore aligned_vpc_flowlog。

基於 Scheduled SQL 對 VPC FlowLog 實現細粒度時間視窗分析

接下來,設定 SQL 作業從 5/28 日的資料開始處理,在存量資料追上進度後,新資料每 5 分鐘執行一次,每次查詢 5 分鐘的資料做處理。

注意延遲執行引數,如果上游 Logstore 的資料到來可能延遲,建議設定大一些的值來保證計算資料的完整性。

基於 Scheduled SQL 對 VPC FlowLog 實現細粒度時間視窗分析

Scheduled SQL 作業每 5 分鐘一次的例項,可以在控制檯上檢視到。對於 SQL 執行失敗(許可權、SQL 語法等原因)或者資料遲到導致空跑情況,可以對指定例項做重試執行。

基於 Scheduled SQL 對 VPC FlowLog 實現細粒度時間視窗分析

效果

在 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 實現細粒度時間視窗分析