1. 背景介紹許多公司的平臺(tái)每天會(huì)產(chǎn)生大量的日志(一般為流式數(shù)據(jù),如撬陵,搜索引擎的pv珊皿,查詢等),處理這些日志需要特定的日志系統(tǒng)巨税,一般而言蟋定,這些系統(tǒng)需要具有以下特征:(1) 構(gòu)建應(yīng)用系統(tǒng)和分析系統(tǒng)的橋梁,并將它們之間的關(guān)聯(lián)解耦草添;(2) 支持近實(shí)時(shí)的在線分析系統(tǒng)和類似于Hadoop之類的離線分析系統(tǒng)驶兜;(3) 具有高可擴(kuò)展性。即:當(dāng)數(shù)據(jù)量增加時(shí),可以通過增加節(jié)點(diǎn)進(jìn)行水平擴(kuò)展抄淑。
本文從設(shè)計(jì)架構(gòu)屠凶,負(fù)載均衡,可擴(kuò)展性和容錯(cuò)性等方面對(duì)比了當(dāng)今開源的日志系統(tǒng)肆资,包括facebook的scribe矗愧,apache的chukwa,linkedin的kafka和cloudera的flume等迅耘。
2. FaceBook的Scribe
Scribe是facebook開源的日志收集系統(tǒng)贱枣,在facebook內(nèi)部已經(jīng)得到大量的應(yīng)用。它能夠從各種日志源上收集日志颤专,存儲(chǔ)到一個(gè)中央存儲(chǔ)系統(tǒng) (可以是NFS,分布式文件系統(tǒng)等)上钠乏,以便于進(jìn)行集中統(tǒng)計(jì)分析處理栖秕。它為日志的“分布式收集,統(tǒng)一處理”提供了一個(gè)可擴(kuò)展的晓避,高容錯(cuò)的方案簇捍。
它最重要的特點(diǎn)是容錯(cuò)性好。當(dāng)后端的存儲(chǔ)系統(tǒng)crash時(shí)俏拱,scribe會(huì)將數(shù)據(jù)寫到本地磁盤上暑塑,當(dāng)存儲(chǔ)系統(tǒng)恢復(fù)正常后,scribe將日志重新加載到存儲(chǔ)系統(tǒng)中锅必。
架構(gòu):
scribe的架構(gòu)比較簡(jiǎn)單驹愚,主要包括三部分,分別為scribe agent劣纲, scribe和存儲(chǔ)系統(tǒng)逢捺。
(1) scribe agent
scribe agent實(shí)際上是一個(gè)thrift client。 向scribe發(fā)送數(shù)據(jù)的唯一方法是使用thrift client癞季, scribe內(nèi)部定義了一個(gè)thrift接口劫瞳,用戶使用該接口將數(shù)據(jù)發(fā)送給server。
(2) scribe
scribe接收到thrift client發(fā)送過來的數(shù)據(jù)绷柒,根據(jù)配置文件志于,將不同topic的數(shù)據(jù)發(fā)送給不同的對(duì)象。scribe提供了各種各樣的store辉巡,如 file恨憎, HDFS等,scribe可將數(shù)據(jù)加載到這些store中。
(3) 存儲(chǔ)系統(tǒng)
存儲(chǔ)系統(tǒng)實(shí)際上就是scribe中的store憔恳,當(dāng)前scribe支持非常多的store瓤荔,包括file(文件),buffer(雙層存儲(chǔ)钥组,一個(gè)主儲(chǔ)存输硝, 一個(gè)副存儲(chǔ)),network(另一個(gè)scribe服務(wù)器)程梦,bucket(包含多個(gè) store点把,通過hash的將數(shù)據(jù)存到不同store中),null(忽略數(shù)據(jù))屿附,thriftfile(寫到一個(gè)Thrift TFileTransport文件中)和multi(把數(shù)據(jù)同時(shí)存放到不同store中)郎逃。
3. Apache的Chukwa
chukwa是一個(gè)非常新的開源項(xiàng)目,由于其屬于hadoop系列產(chǎn)品挺份,因而使用了很多hadoop的組件(用HDFS存儲(chǔ)褒翰,用mapreduce處理數(shù)據(jù)),它提供了很多模塊以支持hadoop集群日志分析匀泊。
需求:
(1) 靈活的优训,動(dòng)態(tài)可控的數(shù)據(jù)源
(2) 高性能,高可擴(kuò)展的存儲(chǔ)系統(tǒng)
(3) 合適的框架各聘,用于對(duì)收集到的大規(guī)模數(shù)據(jù)進(jìn)行分析
架構(gòu):
Chukwa中主要有3種角色早敬,分別為:adaptor,agent毛仪,collector搁嗓。
(1) Adaptor 數(shù)據(jù)源
可封裝其他數(shù)據(jù)源,如file箱靴,unix命令行工具等
目前可用的數(shù)據(jù)源有:hadoop logs腺逛,應(yīng)用程序度量數(shù)據(jù),系統(tǒng)參數(shù)數(shù)據(jù)(如linux cpu使用流率)衡怀。
(2) HDFS 存儲(chǔ)系統(tǒng)
Chukwa采用了HDFS作為存儲(chǔ)系統(tǒng)棍矛。HDFS的設(shè)計(jì)初衷是支持大文件存儲(chǔ)和小并發(fā)高速寫的應(yīng)用場(chǎng)景,而日志系統(tǒng)的特點(diǎn)恰好相反抛杨,它需支持高并發(fā)低速 率的寫和大量小文件的存儲(chǔ)够委。需要注意的是,直接寫到HDFS上的小文件是不可見的怖现,直到關(guān)閉文件茁帽,另外玉罐,HDFS不支持文件重新打開。
(3) Collector和Agent
為了克服(2)中的問題潘拨,增加了agent和collector階段吊输。
Agent的作用:給adaptor提供各種服務(wù),包括:?jiǎn)?dòng)和關(guān)閉adaptor铁追,將數(shù)據(jù)通過HTTP傳遞給Collector季蚂;定期記錄adaptor狀態(tài),以便crash后恢復(fù)琅束。
Collector的作用:對(duì)多個(gè)數(shù)據(jù)源發(fā)過來的數(shù)據(jù)進(jìn)行合并扭屁,然后加載到HDFS中;隱藏HDFS實(shí)現(xiàn)的細(xì)節(jié)涩禀,如料滥,HDFS版本更換后,只需修改collector即可埋泵。
(4) Demux和achieving
直接支持利用MapReduce處理數(shù)據(jù)幔欧。它內(nèi)置了兩個(gè)mapreduce作業(yè),分別用于獲取data和將data轉(zhuǎn)化為結(jié)構(gòu)化的log丽声。存儲(chǔ)到data store(可以是數(shù)據(jù)庫(kù)或者HDFS等)中。
4. LinkedIn的Kafka
Kafka是2010年12月份開源的項(xiàng)目觉义,采用scala語言編寫雁社,使用了多種效率優(yōu)化機(jī)制,整體架構(gòu)比較新穎(push/pull)晒骇,更適合異構(gòu)集群霉撵。
設(shè)計(jì)目標(biāo):
(1) 數(shù)據(jù)在磁盤上的存取代價(jià)為O(1)
(2) 高吞吐率,在普通的服務(wù)器上每秒也能處理幾十萬條消息
(3) 分布式架構(gòu)洪囤,能夠?qū)ο⒎謪^(qū)
(4) 支持將數(shù)據(jù)并行的加載到hadoop
架構(gòu):
Kafka實(shí)際上是一個(gè)消息發(fā)布訂閱系統(tǒng)喇完。producer向某個(gè)topic發(fā)布消息,而consumer訂閱某個(gè)topic的消息剥啤,進(jìn)而一旦有新的關(guān)于 某個(gè)topic的消息锦溪,broker會(huì)傳遞給訂閱它的所有consumer。 在kafka中府怯,消息是按topic組織的刻诊,而每個(gè)topic又會(huì)分為多個(gè)partition,這樣便于管理數(shù)據(jù)和進(jìn)行負(fù)載均衡牺丙。同時(shí)则涯,它也使用了 zookeeper進(jìn)行負(fù)載均衡月而。
Kafka中主要有三種角色,分別為producer拦焚,broker和consumer拭嫁。
(1) Producer
Producer的任務(wù)是向broker發(fā)送數(shù)據(jù)。Kafka提供了兩種producer接口浮入,一種是low_level接口龙优,使用該接口會(huì)向特定的 broker的某個(gè)topic下的某個(gè)partition發(fā)送數(shù)據(jù);另一種那個(gè)是high level接口事秀,該接口支持同步/異步發(fā)送數(shù)據(jù)彤断,基于zookeeper的broker自動(dòng)識(shí)別和負(fù)載均衡(基于Partitioner)。
其中易迹,基于zookeeper的broker自動(dòng)識(shí)別值得一說宰衙。producer可以通過zookeeper獲取可用的broker列表,也可以在zookeeper中注冊(cè)listener睹欲,該listener在以下情況下會(huì)被喚醒:
a.添加一個(gè)broker
b.刪除一個(gè)broker
c.注冊(cè)新的topic
d.broker注冊(cè)已存在的topic
當(dāng)producer得知以上時(shí)間時(shí)供炼,可根據(jù)需要采取一定的行動(dòng)。
(2) Broker
Broker采取了多種策略提高數(shù)據(jù)處理效率窘疮,包括sendfile和zero copy等技術(shù)袋哼。
(3) Consumer
consumer的作用是將日志信息加載到中央存儲(chǔ)系統(tǒng)上。kafka提供了兩種consumer接口闸衫,一種是low level的涛贯,它維護(hù)到某一個(gè)broker的連接,并且這個(gè)連接是無狀態(tài)的蔚出,即弟翘,每次從broker上pull數(shù)據(jù)時(shí),都要告訴broker數(shù)據(jù)的偏移 量骄酗。另一種是high-level 接口稀余,它隱藏了broker的細(xì)節(jié),允許consumer從broker上push數(shù)據(jù)而不必關(guān)心網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)趋翻。更重要的是睛琳,對(duì)于大部分日志系統(tǒng)而 言,consumer已經(jīng)獲取的數(shù)據(jù)信息都由broker保存嘿歌,而在kafka中掸掏,由consumer自己維護(hù)所取數(shù)據(jù)信息。
5. Cloudera的Flume
Flume是cloudera于2009年7月開源的日志系統(tǒng)宙帝。它內(nèi)置的各種組件非常齊全丧凤,用戶幾乎不必進(jìn)行任何額外開發(fā)即可使用。
設(shè)計(jì)目標(biāo):
(1) 可靠性
當(dāng)節(jié)點(diǎn)出現(xiàn)故障時(shí)步脓,日志能夠被傳送到其他節(jié)點(diǎn)上而不會(huì)丟失愿待。Flume提供了三種級(jí)別的可靠性保障浩螺,從強(qiáng)到弱依次分別為:end-to-end(收到數(shù)據(jù) agent首先將event寫到磁盤上,當(dāng)數(shù)據(jù)傳送成功后仍侥,再刪除要出;如果數(shù)據(jù)發(fā)送失敗,可以重新發(fā)送农渊。)患蹂,Store on failure(這也是scribe采用的策略,當(dāng)數(shù)據(jù)接收方crash時(shí)砸紊,將數(shù)據(jù)寫到本地传于,待恢復(fù)后,繼續(xù)發(fā)送)醉顽,Best effort(數(shù)據(jù)發(fā)送到接收方后沼溜,不會(huì)進(jìn)行確認(rèn))。
(2) 可擴(kuò)展性
Flume采用了三層架構(gòu)游添,分別問agent系草,collector和storage,每一層均可以水平擴(kuò)展唆涝。其中找都,所有agent和collector由 master統(tǒng)一管理,這使得系統(tǒng)容易監(jiān)控和維護(hù)廊酣,且master允許有多個(gè)(使用ZooKeeper進(jìn)行管理和負(fù)載均衡)檐嚣,這就避免了單點(diǎn)故障問題。
(3) 可管理性
所有agent和colletor由master統(tǒng)一管理啰扛,這使得系統(tǒng)便于維護(hù)。用戶可以在master上查看各個(gè)數(shù)據(jù)源或者數(shù)據(jù)流執(zhí)行情況嗡贺,且可以對(duì)各 個(gè)數(shù)據(jù)源配置和動(dòng)態(tài)加載隐解。Flume提供了web 和shell script command兩種形式對(duì)數(shù)據(jù)流進(jìn)行管理。
(4) 功能可擴(kuò)展性
用戶可以根據(jù)需要添加自己的agent诫睬,colletor或者storage煞茫。此外,F(xiàn)lume自帶了很多組件摄凡,包括各種agent(file续徽, syslog等),collector和storage(file亲澡,HDFS等)钦扭。
架構(gòu):
正如前面提到的其弊,F(xiàn)lume采用了分層架構(gòu),由三層組成膀斋,分別為agent梭伐,collector和storage。其中仰担,agent和collector均由兩部分組成:source和sink糊识,source是數(shù)據(jù)來源,sink是數(shù)據(jù)去向摔蓝。
(1) agent
agent的作用是將數(shù)據(jù)源的數(shù)據(jù)發(fā)送給collector赂苗,F(xiàn)lume自帶了很多直接可用的數(shù)據(jù)源(source),如:
text(“filename”):將文件filename作為數(shù)據(jù)源项鬼,按行發(fā)送
tail(“filename”):探測(cè)filename新產(chǎn)生的數(shù)據(jù)哑梳,按行發(fā)送出去
fsyslogTcp(5140):監(jiān)聽TCP的5140端口,并且接收到的數(shù)據(jù)發(fā)送出去
同時(shí)提供了很多sink绘盟,如:
console[("format")] :直接將將數(shù)據(jù)顯示在桌面上
text(“txtfile”):將數(shù)據(jù)寫到文件txtfile中
dfs(“dfsfile”):將數(shù)據(jù)寫到HDFS上的dfsfile文件中
syslogTcp(“host”,port):將數(shù)據(jù)通過TCP傳遞給host節(jié)點(diǎn)
(2) collector
collector的作用是將多個(gè)agent的數(shù)據(jù)匯總后鸠真,加載到storage中。它的source和sink與agent類似龄毡。
下面例子中吠卷,agent監(jiān)聽TCP的5140端口接收到的數(shù)據(jù),并發(fā)送給collector沦零,由collector將數(shù)據(jù)加載到HDFS上祭隔。
host : syslogTcp(5140) | agentSink("localhost",35853) ;
collector : collectorSource(35853) | collectorSink("hdfs://namenode/user/flume/ ","syslog");
一個(gè)更復(fù)雜的例子如下:有6個(gè)agent,3個(gè)collector屯仗,所有collector均將數(shù)據(jù)導(dǎo)入HDFS中搞坝。agent A,B將數(shù)據(jù)發(fā)送給collector A魁袜,agent C桩撮,D將數(shù)據(jù)發(fā)送給collectorB,agent C峰弹,D將數(shù)據(jù)發(fā)送給collectorB店量。同時(shí),為每個(gè)agent添加end-to-end可靠性保障(Flume的三種可靠性保障分別由 agentE2EChain, agentDFOChain, and agentBEChain實(shí)現(xiàn))鞠呈,如融师,當(dāng)collector A出現(xiàn)故障時(shí),agent A和agent B會(huì)將數(shù)據(jù)分別發(fā)給collector B和collector C粟按。
下面是簡(jiǎn)寫的配置文件片段:
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后控,當(dāng)某個(gè)collector 出現(xiàn)故障時(shí),F(xiàn)lume會(huì)自動(dòng)探測(cè)一個(gè)可用collector空镜,并將數(shù)據(jù)定向到這個(gè)新的可用collector上浩淘。
(3) storage
storage是存儲(chǔ)系統(tǒng),可以是一個(gè)普通file吴攒,也可以是HDFS张抄,HIVE,HBase等洼怔。
6. 總結(jié)
根據(jù)這四個(gè)系統(tǒng)的架構(gòu)設(shè)計(jì)署惯,可以總結(jié)出典型的日志系統(tǒng)需具備三個(gè)基本組件,分別為agent(封裝數(shù)據(jù)源镣隶,將數(shù)據(jù)源中的數(shù)據(jù)發(fā)送給 collector)极谊,collector(接收多個(gè)agent的數(shù)據(jù),并進(jìn)行匯總后導(dǎo)入后端的store中)安岂,store(中央存儲(chǔ)系統(tǒng)轻猖,應(yīng)該具有可擴(kuò) 展性和可靠性,應(yīng)該支持當(dāng)前非常流行的HDFS)域那。
下面表格對(duì)比了這四個(gè)系統(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/
本文來自:http://my.oschina.net/sunzy/blog/183795
摘自http://www.ttlsa.com/log-system/scribe-chukwa-kafka-flume-log-system-contrast/