一、logstash
? ? ? Logstash: 是一個(gè)靈活的數(shù)據(jù)傳輸和處理系統(tǒng)女器,在beats出來(lái)之前,還負(fù)責(zé)進(jìn)行數(shù)據(jù)收集住诸。Logstash的任務(wù)驾胆,就是將各種各樣的數(shù)據(jù)涣澡,經(jīng)過(guò)配置轉(zhuǎn)化規(guī)則,統(tǒng)一化存入Elasticsearch丧诺。使用Ruby開(kāi)發(fā)的Logstash在靈活性上入桂,非常出色。不過(guò)性能一直是被詬病的問(wèn)題驳阎。
? ? ?由于Logstash在數(shù)據(jù)收集上并不出色抗愁,而且作為agent,性能并不達(dá)標(biāo)呵晚。elastic發(fā)布了beats系列輕量級(jí)采集組件蜘腌。至此,elastic形成了一個(gè)完整的生態(tài)鏈和技術(shù)棧饵隙,成為大數(shù)據(jù)市場(chǎng)的佼佼者撮珠。
二、Elastic?Stack?Beats 系列
? ? Beats 是 ELK Stack 技術(shù)棧中負(fù)責(zé)單一用途數(shù)據(jù)采集并推送給 Logstash 或 Elasticsearch 的輕量級(jí)產(chǎn)品金矛。? ?
? Beats 架構(gòu):
? ? beats 是一個(gè)使用 Golang 構(gòu)建的平臺(tái)芯急,libbeat 是其核心庫(kù),用來(lái)提供API進(jìn)行與Elasticsearch驶俊,Logstash 的連接志于,還能配置輸入特性和實(shí)現(xiàn)信息收集等工作。其中封裝一個(gè)輸出模塊(Publisher)废睦,輸出模塊可以負(fù)責(zé)將收集到的數(shù)據(jù)發(fā)送給 Logstash 或者 Elasticsearch伺绽。由于 go 語(yǔ)言設(shè)計(jì)有 channel,收集數(shù)據(jù)的邏輯代碼與 Publisher 都是通過(guò) channel 通信的嗜湃,耦合度的最低的奈应。因此,開(kāi)發(fā)一個(gè)收集器购披,完全不需要知道Publisher 的存在杖挣,程序運(yùn)行的時(shí)候自然就“神奇”的把數(shù)據(jù)發(fā)往服務(wù)端了。除此之外刚陡,還封裝了配置文件處理惩妇、日志處理、守護(hù)化等功能筐乳,方便開(kāi)發(fā)者拓展 beats 的能力歌殃。?
Beats?是一組輕量級(jí)采集程序的統(tǒng)稱(chēng),我們通常常用的幾個(gè)如下:
? ? ? ? 1)? filebeat: 進(jìn)行文件和目錄采集蝙云,主要用于收集日志數(shù)據(jù)氓皱。
? ? ? ? 2) metricbeat: 進(jìn)行指標(biāo)采集涝影,指標(biāo)可以是系統(tǒng)的往毡,也可以是眾多中間件產(chǎn)品的,主要用于監(jiān)控系統(tǒng)和軟件的性能。
? ? ? ? 3)packetbeat: 通過(guò)網(wǎng)絡(luò)抓包叛赚、協(xié)議分析乏奥,對(duì)一些請(qǐng)求響應(yīng)式的系統(tǒng)通信進(jìn)行監(jiān)控和數(shù)據(jù)收集嬉挡,可以收集到很多常規(guī)方式無(wú)法收集到的信息丰泊。
? ? ? ? 4) Winlogbeat: 專(zhuān)門(mén)針對(duì) windows 的 event log 進(jìn)行的數(shù)據(jù)采集。
? ? ? ? 5) Heartbeat: 系統(tǒng)間連通性檢測(cè)隙轻,比如 icmp, tcp, http 等系統(tǒng)的連通性監(jiān)控早敬。
? ? ? ? 6) 可以通過(guò) beats 生成器來(lái)生成自己的 beats
1. filebeats
? ? filebeat是構(gòu)建于beats之上的,應(yīng)用于日志收集場(chǎng)景的實(shí)現(xiàn)大脉,用來(lái)替代?Logstash Forwarder?的下一代?Logstash?收集器搞监,是為了更快速穩(wěn)定輕量低耗地進(jìn)行收集工作,它可以很方便地與?Logstash?還有直接與?Elasticsearch?進(jìn)行對(duì)接镰矿。
1) 健壯性
filebeat 異常中斷重啟后會(huì)繼續(xù)上次停止的位置琐驴。(通過(guò)${filebeat_home}\data\registry文件來(lái)記錄日志的偏移量)
2) 智能調(diào)節(jié)傳輸速度,防止logstash秤标、es 過(guò)載
Filebeat 使用壓力敏感協(xié)議(backpressure-sensitive)來(lái)傳輸數(shù)據(jù)绝淡,在 logstash 忙的時(shí)候,F(xiàn)ilebeat 會(huì)減慢讀取-傳輸速度苍姜,一旦 logstash 恢復(fù)牢酵,則 Filebeat 恢復(fù)原來(lái)的速度。
2.?Metricbeat?
??Metricbeat 是一個(gè)輕量級(jí)的系統(tǒng)級(jí)性能指標(biāo)監(jiān)控工具衙猪。收集CPU馍乙,內(nèi)存,磁盤(pán)等系統(tǒng)指標(biāo)和 Redis垫释,nginx等各種服務(wù)的指標(biāo)丝格。
? ? 1)通過(guò)在Linux,Windows棵譬,Mac上部署Metricbeat显蝌,可以收集cpu,內(nèi)存订咸,文件系統(tǒng)曼尊,磁盤(pán)IO,網(wǎng)絡(luò)IO等統(tǒng)計(jì)信息脏嚷。
? ? 2)支持采集 Apache, NGINX, MongoDB, MySQL, PostgreSQL, Redis, and ZooKeeper等服務(wù)的指標(biāo)骆撇。零依賴(lài),只需要在配置文件中啟用即可
? ? 3)如果你使用Docker管理你的服務(wù)然眼“可以在該主機(jī)上單獨(dú)起一個(gè)Metricbeat容器葵腹,他通過(guò)從proc文件系統(tǒng)中直接讀取cgroups信息來(lái)收集有關(guān)Docker主機(jī)上每個(gè)容器的統(tǒng)計(jì)信息高每。不需要特殊權(quán)限訪問(wèn)Docker API
? ? 4)Metricbeats是ELK Stack全家桶中的一員屿岂,可以和ELK無(wú)縫協(xié)同工作。例如使用Logstash二次處理數(shù)據(jù)鲸匿,用Elasticsearch分析爷怀,或者用Kibana創(chuàng)建和共享儀表盤(pán)。
3.?Packetbeat
Packetbeat 是一個(gè)輕量級(jí)的網(wǎng)絡(luò)數(shù)據(jù)包分析工具带欢。Packetbeat可以通過(guò)抓包分析應(yīng)用程序的網(wǎng)絡(luò)交互运授。并且將抓到的數(shù)據(jù)發(fā)送到 Logstash 或者Elasticsearch。?
1)Packetbeat 輕松的實(shí)時(shí)監(jiān)控并解析像HTTP這樣的網(wǎng)絡(luò)協(xié)議乔煞。以了解流量是如何經(jīng)過(guò)你的網(wǎng)絡(luò)吁朦。Packetbeat 是被動(dòng)的,不增加延遲開(kāi)銷(xiāo)渡贾,無(wú)代碼侵入逗宜,不干涉其他基礎(chǔ)設(shè)施。
2)Packetbeat是一個(gè)庫(kù)空骚,支持多種應(yīng)用程序?qū)訁f(xié)議纺讲,如 http、dns囤屹、mysal熬甚、icmp、postgres肋坚、redis 等乡括。
3)Packetbeat可以讓你實(shí)時(shí)在目標(biāo)服務(wù)器上進(jìn)行抓包-解碼-獲取請(qǐng)求和響應(yīng)-展開(kāi)字段-將json格式的結(jié)果發(fā)送到Elasticsearch。
4)Packetbeat是ELK Stack全家桶中的一員智厌,可以和ELK無(wú)縫協(xié)同工作粟判。例如使用Logstash二次處理數(shù)據(jù),用Elasticsearch分析峦剔,或者用Kibana創(chuàng)建和共享儀表盤(pán)档礁。
4.?Winlogbeat
? Winlogbeat 是一個(gè)輕量級(jí)的 Windows 事件日志收集工具。將 Windows 事件發(fā)送到 Elasticsearc h或者Logstash
? 如果你有 Windows 服務(wù)器的話吝沫,其實(shí)可以從 Windows 事件日志中看到很多東西呻澜。例如,登陸(4624),登陸失敗(4625),插入U(xiǎn)SB便攜設(shè)備(4663)或者新裝軟件(11707)惨险。WinlogBeat可以配置從任何事件日志通道讀取并且結(jié)構(gòu)化提供原始事件數(shù)據(jù)羹幸。使得通過(guò) Elasticsearch 過(guò)濾和聚合結(jié)果變得很容易。
? ??Winlogbeat是ELK Stack全家桶中的一員辫愉,可以和ELK無(wú)縫協(xié)同工作栅受。例如使用Logstash二次處理數(shù)據(jù),用Elasticsearch分析,或者用Kibana創(chuàng)建和共享儀表盤(pán)屏镊。
5.?Heartbeat
Heartbeat 是一個(gè)心跳檢測(cè)工具依疼,主要監(jiān)控服務(wù)的可用性。監(jiān)控給定的地址是否可用(官網(wǎng)原話:對(duì)于給定的URL列表而芥,Heartbeat就問(wèn)一句律罢,還活著沒(méi)?活著吱一聲棍丐。误辑。。) 可以結(jié)合ELK Stack其他產(chǎn)品做進(jìn)一步的分析
1)不管你是測(cè)試同主機(jī)服務(wù)還是其他網(wǎng)絡(luò)服務(wù)歌逢,Heartbeat都可以很輕松的生成正常運(yùn)行時(shí)間和響應(yīng)時(shí)間數(shù)據(jù)巾钉。而且修改配置不需要重啟Heartbeat
2)Heartbeat通過(guò)ICMP,TCP,和HTTP進(jìn)行ping,也支持TLS秘案,身份驗(yàn)證(authentication )睛琳,和代理(proxies)。由于簡(jiǎn)單的DNS解析踏烙,你可以監(jiān)控所有負(fù)載均衡的服務(wù)(原文:You can monitor all the hosts behind a load-balanced server thanks to simple DNS resolution)
3)現(xiàn)如今基礎(chǔ)設(shè)施师骗,服務(wù)和主機(jī)經(jīng)常動(dòng)態(tài)調(diào)整。Heartbeat可以修改配置文件后自動(dòng)加載(原文:Heartbeat makes it easy to automate the process of adding and removing monitoring targets via a simple, file-based interface.)
4)Heartbeat是ELK Stack全家桶中的一員讨惩,可以和ELK無(wú)縫協(xié)同工作辟癌。例如使用Logstash二次處理數(shù)據(jù),用Elasticsearch分析荐捻,或者用Kibana創(chuàng)建和共享儀表盤(pán)黍少。
6.?創(chuàng)建一個(gè)自己的 Beat
? ? 可以根據(jù)官方文檔,使用 beats 生成器生成自己的 beats
? ? https://www.elastic.co/cn/blog/build-your-own-beat
三处面、 Fluentd
Fluentd是一個(gè)完全開(kāi)源免費(fèi)的log信息收集軟件厂置,支持超過(guò)125個(gè)系統(tǒng)的log信息收集。其架構(gòu)圖如圖
Fluentd可以分為客戶端和服務(wù)端兩種模塊魂角£羌茫客戶端為安裝在被采集系統(tǒng)中的程序,用于讀取log文件等信息野揪,并發(fā)送到Fluentd的服務(wù)端访忿。服務(wù)端則是一個(gè)收集器。在Fluentd服務(wù)端斯稳,我們可以進(jìn)行相應(yīng)的配置海铆,使其可以對(duì)收集到的數(shù)據(jù)進(jìn)行過(guò)濾和處理,并最終路由到下一跳挣惰。下一跳可以是用于存儲(chǔ)的數(shù)據(jù)庫(kù)卧斟,如MongoDB, Amazon S3, 也可以是其他的數(shù)據(jù)處理平臺(tái)殴边,比如Hadoop。
1. install & 啟動(dòng)
由于Fluentd的安裝較為麻煩珍语,所以業(yè)界流行的穩(wěn)定安裝版本其實(shí)是有Treasure Data公司提供的td-agent
curl-Lhttps://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh|sh
通過(guò)start, stop, restart等命令可以啟動(dòng)锤岸、關(guān)閉和重啟Fluentd服務(wù)。此時(shí)默認(rèn)的Fluentd配置文件的目錄是/etc/td-agent/td-agent.conf文件廊酣。
2. Post Sample Logs via HTTP
默認(rèn)情況下能耻,/etc/td-agent/td-agent.conf文件已經(jīng)對(duì)td-agent進(jìn)行了基本的配置赏枚⊥龀郏可以接收通過(guò)HTTP Post的數(shù)據(jù),并將其路由饿幅、寫(xiě)入到/var/log/td-agent/td-agent.log中凡辱。
可嘗試通過(guò)以下curl命令來(lái)嘗試post數(shù)據(jù)。
$curl-XPOST-d'json={"json":"message"}'http://localhost:8888/debug.test
執(zhí)行之后栗恩,可在輸出log的最后一行找到我們輸入的測(cè)試數(shù)據(jù)透乾。
3. Syntax of Config
在Fluentd中,配置文件非常重要磕秤,它定義了Fluentd應(yīng)該執(zhí)行的操作乳乌。
打開(kāi)/etc/td-agent/td-agent.conf文件,可以看到配置文件的具體內(nèi)容市咆。配置文件中基本會(huì)出現(xiàn)的配置分為以下幾種:
source: 定義輸入
match:定義輸出的目標(biāo)汉操,如寫(xiě)入文件,或者發(fā)送到指定地點(diǎn)蒙兰。
filter:過(guò)濾磷瘤,也即事件處理流水線,可在輸入和輸出之間運(yùn)行搜变。
system:系統(tǒng)級(jí)別的設(shè)置采缚。
label:定義一組操作,從而實(shí)現(xiàn)復(fù)用和內(nèi)部路由挠他。
@include:引入其他文件扳抽,和Java、python的import類(lèi)似殖侵。
1)source:?定義輸入
Fluentd支持多輸入摔蓝。每一個(gè)輸入配置必須包含類(lèi)型/type,比如tcp數(shù)據(jù)輸入愉耙,或者h(yuǎn)ttp類(lèi)型輸入贮尉。type將指定使用的input plugin。以下的示例中就定義了兩個(gè)輸入源朴沿,一個(gè)是從24224端口進(jìn)入的tcp數(shù)據(jù)流猜谚,另一個(gè)是從9880端口進(jìn)入的http數(shù)據(jù)败砂。
# Receive events from 24224/tcp# This is used by log forwarding and the fluent-cat command@type forward? port 24224#http://this.host:9880/myapp.access?json={"event":"data"}@type http? port 9880
Source指定的input插件將帶有{tag, time,record} 三個(gè)屬性的事件/event提交給Fluentd的引擎,完成數(shù)據(jù)的輸入魏铅。
2)match:定義輸出的目標(biāo)昌犹,如寫(xiě)入文件,或者發(fā)送到指定地點(diǎn)
Match配置了數(shù)據(jù)流的匹配規(guī)則和匹配成功后所需執(zhí)行的動(dòng)作览芳,和路由表項(xiàng)類(lèi)似斜姥。比如以下的配置中就對(duì)匹配myapp.access標(biāo)簽成功的數(shù)據(jù)包執(zhí)行file類(lèi)型動(dòng)作,將數(shù)據(jù)寫(xiě)入到路徑為/var/log/fluent/access的文件中沧竟。
# Match events tagged with "myapp.access" and# store them to /var/log/fluent/access.%Y-%m-%d# Of course, you can control how you partition your data# with the time_slice_format option.@type file? path /var/log/fluent/access
標(biāo)準(zhǔn)的動(dòng)作有file和forward等铸敏。File表明寫(xiě)入文件,而forward表明轉(zhuǎn)發(fā)到下一跳悟泵。
Match Pattern的設(shè)計(jì)與正常的正則匹配沒(méi)有區(qū)別杈笔,具體的分類(lèi)如下:
*:匹配tag的某一部分,比如a.*可以匹配a.b,但a.b.c無(wú)法匹配成功糕非。**:匹配0個(gè)或者多個(gè)tag部分蒙具。比如a.**可以匹配a.b,a.b.c{X,Y,Z}:匹配X,Y,orZ,或關(guān)系。
此外朽肥,他們還可以混用禁筏,比如a.{b,c,d}.*等等。當(dāng)標(biāo)簽內(nèi)衡招,有多個(gè)匹配模式時(shí)篱昔,將支持或邏輯的匹配,即只要匹配成功人一個(gè)都執(zhí)行對(duì)應(yīng)的操作蚁吝。比如:
匹配a和b.匹配a,a.b,a.b.c
3)Logging
Fluentd支持兩種類(lèi)型的logging 配置旱爆,一種是 global 全局的,另一種是針對(duì)插件的Plugin窘茁。
支持的log的輸出級(jí)別有如下幾種:
fatal error warn info debug trace
4)Fluentd有5種類(lèi)型的插件怀伦,分別是:
Input:完成輸入數(shù)據(jù)的讀取,由source部分配置
Parser:解析插件
Output:完成輸出數(shù)據(jù)的操作山林,由match部分配置
Formatter:消息格式化的插件房待,屬于filter類(lèi)型
Buffer:緩存插件,用于緩存數(shù)據(jù)
每一個(gè)類(lèi)型都包含著多種的插件驼抹,比如input類(lèi)型就包含了以下幾種插件:
in_forward? ?in_http? ?in_tail? ?in_exec? in_syslog? in_scribe
5)Route
Route指的是數(shù)據(jù)在Fluentd中的處理流水線桑孩,一般的流程為
input -> filter -> output
input -> filter -> output with label
即由輸入插件獲取數(shù)據(jù),然后交給filter做處理框冀,然后交給output插件去轉(zhuǎn)發(fā)流椒。同時(shí),也支持?jǐn)?shù)據(jù)包/事件的重新提交明也,比如修改tag之后重新路由等等宣虾。
reroute event by tags
reroute event by record content
reroute event to other label
4. Use case
此處將選擇一個(gè)最簡(jiǎn)單的使用案例來(lái)介紹Fluentd的使用惯裕。Fluentd收集Docker的登陸信息案例。
首先創(chuàng)建一個(gè)config file, 用于配置Fluentd的行為绣硝,可命名為”in_docker.conf“蜻势。
type forward? port 24224? bind 0.0.0.0type stdout
然后保存文件。使用以下命令運(yùn)行Fluentd鹉胖。
$fluentd-cin_docker.conf
若運(yùn)行成功則可見(jiàn)輸出信息如下所示:
$ fluentd -c in_docker.conf2015-09-01 15:07:12 -0600 [info]: reading config file path="in_docker.conf"2015-09-01 15:07:12 -0600 [info]: starting fluentd-0.12.152015-09-01 15:07:12 -0600 [info]: gem 'fluent-plugin-mongo' version '0.7.10'2015-09-01 15:07:12 -0600 [info]: gem 'fluentd' version '0.12.15'2015-09-01 15:07:12 -0600 [info]: adding match pattern="*.*" type="stdout"2015-09-01 15:07:12 -0600 [info]: adding source type="forward"2015-09-01 15:07:12 -0600 [info]: using configuration file:@type forward? ? port 24224? ? bind 0.0.0.0@type stdout2015-09-01 15:07:12 -0600 [info]: listening fluent socket on 0.0.0.0:24224
然后啟動(dòng)docker containner握玛。如果之前沒(méi)有安裝過(guò)docker engine,請(qǐng)讀者自行安裝甫菠。由于docker 本身支持Fluentd收集信息挠铲,所以可以通過(guò)啟動(dòng)命令來(lái)啟動(dòng)Fluentd的client/客戶端。
$dockerrun--log-driver=fluentdubuntuecho"Hello Fluentd!"HelloFluentd!
以上命令中的ubuntu為一個(gè)鏡像淑蔚,如果本地沒(méi)有市殷,docker engine會(huì)自動(dòng)下載愕撰,并在此鏡像上創(chuàng)建容器刹衫。啟動(dòng)容器后,查看默認(rèn)的輸出信息文件:/var/log/td-agent/td-agent.log,可在最后一行查看到輸出的信息搞挣。
總結(jié)
Fluentd是一個(gè)優(yōu)秀的log信息收集的開(kāi)源免費(fèi)軟件带迟,目前以支持超過(guò)125種系統(tǒng)的log信息獲取。Fluentd結(jié)合其他數(shù)據(jù)處理平臺(tái)的使用囱桨,可以搭建大數(shù)據(jù)收集和處理平臺(tái)仓犬,搭建商業(yè)化的解決方案。
四舍肠、Fluentd & logstash 對(duì)比
logstash支持所有主流日志類(lèi)型搀继,插件支持最豐富,可以靈活DIY翠语,但性能較差叽躯,JVM容易導(dǎo)致內(nèi)存使用量高。
fluentd支持所有主流日志類(lèi)型肌括,插件支持較多点骑,性能表現(xiàn)較好。
參考:
http://www.reibang.com/p/9c26bd9f6ebd
https://juejin.im/entry/58bad514ac502e006bf70517
http://soft.dog/2015/12/24/beats-basic/
http://www.muzixing.com/tag/fluentd.html