Flume是cloudera公司開源的一款分佈式、可靠地進行大量日誌數據採集、聚合和並轉移到存儲中;經過事務機制提供了可靠的消息傳輸支持,自帶負載均衡機制來支撐水平擴展;而且提供了一些默認組件供直接使用。算法
Flume目前常見的應用場景:日誌--->Flume--->實時計算(如Kafka+Storm) 、日誌--->Flume--->離線計算(如HDFS、HBase)、日誌--->Flume--->ElasticSearch。數據庫
Flume主要分爲三個組件:Source、Channel、Sink;數據流以下圖所示:服務器
一、Source負責日誌流入,好比從文件、網絡、Kafka等數據源流入數據,數據流入的方式有兩種輪訓拉取和事件驅動;網絡
二、Channel負責數據聚合/暫存,好比暫存到內存、本地文件、數據庫、Kafka等,日誌數據不會在管道停留很長時間,很快會被Sink消費掉;架構
三、Sink負責數據轉移到存儲,好比從Channel拿到日誌後直接存儲到HDFS、HBase、Kafka、ElasticSearch等,而後再有如Hadoop、Storm、ElasticSearch之類的進行數據分析或查詢。負載均衡
一個Agent會同時存在這三個組件,Source和Sink都是異步執行的,相互之間不會影響。異步
假設咱們有采集並索引Nginx訪問日誌,咱們能夠按照以下方式部署:分佈式
一、Agent和Web Server是部署在同一臺機器;oop
二、Source使用ExecSource並使用tail命令採集日誌;spa
三、Channel使用MemoryChannel,由於日誌數據丟點也不算什麼大問題;
四、Sink使用ElasticSearchSink寫入到ElasticSearch,此處能夠配置多個ElasticSearch服務器IP:PORT列表以便提高處理能力。
以上介紹了日誌是如何流的,對於複雜的日誌採集,咱們須要對Source日誌進行過濾、寫到多個Channel、對Sink進行失敗處理/負載均衡等處理,這些Flume默認都提供了支持:
一、Source採集的日誌會傳入ChannelProcessor組件,其首先經過Interceptor進行日誌過濾,若是接觸過Servlet的話這個概念是相似的,能夠參考《Servlet3.1規範翻譯——過濾器 》 ;過濾器能夠過濾掉日誌,也能夠修改日誌內容;
二、過濾完成後接下來會交給ChannelSelector進行處理,默認提供了兩種選擇器:複製或多路複用選擇器;複製即把一個日誌複製到多個Channel;而多路複用會根據配置的選擇器條件,把符合條件的路由到相應的Channel;在寫多個Channel時可能存在存在失敗的狀況,對於失敗的處理有兩種:稍後重試或者忽略。重試通常採用指數級時間進行重試。
咱們以前說過Source生產日誌給Channel、Sink從Channel消費日誌;它倆徹底是異步的,所以Sink只須要監聽本身關係的Channel變化便可。
到此咱們能夠對Source日誌進行過濾/修改,把一個消息複製/路由到多個Channel,對於Sink的話也應該存在寫失敗的狀況,Flume默認提供了以下策略:
默認策略就是一個Sink,失敗了則這個事務就失敗了,會稍後重試。
Flume還提供了故障轉移策略:
Failover策略是給多個Sink定義優先級,假設其中一個失敗了,則路由到下一個優先級的Sink;Sink只要拋出一次異常就會被認爲是失敗了,則從存活Sink中移除,而後指數級時間等待重試,默認是等待1s開始重試,最大等待重試時間是30s。
Flume也提供了負載均衡策略:
負載均衡算法默認提供了兩種:輪訓和隨機;其經過抽象一個相似ChannelSelector的SinkSelector進行選擇,失敗補償機制和Failover中的算法相似,可是默認是關閉失敗補償的,須要配置backoff參數爲true開啓。
到此Flume涉及的一些核心組件就介紹完了,對於Source和Sink如何異步、Channel提供的事務機制等咱們後續分析組件時再講。
假設咱們須要採集很是多的客戶端日誌並對他們進行一些緩衝或集中的處理,就能夠部署一個聚合層,總體架構相似於以下:
一、首先是日誌採集層,該層的Agent和應用部署在同一臺機器上,負責採集如Nginx訪問日誌;而後經過RPC將日誌流入到收集/聚合層;在這一層應該快速的採集到日誌而後流入到收集/聚合層;
二、收集/聚合層進行日誌的收集或聚合,而且能夠進行容錯處理,如故障轉移或負載均衡,以提高可靠性;另外能夠在該層開啓文件Channel,作數據緩衝區;
三、收集/聚合層對數據進行過濾或修改而後進行存儲或處理;好比存儲到HDFS,或者流入Kafka而後經過Storm對數據進行實時處理。
到此從Flume核心組件到通常的部署架構咱們就大致瞭解了,而涉及的一些實現細節在接下來的部分進行詳細介紹。