實時統一日志采集Flume平台化


      針對原生Flume在生產環境中暴露的問題,在開源Flume1.6.0版本上做了深度定制和部門內部統一推廣:

  1.  與開源版本區別

模塊

       Flume1.6

  Flumex-Agent

 

 

 

 

 

功能

1.低侵入性:

會對業務方日志文件重命名

1.無侵入性

2.休眠輪詢: 占用線程&&限制采集文件的並行度

2.輕量級:基於Linux的inotify機制采集

3.數據不完整性:基於file的full-name采集

3.數據完整性:基於inode的日志采集

4.不支持目錄遞歸

4.支持目錄遞歸

性能(單文件吞吐)

2M/s: 按行或byte采集,效率低

10M/s: 根據采集進度按byte或block動態采集

 

        運營

1.狀態被動收集:自身基於server端服務的定向請求

1.狀態主動推送:基於client端的狀態心跳推送

2.無采集元數據備份

2.采集日志元數據備份:

可以記錄和查詢歷史任一時間段內采集的文件列表、 文件數及采集文件的size、offset信息

2. 功能擴展

   2.1. 支持file-channel可靠性采集模式

      目前由於file-channel采集性能瓶頸, 所以采用memory-channel模式,兩者采集能力對比如下:但memory-channel是會在服務異常中斷或宕機場景時存在着日志丟失的風險。產品線上計划數據可靠性優先,所以會采用file-channel模式,其次對采集效率進行優化。

channel方式

readByByte
(events/s)

memory-channel

1800

file-channel

1400

   2.2. 支持單實例多目錄多topic采集方式

        目前支持單topic的日志采集,待支持類似向上多topic多目錄的並行采集,配置初步設計如下:

agent.sources.s1.topicGroups = t1 t2
agent.sources.s1.topicGroups.t1.topic = topic1
agent.sources.s1.topicGroups.t1.files = /home/logs/14505/^stat\.log*,/home/logs/stat/^monitor.log$

agent.sources.s1.topicGroups.t2.topic = topic2
agent.sources.s1.topicGroups.t2.files = /home/14505-1/^stat\.log$

   2.3 支持采集消息的定制字段追加,如host、appid等

       由於上游agent采集的業務應用方較多,為了方便下游離線或實時地對消息進行分類統計分析,對采集消息的內容,agent具有進行有約束的制定字段增加功能。 增加的定制字段有:a既定的變量, 如appid、t、host。

        a. 配置樣例如下:

            %{appid}%{t}%{host}%{data}

        b. 相應消息樣例如下:

            appid= test- product` t=1479089921875`host=localhost`deviceId=VSMjTvvy9CgDAE`messageId=`action=register_dt`logTime=1477911600905`msgCount=1`

3. 性能改善

   3.1. 目的

      a.  采用可靠性file-channel采集模式,保證采集數據的穩定性、日志可靠性(不丟失);

      b.  提升file-channel采集模式日志采集效率,提升5倍。 目前測試單日志文件memory模式采集能力1800行/S;

      c. 支持異步memory-channel性能采集模式,提升20倍采集效率。

   3.2. 目前現狀

       采集的方式與flume原生的tail-log采集方式類似,按Byte逐行讀取的采集模式; 當 file-offset ≈ file-size時,即日志文件的消費速率與其內容的生產效率相當時,這樣可以保證log采集的實時性; 實測其性能  1500Events/s。

   3.3. 存在問題 
      但其存在性能瓶頸:假設機械磁盤的一次順序讀時間0.01ms,每行消息內容100個Bytes,則其IOPS性能上限:100000個Bytes/s = 1000Events/s; 所以當file-offset << file-size時,特別是在采集業務高峰時nginx運營日志情景時,會出現日志文件的消費速率會遠小於其內容的生產效率,導致采集消息嚴重滯后。

   3.4. 修改策略
         采用實時動態調整采集方式的策略:
         a. 當file-offset ≈ file-size時,采用readByByte采集模式;
         b. 當file-offset << file-size時,采用readByBlock采集模式,提高采集吞吐量。
   3.5. 優化后結果對比

channel方式

readByByte
(events/s)

readByBlock
(events/s)

memory-channel

1800

20000

file-channel

1400

15000

    3.6.  支持同步/異步兩種采集模式

        另外,采集每批消息耗時主要由三部分組成: read-log(1ms) + write-channel(1ms) + write-metaDB(4ms)。為了保證數據可靠性:每一批讀取日志數據后的游標元信息會sync同步到sqlite中,其耗時占比達60%,所以每批消息的大頭在write-metaDB操作上。

        為了支持不同的業務場景需求,服務支持”性能模式”,支持write-metaDB的異步寫模式,同時會在異常關機情況時的數據丟失。下面是兩種采集模式的采集效率對比:                                   

 采集模式

采集效率

吞吐能力

可靠模式(同步)

15000行/s

1.5M/s

性能模式(異步)

100000行/s

10M/s

  3.7. 消息大小與采集能力關系圖

      線上服務已“可靠性”優先,所以會采用可靠模式。下面實驗可靠模式下:不同消息字節大小與服務采集能力的關系圖: 

 

4. 產品服務化

 4.1. 監控模塊

      支持source輸入與sink輸出兩維度信息的狀態內容匯報,采集agent周期性地匯報采集狀態給dashboard服務中心, 上傳字段內容以Json格式上報。心跳周期:1min;傳輸協議:http-post。上報字段說明如下:

       a. 匯報狀態字段說明

字段

說明

host

采集點的機器名或ip名

appId

采集日志的業務標示

receivedEventCount

探測接收到的事件數

acceptedEventCount

成功錄入的事件數

receivedBatchCount

探測接收到的事件批次數

acceptedBatchCount

成功錄入的事件批次數

attemptSendEventCount

嘗試下游發送的事件數

successSendEventCount

成功下游發送的事件數

acceptedWindowEventCount

一個時間窗口接收到的事件數

sendWindowEventCount

一個時間窗口發送出的事件數

         b. 匯報狀態字段樣例 

{
     "host":"uaerouter5-vm01",
     "appId":"test-new-product",
     "receivedEventCount":"137136",
     "acceptedEventCount":"137136",
     "receivedBatchCount":"4073",
     "acceptedBatchCount":"4073",
     "attemptSendEventCount":"137136",
     "successSendEventCount":"137136",                
"acceptedWindowEventCount": "11000", "sendWindowEventCount": "10000“ }

   4.2. 配置與部署

     a. 支持本地配置的參數變化&動態監聽&程序模塊級別重啟 

     b. 支持配置中心的統一程序包分發與部署   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM