常見日志系統及特點


日志大家都不陌生,無論是電腦還是手機每天會產生大量的日志,處理這些日志需要專門的日志系統,這些日志系統普遍需要具有以下特點:

(1)構建應用系統和分析系統的橋梁,並將它們之間的關聯解耦;

(2)支持近實時的在線分析系統和類似於Hadoop之類的離線分析系統;

(3)具有高可擴展性。即:當數據量增加時,可以通過增加節點進行水平擴展。

我們就從設計架構,負載均衡,可擴展性和容錯性等方面對比當今比較有名氣的幾款日志系統,以便為了更好地了解日志系統。

1、Scribe

Scribe是FaceBook開源的日志收集系統,在FaceBook內部已經得到大量的應用,它能夠從各種日志源上收集日志,存儲到一個中央存儲系統 (可以是NFS,分布式文件系統等)上,以便於進行集中統計分析處理。它為日志的“分布式收集,統一處理”提供了一個可擴展的,高容錯的方案。它最重要的特點是容錯性好,當后端的存儲系統crash時,Scribe會將數據寫到本地磁盤上,當存儲系統恢復正常后,Scribe將日志重新加載到存儲系統中。

日志系統是怎么回事

Scribe的架構比較簡單主要包括三部分,分別為Scribe agent, Scribe和存儲系統。

1.1、Scribe agent

Scribe agent實際上是一個thrift client,向Scribe發送數據的唯一方法是使用thrift client, Scribe內部定義了一個thrift接口,用戶使用該接口將數據發送給server。

1.2、Scribe

Scribe接收到thrift client發送過來的數據,根據配置文件,將不同topic的數據發送給不同的對象。Scribe提供了各種各樣的store,如 file, HDFS等,Scribe可將數據加載到這些store中。

1.3、存儲系統

存儲系統實際上就是Scribe中的store,當前Scribe支持非常多的store,包括file(文件),buffer(雙層存儲,一個主儲存,一個副存儲),network(另一個scribe服務器),bucket(包含多個 store,通過hash的將數據存到不同store中),null(忽略數據),thriftfile(寫到一個Thrift TFileTransport文件中)和multi(把數據同時存放到不同store中)。

2、Chukwa

Chukwa是一個非常新的開源項目,屬於hadoop系列產品,因使用了很多hadoop的組件(用HDFS存儲,用mapreduce處理數據),它提供了很多模塊以支持hadoop集群日志分析,具有以下特點:

  • 靈活的,動態可控的數據源

  • 高性能,高可擴展的存儲系統

  • 合適的框架,用於對收集到的大規模數據進行分析

架構:Chukwa中主要有3種,分別是adaptor,agent和collector,Demux和achieving。

2.1、 Adaptor 數據源

可封裝其他數據源,如file,unix命令行工具等,目前可用的數據源有:hadoop logs,應用程序度量數據,系統參數數據(如linux cpu使用流率)。

2.2、 agent和collector


日志系統是怎么回事

Chukwa最開始采用了HDFS作為存儲系統,HDFS的設計初衷是支持大文件存儲和小並發高速寫的應用場景,而日志系統的特點恰好相反,它需支持高並發低速率的寫和大量小文件的存儲,為了解決這些問題,增加了agent和collector,增加Agent的作用是給adaptor提供各種服務,包括啟動和關閉adaptor,將數據通過HTTP傳遞給Collector;定期記錄adaptor狀態,以便crash后恢復。增加Collector的作用是對多個數據源發過來的數據進行合並,然后加載到HDFS中;隱藏HDFS實現的細節,如HDFS版本更換后,只需修改collector即可。

2.3、Demux和achieving

為了直接支持利用MapReduce處理數據,內置了兩個mapreduce作業,分別用於獲取data和將data轉化為結構化的log,然后存儲到data store(可以是數據庫或者HDFS等)中。

3、Kafka

Kafka是2010年12月份開源的項目,采用scala語言編寫,使用了多種效率優化機制,整體架構比較新穎(push/pull),更適合異構集群,具有以下特點:

  • 數據在磁盤上的存取代價為0

  • 高吞吐率,在普通的服務器上每秒也能處理幾十萬條消息

  • 分布式架構,能夠對消息分區

  • 支持將數據並行的加載到hadoop

架構:Kafka實際上是一個消息發布訂閱系統。producer向某個topic發布消息,而consumer訂閱某個topic的消息,進而一旦有新的關於某個topic的消息,broker會傳遞給訂閱它的所有consumer,在Kafka中消息是按topic組織的,而每個topic又會分為多個partition,這樣便於管理數據和進行負載均衡。同時它也使用了zookeeper進行負載均衡,Kafka中主要有三種角色,分別為producer,broker和consumer。
日志系統是怎么回事3.1、Producer

