【轉(zhuǎn)】開源日志系統(tǒng)比較

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

** 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)中掏缎。

scribe

架構(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ā)送過來(lái)的數(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)行分析
chukwa

架構(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ā)過來(lái)的數(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ǔ)言編寫,使用了多種效率優(yōu)化機(jī)制爪膊,整體架構(gòu)比較新穎(push/pull)权悟,更適合異構(gòu)集群。
設(shè)計(jì)目標(biāo):
(1) 數(shù)據(jù)在磁盤上的存取代價(jià)為O(1)
(2) 高吞吐率推盛,在普通的服務(wù)器上每秒也能處理幾十萬(wàn)條消息
(3) 分布式架構(gòu)峦阁,能夠?qū)ο⒎謪^(qū)
(4) 支持將數(shù)據(jù)并行的加載到hadoop
deployment2

架構(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í)別值得一說(shuō)。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è)連接是無(wú)狀態(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等)夕春。
Flume

架構(gòu)
正如前面提到的,F(xiàn)lume采用了分層架構(gòu)专挪,由三層組成及志,分別為agent,collector和storage寨腔。其中速侈,agent和collector均由兩部分組成:source和sink,source是數(shù)據(jù)來(lái)源迫卢,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上。
flume_example1

host : syslogTcp(5140) | agentSink("localhost",35853) ;

collector : collectorSource(35853) | collectorSink("[hdfs://namenode/user/flume/](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焊唬。


flume_example2

下面是簡(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://...](hdfs://...)","src");

collectorB : collectorSource(35853) | collectorSink("[hdfs://...](hdfs://...)","src");

collectorC : collectorSource(35853) | collectorSink("[hdfs://...](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):

log-system-comapration

7. 參考資料
scribe主頁(yè):https://github.com/facebook/scribe
chukwa主頁(yè):http://incubator.apache.org/chukwa/
kafka主頁(yè):http://sna-projects.com/kafka/
Flume主頁(yè):https://github.com/apache/flume

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谨湘,隨后出現(xiàn)的幾起案子绽快,更是在濱河造成了極大的恐慌,老刑警劉巖紧阔,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坊罢,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡擅耽,警方通過查閱死者的電腦和手機(jī)活孩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)乖仇,“玉大人憾儒,你說(shuō)我怎么就攤上這事≌饩矗” “怎么了航夺?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)崔涂。 經(jīng)常有香客問我,道長(zhǎng)始衅,這世上最難降的妖魔是什么冷蚂? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任缭保,我火速辦了婚禮,結(jié)果婚禮上蝙茶,老公的妹妹穿的比我還像新娘艺骂。我一直安慰自己,他們只是感情好隆夯,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布钳恕。 她就那樣靜靜地躺著,像睡著了一般蹄衷。 火紅的嫁衣襯著肌膚如雪忧额。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天愧口,我揣著相機(jī)與錄音睦番,去河邊找鬼。 笑死耍属,一個(gè)胖子當(dāng)著我的面吹牛托嚣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播厚骗,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼示启,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了领舰?” 一聲冷哼從身側(cè)響起夫嗓,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎提揍,沒想到半個(gè)月后啤月,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡劳跃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年谎仲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刨仑。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡郑诺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杉武,到底是詐尸還是另有隱情辙诞,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布轻抱,位于F島的核電站飞涂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜较店,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一士八、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梁呈,春花似錦婚度、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至寻咒,卻和暖如春哮翘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仔涩。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工忍坷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人熔脂。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓佩研,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親霞揉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子旬薯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容