日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

开源日志系统

發(fā)布時間:2024/9/30 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开源日志系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://dongxicheng.org/search-engine/log-systems/


1. 背景介紹

許多公司的平臺每天會產生大量的日志(一般為流式數據,如,搜索引擎的pv,查詢等),處理這些日志需要特定的日志系統(tǒng),一般而言,這些系統(tǒng)需要具有以下特征:

(1) 構建應用系統(tǒng)和分析系統(tǒng)的橋梁,并將它們之間的關聯(lián)解耦;

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

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

本文從設計架構,負載均衡,可擴展性和容錯性等方面對比了當今開源的日志系統(tǒng),包括facebook的scribe,apache的chukwa,linkedin的kafka和cloudera的flume等。

2. FaceBook的Scribe

Scribe是facebook開源的日志收集系統(tǒng),在facebook內部已經得到大量的應用。它能夠從各種日志源上收集日志,存儲到一個中央存儲系統(tǒng) (可以是NFS,分布式文件系統(tǒng)等)上,以便于進行集中統(tǒng)計分析處理。它為日志的“分布式收集,統(tǒng)一處理”提供了一個可擴展的,高容錯的方案。

它最重要的特點是容錯性好。當后端的存儲系統(tǒng)crash時,scribe會將數據寫到本地磁盤上,當存儲系統(tǒng)恢復正常后,scribe將日志重新加載到存儲系統(tǒng)中。

架構

scribe的架構比較簡單,主要包括三部分,分別為scribe agent, scribe和存儲系統(tǒng)。

(1) scribe agent

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

(2) scribe

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

(3) 存儲系統(tǒng)

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

3. Apache的Chukwa

chukwa是一個非常新的開源項目,由于其屬于hadoop系列產品,因而使用了很多hadoop的組件(用HDFS存儲,用mapreduce處理數據),它提供了很多模塊以支持hadoop集群日志分析。

需求:

(1) 靈活的,動態(tài)可控的數據源

(2) 高性能,高可擴展的存儲系統(tǒng)

(3) 合適的框架,用于對收集到的大規(guī)模數據進行分析

架構

Chukwa中主要有3種角色,分別為:adaptor,agent,collector。

(1) Adaptor 數據源

可封裝其他數據源,如file,unix命令行工具等

目前可用的數據源有:hadoop logs,應用程序度量數據,系統(tǒng)參數數據(如linux cpu使用流率)。

(2) HDFS 存儲系統(tǒng)

Chukwa采用了HDFS作為存儲系統(tǒng)。HDFS的設計初衷是支持大文件存儲和小并發(fā)高速寫的應用場景,而日志系統(tǒng)的特點恰好相反,它需支持高并發(fā)低速率的寫和大量小文件的存儲。需要注意的是,直接寫到HDFS上的小文件是不可見的,直到關閉文件,另外,HDFS不支持文件重新打開。

(3) Collector和Agent

為了克服(2)中的問題,增加了agent和collector階段。

Agent的作用:給adaptor提供各種服務,包括:啟動和關閉adaptor,將數據通過HTTP傳遞給Collector;定期記錄adaptor狀態(tài),以便crash后恢復。

Collector的作用:對多個數據源發(fā)過來的數據進行合并,然后加載到HDFS中;隱藏HDFS實現的細節(jié),如,HDFS版本更換后,只需修改collector即可。

(4) Demux和achieving

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

4. LinkedIn的Kafka

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

設計目標:

(1) 數據在磁盤上的存取代價為O(1)

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

(3) 分布式架構,能夠對消息分區(qū)

(4) 支持將數據并行的加載到hadoop


架構

Kafka實際上是一個消息發(fā)布訂閱系統(tǒng)。producer向某個topic發(fā)布消息,而consumer訂閱某個topic的消息,進而一旦有新的關于某個topic的消息,broker會傳遞給訂閱它的所有consumer。 在kafka中,消息是按topic組織的,而每個topic又會分為多個partition,這樣便于管理數據和進行負載均衡。同時,它也使用了zookeeper進行負載均衡。

Kafka中主要有三種角色,分別為producer,broker和consumer。

(1) Producer

Producer的任務是向broker發(fā)送數據。Kafka提供了兩種producer接口,一種是low_level接口,使用該接口會向特定的broker的某個topic下的某個partition發(fā)送數據;另一種那個是high level接口,該接口支持同步/異步發(fā)送數據,基于zookeeper的broker自動識別和負載均衡(基于Partitioner)。

其中,基于zookeeper的broker自動識別值得一說。producer可以通過zookeeper獲取可用的broker列表,也可以在zookeeper中注冊listener,該listener在以下情況下會被喚醒:

a.添加一個broker

b.刪除一個broker

c.注冊新的topic

d.broker注冊已存在的topic

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

(2) Broker

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

(3) Consumer

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

5. Cloudera的Flume

Flume是cloudera于2009年7月開源的日志系統(tǒng)。它內置的各種組件非常齊全,用戶幾乎不必進行任何額外開發(fā)即可使用。

設計目標:

(1) 可靠性

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

(2) 可擴展性

Flume采用了三層架構,分別問agent,collector和storage,每一層均可以水平擴展。其中,所有agent和collector由master統(tǒng)一管理,這使得系統(tǒng)容易監(jiān)控和維護,且master允許有多個(使用ZooKeeper進行管理和負載均衡),這就避免了單點故障問題。

(3) 可管理性

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

(4) 功能可擴展性

用戶可以根據需要添加自己的agent,colletor或者storage。此外,Flume自帶了很多組件,包括各種agent(file, syslog等),collector和storage(file,HDFS等)。

架構

正如前面提到的,Flume采用了分層架構,由三層組成,分別為agent,collector和storage。其中,agent和collector均由兩部分組成:source和sink,source是數據來源,sink是數據去向。

(1) agent

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

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

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

fsyslogTcp(5140):監(jiān)聽TCP的5140端口,并且接收到的數據發(fā)送出去

同時提供了很多sink,如:

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

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

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

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

(2) collector

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

下面例子中,agent監(jiān)聽TCP的5140端口接收到的數據,并發(fā)送給collector,由collector將數據加載到HDFS上。

1 2 3 host : syslogTcp(5140) | agentSink("localhost",35853) ; collector : collectorSource(35853) | collectorSink("hdfs://namenode/user/flume/ ","syslog");

一個更復雜的例子如下:

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

下面是簡寫的配置文件片段:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 agentA : src | agentE2EChain("collectorA:35853","collectorB:35853"); agentB : src | agentE2EChain("collectorA:35853","collectorC:35853"); agentC : src | agentE2EChain("collectorB:35853","collectorA:35853"); agentD : src | agentE2EChain("collectorB:35853","collectorC:35853"); agentE : src | agentE2EChain("collectorC:35853","collectorA:35853"); agentF : src | agentE2EChain("collectorC:35853","collectorB:35853"); collectorA : collectorSource(35853) | collectorSink("hdfs://...","src"); collectorB : collectorSource(35853) | collectorSink("hdfs://...","src"); collectorC : collectorSource(35853) | collectorSink("hdfs://...","src");

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

(3) storage

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

6. 總結

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

下面表格對比了這四個系統(tǒng):

7. 參考資料

scribe主頁:https://github.com/facebook/scribe

chukwa主頁:http://incubator.apache.org/chukwa/

kafka主頁:http://sna-projects.com/kafka/

Flume主頁:https://github.com/cloudera/flume/

原創(chuàng)文章,轉載請注明:?轉載自董的博客

本文鏈接地址:?http://dongxicheng.org/search-engine/log-systems/


總結

以上是生活随笔為你收集整理的开源日志系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。