Producer的任務是向broker發送數據。Kafka提供了兩種producer接口,一種是low_level接口,使用該接口會向特定的broker的某個topic下的某個partition發送數據;另一種是high level接口,該接口支持同步/異步發送數據,基於zookeeper的broker自動識別和負載均衡(基於Partitioner),producer可以通過zookeeper獲取可用的broker列表,也可以在zookeeper中注冊listener,該listener在以下情況下會被喚醒:

  • 添加一個broker

  • 刪除一個broker

  • 注冊新的topic

  • broker注冊已存在的topic

當producer得知以上時間時,可根據需要采取一定的行動。

3.2、Broker

Broker采取了多種策略提高數據處理效率,包括sendfile和zero copy等技術。

3.3、 Consumer

consumer的作用是將日志信息加載到中央存儲系統上。Kafka提供了兩種consumer接口,一種是low level的,它維護到某一個broker的連接,並且這個連接是無狀態的,每次從broker上pull數據時,都要告訴broker數據的偏移量。另一種是high-level 接口,它隱藏了broker的細節,允許consumer從broker上push數據而不必關心網絡拓撲結構。更重要的是對於大部分日志系統而言,consumer已經獲取的數據信息都由broker保存,而在Kafka中是由consumer自己維護所取數據信息。

4、Flume

Flume是cloudera於2009年7月開源的日志系統,它內置的各種組件非常齊全,用戶幾乎不必進行任何額外開發即可使用,具有以下特點:

  • 可靠:當節點出現故障時,日志能夠被傳送到其他節點上而不會丟失。Flume提供了三種級別的可靠性保障,從強到弱依次分別為:end-to-end(收到數據agent首先將event寫到磁盤上,當數據傳送成功后,再刪除;如果數據發送失敗,可以重新發送。),Store on failure(這也是scribe采用的策略,當數據接收方crash時,將數據寫到本地,待恢復后,繼續發送),Best effort(數據發送到接收方后,不進行確認)。

  • 可擴展:Flume采用了三層架構,分別問agent,collector和storage,每一層均可以水平擴展。其中,所有agent和collector由master統一管理,這使得系統容易監控和維護,且master允許有多個(使用ZooKeeper進行管理和負載均衡),這就避免了單點故障問題,也可根據需要添加自己的agent,colletor或者storage。

  • 可管理:所有agent和colletor由master統一管理,這使得系統便於維護,用戶可以在master上查看各個數據源或者數據流執行情況,且可以對各個數據源配置和動態加載,Flume提供了web 和shell script command兩種形式對數據流進行管理。

架構:Flume采用了分層架構,由三層組成,分別為agent,collector和storage。agent和collector均由兩部分組成:source和sink,source是數據來源,sink是數據去向。

4.1、agent

agent的作用是將數據源的數據發送給collector,Flume自帶了很多直接可用的數據源(source)如:

text(“filename”):將文件filename作為數據源,按行發送

tail(“filename”):探測filename新產生的數據,按行發送出去

fsyslogTcp(5140):監聽TCP的5140端口,並且接收到的數據發送出去

同時提供了很多sink,如:

console[("format")] :直接將將數據顯示在桌面上

text(“txtfile”):將數據寫到文件txtfile中

dfs(“dfsfile”):將數據寫到HDFS上的dfsfile文件中

syslogTcp(“host”,port):將數據通過TCP傳遞給host節點

4.2、 collector

collector的作用是將多個agent的數據匯總后,加載到storage中,它的source和sink與agent類似。

日志系統是怎么回事

如有6個agent,3個collector,所有collector均將數據導入HDFS中。agent A,B將數據發送給collector A,agent C,D將數據發送給collectorB,agent C,D將數據發送給collectorB,同時為每個agent添加end-to-end可靠性保障(Flume的三種可靠性保障分別由agentE2EChain, agentDFOChain, and agentBEChain實現),如A出現故障時,agent A和agent B會將數據分別發給collector B和collector C。

下圖是配置文件片段:

日志系統是怎么回事

使用autoE2EChain,當某個collector 出現故障時,Flume會自動探測一個可用collector,並將數據定向到這個新的可用collector上。

4.3、 storage

storage是存儲系統,可以是一個普通file,也可以是HDFS,HIVE,HBase等。

5、總結

根據這四個系統的架構設計,可以總結出典型的日志系統需具備三個基本組件,分別為agent(封裝數據源,將數據源中的數據發送給collector),collector(接收多個agent的數據,並進行匯總后導入后端的store中),store(中央存儲系統,應該具有可擴展性和可靠性,應該支持當前非常流行的HDFS)。

對比這四個系統以便於更好地理解:

日志系統是怎么回事

 
原文鏈接: https://www.toutiao.com/i6528335523516252675/?tt_from=weixin&utm_campaign=client_share&from=singlemessage&timestamp=1520131941&app=news_article&utm_source=weixin&iid=27298990033&utm_medium=toutiao_android&wxshare_count=2&pbid=6496979013952423437


免責聲明!

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



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