微信支付萬億日誌在Hermes中的實踐

導語 | 微信支付日誌系統利用 Hermes 來實現日誌的全文檢索功能,自從接入以來,日誌量持續增長。目前單日入庫日誌量已經突破萬億級,單集羣日入庫規模也已經突破了萬億,存儲規模達 PB 級。本文將介紹微信支付日誌系統在 Hermes 上的實踐,希望與大家一同交流。文章作者:宋新村,騰訊大數據高級運維工程師。

 

一、業務規模

 

目前微信支付日誌單日最大入庫總量已達到萬億級,單日入庫存儲量達 PB 級,而在春節等重大節假日預計整個日入庫規模會有進一步的增長。

 

微信支付日誌業務採用的 Hermes 集羣,單集羣日入庫規模也已經突破了萬億級每天,節點部署有二百多臺,單集羣存儲總量達到 PB 級。另外,每天的檢索查詢併發在 6000 左右:

 

 

在如此海量日誌存儲規模下,整個微信支付日誌查詢 SLA 達到了 4 個 9,95% 的耗時小於 5s。

 

 

二、存算分離

 

 

Hermes 底層存儲採用 HDFS 來實現,所有的存儲相關的策略都由專業的 HDFS 的能力來提供,包括:

 

1. 數據多副本容災


日誌默認存儲 2 副本容災,針對歷史數據可以靈活的降低副本來減少存儲成本,而針對非常重要的日誌數據也可以靈活的增加副本來提高數據容災能力。

 

2. 磁盤故障容錯

 

單磁盤或單機故障 HDFS 可自動遷移副本,整個容錯過程對上層計算層透明。

 

3. 冷熱分級

 

利用 HDFS 提供的異構存儲能力,結合 Hermes 本身的按天分區存儲,可以非常方便的實現數據的冷熱分級。冷熱分級後的數據對上層業務透明,業務無需關注數據本身的存儲情況

 

4. EC編碼


HDFS 3.0 版本之後支持 EC 編碼,進一步降低存儲成本,目前暫時未在線上實踐。

 

通過採用這種存算分離的架構,一方面可以簡化上層的計算層的設計;另一方面計算層計算索引的時候只需計算單份即可實現多副本容災,從而極大的減少計算層的 CPU、內存資源消耗,使得寫入 QPS 成倍提升。

 

三、異步索引合併

 

Hermes 本身採用類 LSM 的數據寫入模式,數據先寫入內存+WAL,積累到一定數量後再批量刷寫到 HDFS 進行持久化存儲。節點故障時,系統通過回滾 WAL 進行數據恢復,從而確保整個寫入爲高效的順序寫入。

 

這種高效的寫入方式帶來的一個問題就是:隨着數據的不斷刷寫,會產生大量的小的索引,從而對查詢和 HDFS 存儲造成較大的壓力。

 

Hermes 本身會不斷的對小的索引進行合併,降低索引文件的個數;而在夜間低峯期,我們也會對歷史的分區數據進行一次較大的合併粒度,從而儘可能的提高整個系統的查詢效率。微信支付業務的合併時間點選取的是凌晨 2~6 點,避開了凌晨 0~1 點的除夕紅包高峯。

 

 

四、索引與數據分離

 

日誌等業務場景的一個重要的特點就是:先按照分詞+字段信息進行檢索,然後拉取完整的一整行日誌進行分析。

 

針對這種場景,傳統的列存往往存在行存信息獲取效率較低,而索引和數據混存又會存在合併索引時讀寫 IO 放大嚴重的問題。

 

爲此,Hermes 除了會對日誌進行分詞構建索引之外,還可以額外配置存儲一份完整的日誌行存信息:

 

 

如上圖所示,通過將索引和數據分離存儲,索引目錄裏只存儲倒排索引,行數據裏同一個分片裏每個索引目錄相應的行數據。通過每個索引目錄的 Offset 和 RowId,在 RowData 中讀取結果數據。

 

通過索引和數據的分離,索引目錄刷盤次數和個數降低 68%,內存使用量降低 70%,磁盤使用量降低 14%,檢索性能提升 80%。

 

 

五、存儲冷熱分級

 

微信支付 90% 的日誌模塊都是數據量非常小的長尾模塊。因此適當的引入一些高性能的 SSD 設備來加速這些存儲較小的業務的查詢是非常合適的,而爲了可以儘可能的減少 SSD 的成本,需要對業務的數據進行冷熱分級。

 

Hermes 本身的數據冷熱分級是利用 HDFS 的異構存儲能力來實現的,通過配置不同的副本放置策略,可以靈活的指定副本使用的存儲類型,而整個過程對上層業務透明。
 

HDFS 異構存儲策略如下所示:

 

 

HDFS 異構存儲在 Hermes 中的實踐:

 

 

六、歷史分區副本降級

 

Hermes 底層存儲採用 HDFS 多副本來進行數據容災,一般默認會存儲兩副本。目前微信支付的日誌最長的保存週期爲 30 天,存儲數據量非常大。

 

爲了儘可能的降低業務的存儲成本,在同業務協商溝通之後,瞭解到一般三天之前的日誌的查詢需求很低,對於日誌的穩定性可以降低一些,因此 Hermes 運維側直接對三天前的數據進行例行降副本操作,從而使得整個存儲的成本直接降低 70% 以上,整個降副本操作對上層計算層和業務層都是透明的,業務對此沒有任何感知。

 

 

七、日誌批量導出

 

微信支付的同事經常會有批量導出指定時間段的命中某些關鍵詞的日誌的需求:

 

 

爲此 Hermes 提供批量異步導出日誌到 HDFS 等存儲介質的功能,用戶提交導出請求後,系統會把所有命中的日誌導出一份到 TDW HDFS 上面,用戶再用 TDW HDFS 客戶端或者通過 Hermes 的接口機拖走就行。


TDW HDFS 上面用戶的日誌導出文件:

 

 

八、結語

 

微信支付接入 Hermes 以來,日誌量規模從最初的百億規模增長至現在的萬億級規模,對整個 Hermes 本身的存儲能力、擴展能力、容災能力和資源規劃能力都持續提出挑戰。

 

好在 Hermes 本身優秀的存儲架構使得可以在海量業務數據規模下靈活的對業務的數據進行翻轉騰挪,從而從容的應對業務持續提出的各種挑戰。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章