背景
阿里雲專有網絡(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
通過對比可以看到,拆分窗口後的數據統計更加均勻。
更多其它內容,請參考: