使用雲端服務最大好處是隨用隨付,無需預留資源,因此各雲產品都有計量計費需求。本文介紹一種基於Log Service隨用隨付方案,該方案每天處理千億級計量日誌,被眾多雲產品使用。
隨用隨付日誌
使用情境
電源公司:每10秒會收到一條日誌,記錄該10秒內每個使用者ID下該周期內功耗、峰值、均值等,每天、每小時和每月給使用者提供賬單。
電訊廠商:每隔10秒從基站收到時間段內某個手機號碼的動作(上網、電話、簡訊、VoIP)、使用量(流量)、時間長度等資訊,後端計費服務統計出該區間內消耗資費。
天氣預測API服務:根據使用者調用介面類型、城市、查詢類型、結果大小等對使用者請求進行收費。
要求與挑戰
既要算對,又要算準是一件要求很高的事情,系統要求如下:
準確可靠:既不可多算,也不能少算。
靈活:支援補資料等情境,例如一部分資料沒有推送過來,當需要修正時可以重新計算。
即時性強:能夠做到秒級計費,對於欠費情境快速切斷。
其他需求(Plus):
賬單修正功能:在即時計費失敗時,我們可以通過理想計費進行對賬。
查詢明細:支援查看自己消費明細。
現實中還有兩類挑戰:
不斷增長的資料量:隨著使用者以及調用上升,資料規模會越來越大,如何保持架構的Auto Scaling。
容錯處理:計費程式可能有Bug,如何確保計量資料與計費程式獨立。
本文介紹一種基於Log Service隨用隨付方案,該方案已線上上穩定運行多年,從未出現過一例算錯、延遲等情況,供大家參考。
工作原理
以Log ServiceLogHub功能為例:
使用LogHub進行計量日誌即時採集與計配量序對接:LogHub支援的50+種接入手段。
計配量序每隔固定時間消費LogHub中步長資料,在記憶體中計算產生計費資料結果。
(附加)對詳細資料查詢需求,可以將計量日誌配置索引查詢。
(附加)將計量日誌推送至OSS進行離線儲存,進行T+1等對賬與統計。
即時計配量序內部結構:
根據LogHub讀取介面GetCursor功能,選定某個時間段日誌(例如10:00-11:00)Cursor。
通過PullLogs介面消費該時間段內資料。
在記憶體中進行資料統計與計算,拿到結果,產生計費資料。
我們可以以此類推,把選擇時間計算邏輯修改為1分鐘,10秒鐘等。
效能分析:
假設每天有10億條計量日誌,每條長度為200位元組,資料量為200GB。
LogHub預設SDK或Agent都帶壓縮功能,實際儲存資料量為40GB(一般至少有5倍壓縮率),一個小時資料量為1.6GB。
LogHub讀取介面一次最大支援讀1000個包(每個包最大為5MB),在千兆網條件下2秒內即可讀完。
加上記憶體中資料累計與計算時間,對1小時計量日誌進行匯總,不超過5秒。
計量日誌產生計費結果過程
計量日誌記錄了您所涉及計費的專案,後端計費模組根據計費項目和規則進行運算,產生最後賬單。例如如下原始訪問日誌記錄了專案(Project)使用方式:
microtime:1457517269818107 Method:PostLogStoreLogs Status:200 Source:203.0.113.10 ClientIP:198.51.100.10 Latency:1968 InFlow:1409 NetFlow:474 OutFlow:0 UserId:44 AliUid:1264425845****** ProjectName:app-myapplication ProjectId:573 LogStore:perf UserAgent:ali-sls-logtail APIVersion:0.5.0 RequestId:56DFF2D58B3D939D691323C7
計量計費程式讀取原始日誌,根據規則產生使用者在各維度使用資料(包括流量、使用次數、出流量等):
資料量大應如何解決
在一些計費情境下(例如電訊廠商、IoT等),計量日誌量會很大(例如十萬億,資料量為每天2PB),折算壓縮資料後一小時有16TB,以萬兆網路讀取需要1600秒,已不能滿足快速出賬單需求。
控制產生的計費資料量
對於產生計量日誌程式進行改造(例如Nginx),先在記憶體中做彙總,每隔1分鐘轉儲一次該時間段彙總的匯總計量日誌結果。這樣資料量就和總體的使用者數相關了。假設Nginx該時間段內有1000個使用者,一個小時資料量為1000*200*60=12GB(壓縮後為240MB)。
將計量Tlog並行化
LogHub下每個日誌庫可以分配不同Shard(分區),我們可以分配3個分區,3個計量消費程式。為了保證一個使用者計量資料總是由一個消費程式處理,我們可以根據使用者ID Hash到固定Shard中。例如杭州市西湖區使用者寫在1號Shard,杭州上城區使用者資料寫在2號Shard,這樣後台計配量序就可水平擴充。
其他問題
補資料怎麼辦?
LogHub下每個Logstore可以設定生命週期(1~365天),如果計費程式需要重新消費資料,在生命週期內可以根據任意時間段進行計算。
計量日誌散落在很多伺服器中怎麼辦?
使用Logtail Agent即時採集。
使用自訂使用者標識定義一套動態機器組Auto Scaling。
查詢明細需求如何滿足?
對LogHub中的資料建立索引,支援即時查詢與統計分析。
Inflow>300000 and Method=Post* and Status in [200 300]
您也可以在查詢後加上統計分析:
Inflow>300000 and Method=Post* and Status in [200 300] | select max(Inflow) as s, ProjectName group by ProjectName order by s desc
儲存日誌並進行T+1對賬。
Log Service提供LogHub中資料投遞功能,其支援自訂分區、自訂儲存格式等配置。將日誌儲存在OSS上,利用E-MapReduce、Hadoop、Hive、Presto、Spark等進行計算。