1. 程式人生 > >微信支付萬億日誌在Hermes中的實踐

微信支付萬億日誌在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 本身優秀的儲存架構使得可以在海量業務資料規模下靈活的對業務的資料進行翻轉騰挪,從而從容的應對業務持續提出的各種挑戰。