ELKStack高級(jí)實(shí)戰(zhàn)培訓(xùn)
http://files.cnblogs.com/files/MYSQLZOUQI/ELKStack%E9%AB%98%E7%BA%A7%E5%AE%9E%E6%88%98%E5%9F%B9%E8%AE%AD.rar
ELK Stack深入淺出PPT.rar
http://files.cnblogs.com/files/MYSQLZOUQI/ELKStack%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA.rar
https://www.rizhiyi.com/docs/upload/rsyslog.html
以下操作假定您擁有root或sudo權(quán)限,在通用的Linux平臺(tái)使用5.8.0或更高版本的rsyslog。配置完成后您新增的日志文件將通過(guò)UDP協(xié)議的514端口發(fā)送到日志易
logstash和Elasticsearch是用Java寫的,kibana使用node.js框架。
http://www.ttlsa.com/?s=elk
http://www.ttlsa.com/elk/elk-upgrade-logstash-to-2-and-logstash-forwarder-to-filebeat/
http://www.ttlsa.com/elk/elk-logstash-structure/
http://www.ttlsa.com/elk/elk-logstash-process-pipeline/
http://www.ttlsa.com/elk/elk-logstash-configuration-syntax/
http://www.ttlsa.com/log-system/installing-logstash-on-rhel-and-centos/
Logstash:負(fù)責(zé)日志的收集,處理,索引
Elasticsearch:負(fù)責(zé)日志檢索和分析和儲(chǔ)存
Kibana:用于搜索和可視化的日志的Web界面,通過(guò)nginx反代
Logstash Forwarder: 安裝在將要把日志發(fā)送到logstash的服務(wù)器上,作為日志轉(zhuǎn)發(fā)的道理,通過(guò) lumberjack 網(wǎng)絡(luò)協(xié)議與 Logstash 服務(wù)通訊
注意:logstash-forwarder要被beats替代了,關(guān)注后續(xù)內(nèi)容。后續(xù)會(huì)轉(zhuǎn)到logstash+elasticsearch+beats上。
組件預(yù)覽
JDK - http://www.oracle.com/technetwork/java/javase/downloads/index.html
Elasticsearch - https://www.elastic.co/downloads/elasticsearch
Logstash - https://www.elastic.co/downloads/logstash
Kibana - https://www.elastic.co/downloads/kibana
redis - http://redis.io/download
文章:http://www.ttlsa.com/bigdata/elk-platform-for-log-management/
---------------------------------------------------
ELK 常見(jiàn)錯(cuò)誤處理
ELK 這里就不介紹了,如何安裝請(qǐng)參考博客之前的文章。在這里感謝ttlsa團(tuán)隊(duì),同時(shí),我很榮幸能加入到ttlsa團(tuán)隊(duì)中,分享點(diǎn)滴,涼白開(kāi)說(shuō)發(fā)文章有紅包,期待這篇群主能給多少紅包。哈哈。
好了,不閑扯,下面總結(jié)下ELK使用過(guò)程中遇到的常見(jiàn)問(wèn)題以及解決方案。
1. Kibana No Default Index Pattern Warning
當(dāng)訪問(wèn)kibana頁(yè)面時(shí),出現(xiàn)下面的信息:
Warning No default index pattern. You must select or create one to continue.
...
Unable to fetch mapping. Do you have indices matching the pattern?
Warning No default index pattern. You must select or create one to continue.
...
Unable to fetch mapping. Do you have indices matching the pattern?
下面是截圖:
Elasticsearch
這就說(shuō)明logstash沒(méi)有把日志寫入到elasticsearch。
解決方法:
檢查logstash與elasticsearch之間的通訊是否有問(wèn)題,一般問(wèn)題就在這。
2. Kibana Unable to connect to Elasticsearch
訪問(wèn)kibana出現(xiàn)下面錯(cuò)誤信息:
Fatal Error
Kibana: Unable to connect to Elasticsearch
Error: Unable to connect to Elasticsearch
Error: Bad Gateway
Fatal Error
Kibana: Unable to connect to Elasticsearch
Error: Unable to connect to Elasticsearch
Error: Bad Gateway
這個(gè)問(wèn)題很明顯,Kibana不能連接到Elasticsearch ,可能 Elasticsearch沒(méi)有運(yùn)行 或Kibana 沒(méi)有配置正確的elasticsearch服務(wù)地址。
解決方法:
檢查kibana目錄下的config/kibana.yml文件,查看elasticsearch配置是否正確。
3. logstash Configuration Contains a Syntax Error
logstash 語(yǔ)法錯(cuò)誤,這個(gè)問(wèn)題一般各種各樣的。主要是logstash配置文件不對(duì)導(dǎo)致的。
解決方法:
在啟動(dòng)logstash前,先檢查下logstash配置文件是否有問(wèn)題,可通過(guò)下面命令檢測(cè):
/opt/logstash/bin/logstash --configtest -f /etc/logstash/conf.d/30-lumberjack-output.conf
后面指定你自己的配置文件。
4. logstash-forwarder Configuration Contains a Syntax Error
/etc/logstash-forwarder.conf 是一個(gè)json格式的配置文件。出錯(cuò)一般是json格式不對(duì),如{}、[]不匹對(duì)。
5. SSL Certificate is Missing or Invalid
logstash forwarder 與 logstash 之間通訊需要SSL。如果缺少SSL,服務(wù)是啟動(dòng)不了的。需要將logstash上生產(chǎn)的證書拷貝到logstash forwarder服務(wù)器上。
同時(shí),還要考慮到生產(chǎn)證書時(shí)候, 如果/etc/ssl/openssl.cnf文件[ v3_ca ] 段 subjectAltName = IP: logstash_server_private_ip。logstash forwarder配置文章指定的logstash服務(wù)的IP地址要與證書的相匹配。
文章:http://www.ttlsa.com/log-system/troubleshooting-elk-common-issues/
---------------------------------------------------
解析elasticsearch的config下的配置文件
network.bind_host: 192.168.0.1
設(shè)置綁定的ip地址,可以是ipv4或ipv6的,默認(rèn)為0.0.0.0。
network.publish_host: 192.168.0.1
設(shè)置其它節(jié)點(diǎn)和該節(jié)點(diǎn)交互的ip地址,如果不設(shè)置它會(huì)自動(dòng)判斷,值必須是個(gè)真實(shí)的ip地址。
network.host: 192.168.0.1
這個(gè)參數(shù)是用來(lái)同時(shí)設(shè)置bind_host和publish_host上面兩個(gè)參數(shù)。
文章:http://blog.csdn.net/an74520/article/details/8219814
------------------------------------------------
配置logstash
logstash配置文件是以json格式設(shè)置參數(shù)的,配置文件位于/etc/logstash/conf.d目錄下,配置包括三個(gè)部分:輸入端,過(guò)濾器和輸出端。
# vi /etc/logstash/conf.d/11-nginx.conf
filter {
if [type] == "nginx" {
grok {
match => { "message" => "%{IPORHOST:clientip} - %{NOTSPACE:remote_user} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:method} %{NOTSPACE:request}(?: %{URIPROTO:proto}/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:status} (?:%{NUMBER:upstime}|-) %{NUMBER:reqtime} (?:%{NUMBER:size}|-) %{QS:referrer} %{QS:agent} %{QS:xforwardedfor} %{QS:reqbody} %{WORD:scheme} (?:%{IPV4:upstream}(:%{POSINT:port})?|-)" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
date {
match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
}
geoip {
source => "clientip"
add_tag => [ "geoip" ]
fields => ["country_name", "country_code2","region_name", "city_name", "real_region_name", "latitude", "longitude"]
remove_field => [ "[geoip][longitude]", "[geoip][latitude]" ]
}
}
}
這個(gè)過(guò)濾器會(huì)尋找被標(biāo)記為“nginx”類型(Logstash-forwarder定義的)的日志,嘗試使用“grok”來(lái)分析傳入的nginx日志,使之結(jié)構(gòu)化和可查詢。
type要與logstash-forwarder相匹配。
同時(shí),注意將nginx日志格式設(shè)置成下面的:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $upstream_response_time $request_time $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$http_x_forwarded_for" "$request_body" '
'$scheme $upstream_addr';
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $upstream_response_time $request_time $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$http_x_forwarded_for" "$request_body" '
'$scheme $upstream_addr';
日志格式不對(duì),grok匹配規(guī)則要重寫。
通過(guò)http://grokdebug.herokuapp.com/ 在線工具進(jìn)行調(diào)試。
logstash默認(rèn)自帶了apache標(biāo)準(zhǔn)日志的grok正則
grok 匹配日志不成功,不要往下看了。搞對(duì)為止先
Discover:輸入日志,會(huì)自動(dòng)生成一個(gè)匹配規(guī)則讓你參考
patterns:顯示常用的匹配規(guī)則
顯示匹配結(jié)果需要FQ,否則不能顯示結(jié)果
文章:http://www.ttlsa.com/elk/howto-install-elasticsearch-logstash-and-kibana-elk-stack/
----------------------------------------------------
ELK 產(chǎn)品支持的平臺(tái)和軟件
c. 支持的kibana版本
Kibana Version ES Version Compatibility Shield Version Compatibility
3.1x 0.90.9 and greater 1.0.x-1.2.x
4.0.0-4.1.x 1.4.x-1.7.x 1.0.x-1.3.x
4.2.0+ 2.0.0 2.0.0
e. 支持的watcher版本
Watcher Version ES Version Compatibility
1.0.0 1.5.0 and greater
2.0.0 2.0.0
f. 支持的logstash版本
Logstash Version ES Version Compatibility Shield Version Compatibility
1.5.x 1.0.0 and greater 1.0.0 and greater
2.0.x 1.0.0 and greater 1.0.0 and greater
logstash 1.5.x 版本僅支持ES 2.0.0 以及更高版本的HTTP協(xié)議
文章:http://www.ttlsa.com/elk/elk-supported-platforms-and-software/
---------------------------------------------------
ELK elasticsearch 核心術(shù)語(yǔ)(2nd)
NRT
elasticsearch是一個(gè)近似實(shí)時(shí)的搜索平臺(tái),從索引文檔到可搜索有些延遲,通常為1秒。
集群
集群就是一個(gè)或多個(gè)節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù),并提供跨節(jié)點(diǎn)的聯(lián)合索引和搜索的功能。集群有一個(gè)唯一性標(biāo)示的名字,默認(rèn)是elasticsearch,集群名字很重要,每個(gè)節(jié)點(diǎn)是基于集群名字加入到其集群中的。因此,確保在不同環(huán)境中使用不同的集群名字。
一個(gè)集群可以只有一個(gè)節(jié)點(diǎn)。
強(qiáng)烈建議在配置elasticsearch時(shí),配置成集群模式。
節(jié)點(diǎn)
節(jié)點(diǎn)就是一臺(tái)單一的服務(wù)器,是集群的一部分,存儲(chǔ)數(shù)據(jù)并參與集群的索引和搜索功能。像集群一樣,節(jié)點(diǎn)也是通過(guò)名字來(lái)標(biāo)識(shí),默認(rèn)是在節(jié)點(diǎn)啟動(dòng)時(shí)隨機(jī)分配的字符名。當(dāng)然啦,你可以自己定義。該名字也蠻重要的,在集群中用于識(shí)別服務(wù)器對(duì)應(yīng)的節(jié)點(diǎn)。
節(jié)點(diǎn)可以通過(guò)指定集群名字來(lái)加入到集群中。默認(rèn)情況下,每個(gè)節(jié)點(diǎn)被設(shè)置成加入到elasticsearch集群。如果啟動(dòng)了多個(gè)節(jié)點(diǎn),假設(shè)能自動(dòng)發(fā)現(xiàn)對(duì)方,他們將會(huì)自動(dòng)組建一個(gè)名為elasticsearch的集群。
索引
索引是有幾分相似屬性的一系列文檔的集合。如nginx日志索引、syslog索引等等。索引是由名字標(biāo)識(shí),名字必須全部小寫。這個(gè)名字用來(lái)進(jìn)行索引、搜索、更新和刪除文檔的操作。
索引相對(duì)于關(guān)系型數(shù)據(jù)庫(kù)的庫(kù)。
類型
在一個(gè)索引中,可以定義一個(gè)或多個(gè)類型。類型是一個(gè)邏輯類別還是分區(qū)完全取決于你。通常情況下,一個(gè)類型被定于成具有一組共同字段的文檔。如ttlsa運(yùn)維生成時(shí)間所有的數(shù)據(jù)存入在一個(gè)單一的名為logstash-ttlsa的索引中,同時(shí),定義了用戶數(shù)據(jù)類型,帖子數(shù)據(jù)類型和評(píng)論類型。
類型相對(duì)于關(guān)系型數(shù)據(jù)庫(kù)的表。
文檔
文檔是信息的基本單元,可以被索引的。文檔是以JSON格式表現(xiàn)的。
在類型中,可以根據(jù)需求存儲(chǔ)多個(gè)文檔。
雖然一個(gè)文檔在物理上位于一個(gè)索引,實(shí)際上一個(gè)文檔必須在一個(gè)索引內(nèi)被索引和分配一個(gè)類型。
文檔相對(duì)于關(guān)系型數(shù)據(jù)庫(kù)的行記錄。
分片和副本
在實(shí)際情況下,索引存儲(chǔ)的數(shù)據(jù)可能超過(guò)單個(gè)節(jié)點(diǎn)的硬件限制。如一個(gè)十億文檔需1TB空間可能不適合存儲(chǔ)在單個(gè)節(jié)點(diǎn)的磁盤上,或者從單個(gè)節(jié)點(diǎn)搜索請(qǐng)求太慢了。為了解決這個(gè)問(wèn)題,elasticsearch提供將索引分成多個(gè)分片的功能。當(dāng)在創(chuàng)建索引時(shí),可以定義想要分片的數(shù)量。每一個(gè)分片就是一個(gè)全功能的獨(dú)立的索引,可以位于集群中任何節(jié)點(diǎn)上。
分片的兩個(gè)最主要原因:
水平分割擴(kuò)展,增大存儲(chǔ)量
分布式并行跨分片操作,提高性能和吞吐量
分布式分片的機(jī)制和搜索請(qǐng)求的文檔如何匯總完全是有elasticsearch控制的,這些對(duì)用戶而言是透明的。
網(wǎng)絡(luò)問(wèn)題等等其它問(wèn)題可以在任何時(shí)候不期而至,為了健壯性,強(qiáng)烈建議要有一個(gè)故障切換機(jī)制,無(wú)論何種故障以防止分片或者節(jié)點(diǎn)不可用。
為此,elasticsearch讓我們將索引分片復(fù)制一份或多份,稱之為分片副本或副本。
副本也有兩個(gè)最主要原因:
高可用性,以應(yīng)對(duì)分片或者節(jié)點(diǎn)故障。出于這個(gè)原因,分片副本要在不同的節(jié)點(diǎn)上。
提供性能,增大吞吐量,搜索可以并行在所有副本上執(zhí)行。
總之,每一個(gè)索引可以被分成多個(gè)分片。索引也可以有0個(gè)或多個(gè)副本。復(fù)制后,每個(gè)索引都有主分片(母分片)和復(fù)制分片(復(fù)制于母分片)。分片和副本數(shù)量可以在每個(gè)索引被創(chuàng)建時(shí)定義。索引創(chuàng)建后,可以在任何時(shí)候動(dòng)態(tài)的更改副本數(shù)量,但是,不能改變分片數(shù)。
默認(rèn)情況下,elasticsearch為每個(gè)索引分片5個(gè)主分片和1個(gè)副本,這就意味著集群至少需要2個(gè)節(jié)點(diǎn)。索引將會(huì)有5個(gè)主分片和5個(gè)副本(1個(gè)完整副本),每個(gè)索引總共有10個(gè)分片。
每個(gè)elasticsearch分片是一個(gè)Lucene索引。一個(gè)單個(gè)Lucene索引有最大的文檔數(shù)LUCENE-5843, 文檔數(shù)限制為2147483519(MAX_VALUE - 128)。 可通過(guò)_cat/shards來(lái)監(jiān)控分片大小。
Elasticsearch
這里的所言的復(fù)制和副本是同一個(gè)意思。
這部分內(nèi)容比較枯燥無(wú)味,不過(guò)蠻重要的,貫穿于整個(gè)elasticsearch。
文章:http://www.ttlsa.com/elk/elk-elasticsearch-core-concept/
---------------------------------------------------
1. jdk
elasticsearch只支持Oracle java 和 OpenJDK。
文章:http://www.ttlsa.com/elk/elk-elasticsearch-install/
elasticsearch 2.0.0版本不能以root用戶啟動(dòng)。
useradd elasticsearch -M -s /sbin/nologin
---------------------------------------------------
elasticsearch滾動(dòng)升級(jí)過(guò)程,不會(huì)造成服務(wù)中斷。elasticsearch提供兩種升級(jí)類型:全集群重啟和滾動(dòng)升級(jí)。
elasticsearch版本所支持的升級(jí)類型如下表:
Upgrade From Upgrade To Supported Upgrade Type
0.90.x 1.x, 2.x Full cluster restart
< 0.90.7 0.90.x Full cluster restart
>= 0.90.7 0.90.x Rolling upgrade
1.0.0 - 1.3.1 1.x Rolling upgrade (if indices.recovery.compress set to false)
>= 1.3.2 1.x Rolling upgrade
1.x 2.x Full cluster restart
重要的事情再?gòu)?qiáng)調(diào)一遍,在執(zhí)行升級(jí)之前,務(wù)必先備份數(shù)據(jù),這將給你留條后路,如果升級(jí)后出現(xiàn)問(wèn)題還允許你回滾到之前的版本,否則死無(wú)葬身之地。
文章:http://www.ttlsa.com/elk/elk-elasticsearch-1-7-2-upgrade-to-2-0-0/
---------------------------------------------------
插件能額外擴(kuò)展elasticsearch功能,提供各類功能等等。有三種類型的插件:
java插件
只包含JAR文件,必須在集群中每個(gè)節(jié)點(diǎn)上安裝而且需要重啟才能使插件生效。
網(wǎng)站插件
這類插件包含靜態(tài)web內(nèi)容,如js、css、html等等,可以直接從elasticsearch服務(wù),如head插件。只需在一個(gè)節(jié)點(diǎn)上安裝,不需要重啟服務(wù)。可以通過(guò)下面的URL訪問(wèn),如:http://node-ip:9200/_plugin/plugin_name
混合插件
顧名思義,就是包含上面兩種的插件。
安裝中文分詞插件ik,請(qǐng)參考之前的文章
kibana的附加功能是通過(guò)插件模塊來(lái)實(shí)現(xiàn)的??梢酝ㄟ^(guò)bin/kibana plugin命令來(lái)管理插件。
文章:http://www.ttlsa.com/elk/elk-elasticsearch-plugin-management/
---------------------------------------------------
ELK kibana查詢與過(guò)濾(17th)
創(chuàng)建查詢
在Discover界面的搜索欄輸入要查詢的字段。查詢語(yǔ)法是基于Lucene的查詢語(yǔ)法。允許布爾運(yùn)算符、通配符和字段篩選。注意關(guān)鍵字要大寫。如查詢類型是http,且狀態(tài)碼是302。type: http AND http.code: 302。
字符串查詢
查詢可以包含一個(gè)或多個(gè)字或者短語(yǔ)。短語(yǔ)需要使用雙引號(hào)引起來(lái)。如:
每個(gè)字段都會(huì)匹配過(guò)去。要搜索一個(gè)確切的字符串,需要使用雙引號(hào)引起來(lái)。
如果不帶引號(hào),將會(huì)匹配每個(gè)單詞。
kibana會(huì)忽略特殊字符。
基于字段的查詢
只搜索特定的字段。
正則表達(dá)式查詢
kibana支持正則表達(dá)式過(guò)濾器和表達(dá)式。
返回查詢
允許一個(gè)字段值在某個(gè)區(qū)間。[] 包含該值,{}不包含。
布爾查詢
布爾運(yùn)算符(AND,OR,NOT)允許通過(guò)邏輯運(yùn)算符組合多個(gè)子查詢。
運(yùn)算符AND/OR/NOT必須大寫。
NOT type: mysql
mysql.method: SELECT AND mysql.size: [10000 TO *]
(mysql.method: INSERT OR mysql.method: UPDATE) AND responsetime: [30 TO *]
創(chuàng)建過(guò)濾器
可通過(guò)單擊可視化中的元素進(jìn)行篩選。
綠色filter for value 紅色filter out value。
文章:http://www.ttlsa.com/elk/elk-kibana-query-and-filter/
---------------------------------------------------
ELK logstash 部署指南與版本變化(
新版本改變
logstash2.0版本的一些改變與以前的版本不兼容
文章:http://www.ttlsa.com/elk/elk-install-guide-and-version-changes/
---------------------------------------------------
---------------------------------------------------
將從logstash1.5版本升級(jí)到2.1版本,以及將《ELK部署指南》中使用的logstash-forwarder轉(zhuǎn)移到Filebeat上。
升級(jí)步驟
1.停止logstash以及發(fā)送到logstash的所有管道。
2.更新apt或yum源或者下載新版包。
3.安裝新版的logstash。
4.測(cè)試logstash配置文件是否正確。
5.啟動(dòng)logstash以及第一步停止的管道。
關(guān)閉logstash以及輸入的管道。
# /etc/init.d/topbeat stop
# /etc/init.d/packetbeat stop
# /etc/init.d/filebeat stop
# /etc/init.d/logstash-forwarder stop
# /etc/init.d/logstash stop
這節(jié)會(huì)將logstash-forwarder遷移到Filebeat上了,后續(xù)不再啟動(dòng)logstash-forwarder了。
2. 升級(jí)logstash,添加yum源參見(jiàn)前文。
# yum update logstash
3. 檢查配置文件
我的配置文件是以《ELK部署指南》中的配置文件為原型的。
# /opt/logstash/bin/logstash --configtest -f /etc/logstash/conf.d/01-lumberjack-input.conf
Configuration OK
# /opt/logstash/bin/logstash --configtest -f /etc/logstash/conf.d/10-active.conf
Configuration OK
文章:http://www.ttlsa.com/elk/elk-upgrade-logstash-to-2-and-logstash-forwarder-to-filebeat/
---------------------------------------------------
ELK logstash 結(jié)構(gòu)
在命令行中指定-e參數(shù),從標(biāo)準(zhǔn)輸入到標(biāo)準(zhǔn)輸出,并格式化結(jié)果。
# /opt/logstash/bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
www.ttlsa.com
Settings: Default filter workers: 2
Logstash startup completed
{
"message" => "www.ttlsa.com",
"@version" => "1",
"@timestamp" => "2015-12-07T06:57:01.981Z",
"host" => "localhost"
}
# /opt/logstash/bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
www.ttlsa.com
Settings: Default filter workers: 2
Logstash startup completed
{
"message" => "www.ttlsa.com",
"@version" => "1",
"@timestamp" => "2015-12-07T06:57:01.981Z",
"host" => "localhost"
}
logstash會(huì)給事件添加一些額外的信息,如@timestamp,標(biāo)注事件發(fā)生的時(shí)間。host標(biāo)注事件發(fā)生的主機(jī)。此外,還可能有下面幾個(gè)信息:
type:標(biāo)記事件的唯一類型
tags:標(biāo)記事件某方面屬性,可以有多個(gè)標(biāo)簽。
每個(gè)事件就是一個(gè)ruby對(duì)象,可以隨意的給事件添加或者刪除字段。每個(gè)logstash過(guò)濾插件,都會(huì)有四個(gè)方法add_tag,remove_tag,add_field, remove_field,它們?cè)谶^(guò)濾匹配成功時(shí)生效。
logstash管道必須要有input和output元素,filter元素是可選的。input插件定義數(shù)據(jù)來(lái)源,filter插件用來(lái)修改用戶指定的數(shù)據(jù),output插件定義數(shù)據(jù)寫入何地。
logstash結(jié)構(gòu)如下所示:
ELK
下面是一個(gè)配置管道:
# The # character at the beginning of a line indicates a comment. Use
# comments to describe your configuration.
input {
}
# The filter part of this file is commented out to indicate that it is
# optional.
# filter {
#
# }
output {
}
input {
}
# The filter part of this file is commented out to indicate that it is
# optional.
# filter {
#
# }
output {
}
在現(xiàn)實(shí)情況下,數(shù)據(jù)來(lái)源可能有多個(gè),以及將數(shù)據(jù)寫入到不同的目的地。logstash管道可以使用多個(gè)input和output來(lái)處理這些需求。
下面的例子從Twitter feed和Filebeat input,將信息發(fā)送到elasticsearch集群和直接寫入到文件。
input {
twitter {
consumer_key =>
consumer_secret =>
keywords =>
oauth_token =>
oauth_token_secret =>
}
beats {
port => "5043"
ssl => true
ssl_certificate => "/path/to/ssl-cert"
ssl_key => "/path/to/ssl-key"
}
}
output {
elasticsearch {
hosts => ["IP Address 1:port1", "IP Address 2:port2", "IP Address 3"]
}
file {
path => /path/to/target/file
}
}
input {
twitter {
consumer_key =>
consumer_secret =>
keywords =>
oauth_token =>
oauth_token_secret =>
}
beats {
port => "5043"
ssl => true
ssl_certificate => "/path/to/ssl-cert"
ssl_key => "/path/to/ssl-key"
}
}
output {
elasticsearch {
hosts => ["IP Address 1:port1", "IP Address 2:port2", "IP Address 3"]
}
file {
path => /path/to/target/file
}
}
Filebeat debug信息:
# filebeat -d 'publish' -e
2015/12/07 07:46:12.170451 publish.go:100: DBG Publish: {
"@timestamp": "2015-12-07T07:46:09.670Z",
"beat": {
"hostname": "elk.ttlsa.com",
"name": "elk.ttlsa.com"
},
"count": 1,
"fields": null,
"input_type": "log",
"message": "218.28.24.98 - - [07/Dec/2015:15:46:07 +0800] \"POST /www.ttlsa.com HTTP/1.0\" 200 0.139 0.141 3890 \"-\" \"Apache-HttpClient/UNAVAILABLE (java 1.4)\" \"\" \"\" http 127.0.0.1:9000",
"offset": 12145391,
"source": "/data/logs/<a title="nginx"target="_blank">nginx</a>/www.ttlsa.com-access.log",
"type": "nginx"
}
# filebeat -d 'publish' -e
2015/12/07 07:46:12.170451 publish.go:100: DBG Publish: {
"@timestamp": "2015-12-07T07:46:09.670Z",
"beat": {
"hostname": "elk.ttlsa.com",
"name": "elk.ttlsa.com"
},
"count": 1,
"fields": null,
"input_type": "log",
"message": "218.28.24.98 - - [07/Dec/2015:15:46:07 +0800] \"POST /www.ttlsa.com HTTP/1.0\" 200 0.139 0.141 3890 \"-\" \"Apache-HttpClient/UNAVAILABLE (java 1.4)\" \"\" \"\" http 127.0.0.1:9000",
"offset": 12145391,
"source": "/data/logs/nginx/www.ttlsa.com-access.log",
"type": "nginx"
}
停止logstash服務(wù)的失效檢測(cè)
正常關(guān)閉logstash服務(wù)的步驟如下:
關(guān)閉所有的input、filter和output插件
處理完正在處理的事件
中止logstash進(jìn)程
下列因素影響關(guān)閉過(guò)程:
input插件緩慢的接收數(shù)據(jù)
緩慢的filter
output插件斷開(kāi)連接等待重連
這些情況使成功關(guān)閉logstash的服務(wù)不可預(yù)知。
logstash具有分析管道行為和插件停止的失效檢測(cè)機(jī)制。這種機(jī)制周期性的產(chǎn)生有關(guān)內(nèi)部事件隊(duì)列和一系列繁忙工作線程的信息。
為了強(qiáng)制logstash停止,可以在啟動(dòng)時(shí)加上--allow-unsafe-shutdown參數(shù)。不過(guò)不推薦使用,以免丟失數(shù)據(jù)。
文章:http://www.ttlsa.com/elk/elk-logstash-structure/
---------------------------------------------------
ELK logstash處理流程
logstash處理事件有三個(gè)階段:input ---> filter ---> output。input產(chǎn)生事件,事件是一個(gè)ruby對(duì)象
input 、filter 、output是插件
當(dāng)前l(fā)ogstash線程模型是:
input threads | filter worker threads | output worker
input單線程
filter 多個(gè)worker線程 因?yàn)槎鄠€(gè)過(guò)濾器 filter workers默認(rèn)是1,在啟動(dòng)logstash時(shí),可以通過(guò)-w指定。
output 多個(gè)worker線程 因?yàn)槎鄠€(gè)輸出地點(diǎn) output當(dāng)前工作模式是一個(gè)線程。output接收事件的順序是以配置文件定義的輸出順序,output可以緩存事件,避免像elasticsearch停止響應(yīng)而發(fā)生整個(gè)logstash罷工
logstash通常至少有3個(gè)線程,如果沒(méi)有filter只有2個(gè)。一個(gè)input線程,一個(gè)filter worker線程,和一個(gè)output線程。
文章:http://www.ttlsa.com/elk/elk-logstash-process-pipeline/
---------------------------------------------------
ELK logstash 配置語(yǔ)法
數(shù)據(jù)類型
logstash支持的數(shù)據(jù)類型有:
array
數(shù)組可以是單個(gè)或者多個(gè)字符串值。
path => [ "/var/log/messages", "/var/log/*.log" ]
path => "/data/mysql/mysql.log"
如果指定了多次,追加數(shù)組。此實(shí)例path數(shù)組包含三個(gè)字符串元素。
boolean
布爾值必須是TRUE或者false。true和false不能有引號(hào),從elasticsearch2.0開(kāi)始里面存儲(chǔ)的是1和0。
ssl_enable => true
bytes
指定字節(jié)單位。支持的單位有SI (k M G T P E Z Y) 和 Binary (Ki Mi Gi Ti Pi Ei Zi Yi)。Binary單位基于1024,SI單位基于1000。不區(qū)分大小寫和忽略值與單位之間的空格。如果沒(méi)有指定單位,默認(rèn)是byte。
my_bytes => "1113" # 1113 bytes
my_bytes => "10MiB" # 10485760 bytes
my_bytes => "100kib" # 102400 bytes
my_bytes => "180 mb" # 180000000 bytes
Codec
logstash編碼名稱用來(lái)表示數(shù)據(jù)編碼。用于input和output段。便于數(shù)據(jù)的處理。如果input和output使用合適的編碼,就無(wú)需單獨(dú)的filter對(duì)數(shù)據(jù)進(jìn)行處理。
codec => "json"
hash
鍵值對(duì),注意多個(gè)鍵值對(duì)用空格分隔,而不是逗號(hào)。
match => {
"field1" => "value1"
"field2" => "value2"
... }
number
必須是有效的數(shù)值,浮點(diǎn)數(shù)或者整數(shù)。
port => 33
password
一個(gè)單獨(dú)的字符串。
my_password => "password"
path
一個(gè)代表有效的操作系統(tǒng)路徑。
my_path => "/tmp/logstash"
string
name => "Hello world"
name => 'It\'s a beautiful day'
文章:http://www.ttlsa.com/elk/elk-logstash-configuration-syntax/
---------------------------------------------------
Logstash 日志管理工具
/usr/local/kibana/config/kibana.yml
您還可以修改default_route參數(shù),默認(rèn)打開(kāi)logstash儀表板而不是Kibana歡迎頁(yè)面:
default_route : '/dashboard/file/logstash.json',
通過(guò)web界面訪問(wèn)
文章:http://www.ttlsa.com/log-system/installing-logstash-on-rhel-and-centos/
---------------------------------------------------
Hello World
每位系統(tǒng)管理員都肯定寫過(guò)很多類似這樣的命令:cat randdata | awk '{print $2}' | sort | uniq -c | tee sortdata。這個(gè)管道符 | 可以算是 Linux 世界最偉大的發(fā)明之一(另一個(gè)是“一切皆文件”)。
Logstash 就像管道符一樣!
你輸入(就像命令行的 cat )數(shù)據(jù),然后處理過(guò)濾(就像 awk 或者 uniq 之類)數(shù)據(jù),最后輸出(就像 tee )到其他地方。
當(dāng)然實(shí)際上,Logstash 是用不同的線程來(lái)實(shí)現(xiàn)這些的。如果你運(yùn)行 top 命令然后按下 H 鍵,你就可以看到下面這樣的輸出:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21401 root 16 0 1249m 303m 10m S 18.6 0.2 866:25.46 |worker
21467 root 15 0 1249m 303m 10m S 3.7 0.2 129:25.59 >elasticsearch.
21468 root 15 0 1249m 303m 10m S 3.7 0.2 128:53.39 >elasticsearch.
21400 root 15 0 1249m 303m 10m S 2.7 0.2 108:35.80 <file
21403 root 15 0 1249m 303m 10m S 1.3 0.2 49:31.89 >output
21470 root 15 0 1249m 303m 10m S 1.0 0.2 56:24.24 >elasticsearch.
小貼士:logstash 很溫馨的給每個(gè)線程都取了名字,輸入的叫xx,過(guò)濾的叫|xx
數(shù)據(jù)在線程之間以 事件 的形式流傳。不要叫行,因?yàn)?logstash 可以處理多行事件。
Logstash 會(huì)給事件添加一些額外信息。最重要的就是 @timestamp,用來(lái)標(biāo)記事件的發(fā)生時(shí)間。因?yàn)檫@個(gè)字段涉及到 Logstash 的內(nèi)部流轉(zhuǎn),所以必須是一個(gè) joda 對(duì)象,如果你嘗試自己給一個(gè)字符串字段重命名為 @timestamp 的話,Logstash 會(huì)直接報(bào)錯(cuò)。所以,請(qǐng)使用 filters/date 插件 來(lái)管理這個(gè)特殊字段。
此外,大多數(shù)時(shí)候,還可以見(jiàn)到另外幾個(gè):
host 標(biāo)記事件發(fā)生在哪里。
type 標(biāo)記事件的唯一類型。
tags 標(biāo)記事件的某方面屬性。這是一個(gè)數(shù)組,一個(gè)事件可以有多個(gè)標(biāo)簽。
你可以隨意給事件添加字段或者從事件里刪除字段。事實(shí)上事件就是一個(gè) Ruby 對(duì)象,或者更簡(jiǎn)單的理解為就是一個(gè)哈希也行。
小貼士:每個(gè) logstash 過(guò)濾插件,都會(huì)有四個(gè)方法叫 add_tag, remove_tag, add_field 和 remove_field。它們?cè)诓寮^(guò)濾匹配成功時(shí)生效。
標(biāo)準(zhǔn)的 service 方式
采用 RPM、DEB 發(fā)行包安裝的讀者,推薦采用這種方式。發(fā)行包內(nèi),都自帶有 sysV 或者 systemd 風(fēng)格的啟動(dòng)程序/配置,你只需要直接使用即可。
以 RPM 為例,/etc/init.d/logstash 腳本中,會(huì)加載 /etc/init.d/functions 庫(kù)文件,利用其中的 daemon 函數(shù),將 logstash 進(jìn)程作為后臺(tái)程序運(yùn)行。
所以,你只需把自己寫好的配置文件,統(tǒng)一放在 /etc/logstash/ 目錄下(注意目錄下所有配置文件都應(yīng)該是 .conf 結(jié)尾,且不能有其他文本文件存在。因?yàn)?logstash agent 啟動(dòng)的時(shí)候是讀取全文件夾的),然后運(yùn)行 service logstash start 命令即可。
Logstash 設(shè)計(jì)了自己的 DSL —— 有點(diǎn)像 Puppet 的 DSL,或許因?yàn)槎际怯?Ruby 語(yǔ)言寫的吧
--config 或 -f
意即文件。真實(shí)運(yùn)用中,我們會(huì)寫很長(zhǎng)的配置,甚至可能超過(guò) shell 所能支持的 1024 個(gè)字符長(zhǎng)度。所以我們必把配置固化到文件里,然后通過(guò) bin/logstash -f agent.conf 這樣的形式來(lái)運(yùn)行。
此外,logstash 還提供一個(gè)方便我們規(guī)劃和書寫配置的小功能。你可以直接用 bin/logstash -f /etc/logstash.d/ 來(lái)運(yùn)行。logstash 會(huì)自動(dòng)讀取 /etc/logstash.d/ 目錄下所有的文本文件,然后在自己內(nèi)存里拼接成一個(gè)完整的大配置文件,再去執(zhí)行。
--configtest 或 -t
意即測(cè)試。用來(lái)測(cè)試 Logstash 讀取到的配置文件語(yǔ)法是否能正常解析。Logstash 配置語(yǔ)法是用 grammar.treetop 定義的。尤其是使用了上一條提到的讀取目錄方式的讀者,尤其要提前測(cè)試。
--log 或 -l
意即日志。Logstash 默認(rèn)輸出日志到標(biāo)準(zhǔn)錯(cuò)誤。生產(chǎn)環(huán)境下你可以通過(guò) bin/logstash -l logs/logstash.log 命令來(lái)統(tǒng)一存儲(chǔ)日志。
--filterworkers 或 -w
意即工作線程。Logstash 會(huì)運(yùn)行多個(gè)線程。你可以用 bin/logstash -w 5 這樣的方式強(qiáng)制 Logstash 為過(guò)濾插件運(yùn)行 5 個(gè)線程。
注意:Logstash目前還不支持輸入插件的多線程。而輸出插件的多線程需要在配置內(nèi)部設(shè)置,這個(gè)命令行參數(shù)只是用來(lái)設(shè)置過(guò)濾插件的!
提示:Logstash 目前不支持對(duì)過(guò)濾器線程的監(jiān)測(cè)管理。如果 filterworker 掛掉,Logstash 會(huì)處于一個(gè)無(wú) filter 的僵死狀態(tài)。這種情況在使用 filter/ruby 自己寫代碼時(shí)非常需要注意,很容易碰上 NoMethodError: undefined method '*' for nil:NilClass 錯(cuò)誤。需要妥善處理,提前判斷。
--pluginpath 或 -P
可以寫自己的插件,然后用 bin/logstash --pluginpath /path/to/own/plugins 加載它們。
--verbose
輸出一定的調(diào)試日志。
小貼士:如果你使用的 Logstash 版本低于 1.3.0,你只能用 bin/logstash -v 來(lái)代替。
--debug
輸出更多的調(diào)試日志。
小貼士:如果你使用的 Logstash 版本低于 1.3.0,你只能用 bin/logstash -vv 來(lái)代替。
文章:http://udn.yyuap.com/doc/logstash-best-practice-cn/get_start/hello_world.html
http://udn.yyuap.com/doc/logstash-best-practice-cn/get_start/full_config.html
http://udn.yyuap.com/doc/logstash-best-practice-cn/get_start/full_config.html
---------------------------------------------------
---------------------------------------------------
讀取文件(File)
start_position 僅在該文件從未被監(jiān)聽(tīng)過(guò)的時(shí)候起作用。如果 sincedb 文件中已經(jīng)有這個(gè)文件的 inode 記錄了,那么 logstash 依然會(huì)從記錄過(guò)的 pos 開(kāi)始讀取數(shù)據(jù)。所以重復(fù)測(cè)試的時(shí)候每回需要?jiǎng)h除 sincedb 文件。
因?yàn)?windows 平臺(tái)上沒(méi)有 inode 的概念,Logstash 某些版本在 windows 平臺(tái)上監(jiān)聽(tīng)文件不是很靠譜。windows 平臺(tái)上,推薦考慮使用 nxlog 作為收集端,參閱本書稍后章節(jié)。
文章:http://udn.yyuap.com/doc/logstash-best-practice-cn/input/file.html
---------------------------------------------------
編碼插件(Codec)
Codec 是 logstash 從 1.3.0 版開(kāi)始新引入的概念(Codec 來(lái)自 Coder/decoder 兩個(gè)單詞的首字母縮寫)。
在此之前,logstash 只支持純文本形式輸入,然后以過(guò)濾器處理它。但現(xiàn)在,我們可以在輸入 期處理不同類型的數(shù)據(jù),這全是因?yàn)橛辛?codec 設(shè)置。
所以,這里需要糾正之前的一個(gè)概念。Logstash 不只是一個(gè)input | filter | output 的數(shù)據(jù)流,而是一個(gè) input | decode | filter | encode | output 的數(shù)據(jù)流!codec 就是用來(lái) decode、encode 事件的。
codec 的引入,使得 logstash 可以更好更方便的與其他有自定義數(shù)據(jù)格式的運(yùn)維產(chǎn)品共存,比如 graphite、fluent、netflow、collectd,以及使用 msgpack、json、edn 等通用數(shù)據(jù)格式的其他產(chǎn)品等。
事實(shí)上,我們?cè)诘谝粋€(gè) "hello world" 用例中就已經(jīng)用過(guò) codec 了 —— rubydebug 就是一種 codec!雖然它一般只會(huì)用在 stdout 插件中,作為配置測(cè)試或者調(diào)試的工具。
文章:http://udn.yyuap.com/doc/logstash-best-practice-cn/codec/index.html
---------------------------------------------------
時(shí)間處理(Date)
時(shí)區(qū)問(wèn)題的解釋
很多中國(guó)用戶經(jīng)常提一個(gè)問(wèn)題:為什么 @timestamp 比我們?cè)缌?8 個(gè)小時(shí)?怎么修改成北京時(shí)間?
其實(shí),Elasticsearch 內(nèi)部,對(duì)時(shí)間類型字段,是統(tǒng)一采用 UTC 時(shí)間,存成 long 長(zhǎng)整形數(shù)據(jù)的!對(duì)日志統(tǒng)一采用 UTC 時(shí)間存儲(chǔ),是國(guó)際安全/運(yùn)維界的一個(gè)通識(shí)——?dú)W美公司的服務(wù)器普遍廣泛分布在多個(gè)時(shí)區(qū)里——不像中國(guó),地域橫跨五個(gè)時(shí)區(qū)卻只用北京時(shí)間。
對(duì)于頁(yè)面查看,ELK 的解決方案是在 Kibana 上,讀取瀏覽器的當(dāng)前時(shí)區(qū),然后在頁(yè)面上轉(zhuǎn)換時(shí)間內(nèi)容的顯示。
所以,建議大家接受這種設(shè)定。否則,即便你用 .getLocalTime 修改,也還要面臨在 Kibana 上反過(guò)去修改,以及 Elasticsearch 原有的 ["now-1h" TO "now"] 這種方便的搜索語(yǔ)句無(wú)法正常使用的尷尬。
以上,請(qǐng)讀者自行斟酌。
文章:http://udn.yyuap.com/doc/logstash-best-practice-cn/filter/date.html
---------------------------------------------------
Rsyslog
Rsyslog 是 RHEL6 開(kāi)始的默認(rèn)系統(tǒng) syslog 應(yīng)用軟件(當(dāng)然,RHEL 自帶的版本較低,實(shí)際官方穩(wěn)定版本已經(jīng)到 v8 了)。官網(wǎng)地址:http://www.rsyslog.com
目前 Rsyslog 本身也支持多種輸入輸出方式,內(nèi)部邏輯判斷和模板處理。
文章:http://udn.yyuap.com/doc/logstash-best-practice-cn/ecosystem/rsyslog.html
---------------------------------------------------
elk stack權(quán)威指南 讀書筆記
饒堔琳編著
syslog方式發(fā)送 P62
nginx從1.7開(kāi)始,加入了syslog支持,淘寶的tengine則更早,這樣,我們可以通過(guò)syslog直接發(fā)送日志
nginx的配置如下
acces_log syslog:server=unix:/data0/rsyslog/nginx.sock locallog;
或者直接發(fā)送給logstash機(jī)器
acces_log syslog:server=192.168.0.2:514,facility=local6,tag=nginx-acces,severity=info logstashlog;
UDP協(xié)議的514端口 rsyslog
默認(rèn)情況下,nginx使用local7.info等級(jí),以nginx為標(biāo)簽發(fā)送數(shù)據(jù),注意使用syslog發(fā)送日志時(shí),無(wú)法配置buffer=16K選項(xiàng)
nginx錯(cuò)誤日志沒(méi)有統(tǒng)一明確的分隔符也沒(méi)有特別方便的正則模式 P62
Linux上的系統(tǒng)日志,即syslog的處理,對(duì)于windows平臺(tái),也有類似syslog的設(shè)計(jì),叫eventlog P67
Nxlog配置注意 P67
1、ROOT位置必須是nxlog的實(shí)際安裝路徑
2、輸入模塊,在win2003及之前版本,不叫im_msvistalog而叫im_mseventlog
接收端設(shè)置 P68 如果使用nxlog,架構(gòu)是 nxlog-》logstash agent-》redis-》logstash indexer——》elasticsearch-》kIbana
采集端是logstash,不需要特別設(shè)置,因?yàn)橹饕侄味家呀?jīng)生成,如果采集端是nxlog,那么我們需要把一些nxlog生成的字段轉(zhuǎn)換為logstash風(fēng)格
因?yàn)閑lasticsearch中默認(rèn)按小寫來(lái)檢索,所以需要盡量把數(shù)據(jù)小寫化,但是nxlog中,不單數(shù)據(jù)內(nèi)容,字段名稱也是大小寫混用的
除非重新生成映射,設(shè)置字段的屬性為 not_analyzed,寶哥的ELK視頻
pv命令,pv命令的作用就是做實(shí)時(shí)的標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出監(jiān)控 P78
我們這里就用他來(lái)監(jiān)控標(biāo)準(zhǔn)輸出
./bin/logstash -f generator_dots.conf |pv -abt >/dev/null
如果你在centos上通過(guò)yum安裝的pv命令,版本太低,可能還不支持-a參數(shù),單純靠-bt參數(shù)看起來(lái)還是有點(diǎn)累
通過(guò)JVM平臺(tái)上通用的JMX接口可以監(jiān)控JVM的heap,threadcount等細(xì)節(jié)信息 P80
logstash是一個(gè)運(yùn)行在JVM上的軟件,也就意味著JMX這種對(duì)JVM的通用監(jiān)控方式對(duì)logstash也是一樣有效果的
有JMX以后,可以通過(guò)Jconsole界面查看,也可以通過(guò)zabbix等監(jiān)控系統(tǒng)長(zhǎng)期監(jiān)控。
JMX啟動(dòng)參數(shù)方式 P82
zabbix里面提供了專門針對(duì)JMX的監(jiān)控項(xiàng)
詳細(xì)配置內(nèi)容
https://www.zabbix.com/documentation/2.4/manual/config/items/itemtypes/jmx_monitoring
zabbix-server本身并不直接對(duì)JMX發(fā)起請(qǐng)求,而是單獨(dú)有一個(gè)JavaGateway作為中間代理層角色。zabbix-server的java poller連接
zabbix-java-gateway,由zabbix-java-gateway去獲取遠(yuǎn)程JMX信息,所以,在zabbix-web配置之前,需要先配置zabbix-server相關(guān)進(jìn)程和設(shè)置
yum install -y zabbix-java-gateway
cat >> /etc/zabbix/zabbix-server.conf <<EOF
JavaGateway=127.0.0.1
JavaGatewayPort=10052
StartJavaPollers=5
EOF
/etc/init.d/zabbix-java-gateway restart
/etc/init.d/zabbix-server restart
然后在zabbix-web上給運(yùn)行l(wèi)ogstash的主機(jī)的host界面添加JMX接口,port為定義的9001端口
最后添加item,type下拉框選擇JMX agent,key文本框輸入xxx
JMX有很多的監(jiān)控項(xiàng),可以通過(guò)Jconsole來(lái)查看
nxlog P99
在windows服務(wù)器上作為logstash的替代品運(yùn)行
nxlog的windows安裝文件下載地址
http://nxlog.co/products/nxlog-community-edition/download
nxlog默認(rèn)配置文件位置在:C:\Program Files (x86)\nxlog
配置文件中有3個(gè)關(guān)鍵設(shè)置,分別是:input(日志輸入端)、output(日志輸出端)、route(綁定某輸入到具體某輸出)
logstash服務(wù)器IP:192.168.1.100
logstash配置文件
input {
tcp {
port => 514}
}
output {
elasticsearch {
host =>"127.0.0.1"
port =>"9200"
protocol =>"http"
}
}
nxlog配置文件
<Input testfile>
Module im_file
File "C:\\test\\\*.log"
SavePos TRUE
</Input>
<Output out>
Module om_tcp
Host "192.168.1.100"
Port 514
</Output>
<Route 1>
Path testfile => out
</Route>
配置文件修改完后重啟nxlog服務(wù)即可
logstash被elastic.co收購(gòu)以后,就是把logstash的核心部分代碼,盡量JVM通用化 P108
logstash運(yùn)行在JVM上,包括了ruby代碼和java代碼
Linux系統(tǒng)有些重要日志不是以可讀文本形式存在文件中,而是以二進(jìn)制形式存放,比如utmp,wtmp,lastlog等 P119
elasticsearch是一個(gè)P2P類型(使用gossip協(xié)議)的分布式系統(tǒng),所有請(qǐng)求都可以發(fā)送到集群內(nèi)任意一臺(tái)節(jié)點(diǎn)上 P140
組播方式 multicast
組播地址:224.2.2.4,端口54328
默認(rèn)情況下,路由器和交換機(jī)都不開(kāi)啟組播信息傳輸
單播方式unicast
配置里提供幾個(gè)節(jié)點(diǎn)的地址,以完成集群的發(fā)現(xiàn)
1、keepalived 默認(rèn)需要使用D類多播地址224.0.0.18 進(jìn)行心跳通信
2、keepalived 使用vrrp協(xié)議進(jìn)行通信(協(xié)議號(hào)碼為112)
-A INPUT -i eth1 -d 224.0.0.0/8 -j ACCEPT #224.0.0.0廣播地址
搜索請(qǐng)求 P143
全文搜索
elasticsearch的搜索請(qǐng)求有簡(jiǎn)易語(yǔ)法和完整語(yǔ)法兩種方式,簡(jiǎn)易語(yǔ)法是kIbana上最常用方式,一定要學(xué)會(huì)。
querystring語(yǔ)法
elasticsearch中的正則性能很差,而且支持的功能也不強(qiáng)大
腳本 P148
elasticsearch每分鐘會(huì)掃描一次/etc/elasticsearch/scripts/目錄,并嘗試加載目錄下的所有文件并加載
不要在該目錄下添加任何腳本文件,以免出錯(cuò)
搜索引擎會(huì)使用倒排索引inverted index來(lái)映射單詞到文檔的ID號(hào) P162
時(shí)間格式 P185
timestamp時(shí)間格式
nginx里叫$time_iso8601
rsyslog中叫date-rfc3339
elasticsearch中叫dateOptionalTime
線程池信息 P197
elasticsearch內(nèi)部是保持著幾個(gè)線程池的,不同的工作由不同的線程池負(fù)責(zé)
后續(xù)請(qǐng)求會(huì)暫時(shí)放到隊(duì)列里,每個(gè)線程池的隊(duì)列也有大小限制的,默認(rèn)是100
zabbix創(chuàng)建鍵值映射 P212
name:ES Cluster State
mappings
value mapped to
0 Green
1 Yellow
2 Red
創(chuàng)建數(shù)值映射,在模板中國(guó),設(shè)置了集群狀態(tài)的觸發(fā)報(bào)警,沒(méi)有映射的話,報(bào)警短信只有0,1,2數(shù)字不是很容易看懂
創(chuàng)建數(shù)值映射
創(chuàng)建宏
packetbeat抓包分析 P220
packetbeat利用libpcap庫(kù)抓取網(wǎng)絡(luò)流量并識(shí)別其中的特定網(wǎng)絡(luò)協(xié)議,自動(dòng)按照協(xié)議規(guī)范,將網(wǎng)絡(luò)流量劃分為事件字段插入到es中
pcap包,安裝libpcap包
pfring包,安裝pfring包
yum install -y libpcap
寶哥的ELK視頻 筆記
elasticsearch的API都是下劃線開(kāi)頭
_update
_delete
_get
_mget
_bulk
_mapping
_all
如果文檔里面沒(méi)有定義_id,es會(huì)自動(dòng)創(chuàng)建uuid
elasticsearch的內(nèi)置關(guān)鍵字
_source, _version,_id
字段類型 《=》 elasticsearch 類型 映射
string ,varchar,text =》 string
integer =》integer
long =》long
float =》float
double =》double
boolean =》boolean
date ,datetime =》date
byte,binary =》binary
查詢結(jié)果的分值最大是1
更新文檔請(qǐng)求必須發(fā)給master節(jié)點(diǎn),檢索文檔請(qǐng)求可以發(fā)給任何節(jié)點(diǎn)
單個(gè)ES節(jié)點(diǎn)最好32G內(nèi)存,超過(guò)32G內(nèi)存反而性能會(huì)下降
bigdesk和head插件的3個(gè)主要功能
1.看狀態(tài)
2.管理方面操作,查詢
3.郵件告警
elasticsearch的3種集群狀態(tài)
green:各個(gè)分片正常
yellow:主分片正常,副本分片缺失,但是不影響使用
red:主分片缺失
logstash
File 文件輸入
input {
file {
codec =>... #可選項(xiàng), codec,默認(rèn)是plain,可通過(guò)這個(gè)參數(shù)設(shè)置編碼方式
discover_interval =>... #可選項(xiàng),number,logstash 每隔多久去檢查一次被監(jiān)聽(tīng)的 path 下是否有新文件。默認(rèn)值是 15 秒。
exclude =>... #可選項(xiàng),array,不想被監(jiān)聽(tīng)的文件可以排除出去,這里跟 path 一樣支持 glob 展開(kāi)。
sincedb_path =>... #可選項(xiàng),string,如果你不想用默認(rèn)的 $HOME/.sincedb(Windows 平臺(tái)上在C:\Windows\System32\config\systemprofile\.sincedb),可以通過(guò)這個(gè)配置定義 sincedb 文件到其他位置。
sincedb_write_interval =>... #可選項(xiàng), number,logstash 每隔多久寫一次 sincedb 文件,默認(rèn)是 15 秒。
stat_interval =>... #可選項(xiàng), number, logstash 每隔多久檢查一次被監(jiān)聽(tīng)文件狀態(tài)(是否有更新),默認(rèn)是 1 秒。
start_position =>... #可選項(xiàng), string , logstash 從什么位置開(kāi)始讀取文件數(shù)據(jù),默認(rèn)是結(jié)束位置,也就是說(shuō) logstash 進(jìn)程會(huì)以類似 tail -F 的形式運(yùn)行。如果你是要導(dǎo)入原有數(shù)據(jù),把這個(gè)設(shè)定改成 “beginning”,logstash 進(jìn)程就從頭開(kāi)始讀取,有點(diǎn)類似cat,但是讀到最后一行不會(huì)終止,而是繼續(xù)變成 tail –F;默認(rèn)值end
path =>... # 必選項(xiàng), array ,定需處理的文件路徑, 可以定義多個(gè)路徑
tags =>... # 可選項(xiàng), array,在數(shù)據(jù)處理過(guò)程中,由具體的插件來(lái)添加或者刪除的標(biāo)記
type =>... # 可選項(xiàng), string,自定義將要處理事件類型,可以自己隨便定義,比如處理的是linux的系統(tǒng)日志,可以定義為"syslog"
}
}
例子, 可定義多個(gè)file
input {
file {
path => ["/opt/elasticsearch1.7.1/logs/elasticsearch.log"]
type => “eslog"
start_position => "beginning"
}
file {
path=>"/var/log/apache2/access.log"
type=>"apache-access"
start_position => "end"
}
}
rubydebug 就是鍵值對(duì)的編碼格式,輸入到redis非常好,一般用來(lái)調(diào)試寫在output區(qū)域查看調(diào)試結(jié)果,看grok匹配規(guī)則是否正確解釋日志
output {
stdout {codec => rubydebug }
redis {
host => '10.11.30.40'
data_type => 'list'
key => 'logstash:redis'
}
}
kIbana會(huì)自動(dòng)在ES里面創(chuàng)建一個(gè).kIbana索引保存kIbana界面上的一些設(shè)置
_source和_all的作用
_source的作用在store,_all的作用在index
Lucene中,每個(gè)field是需要設(shè)置store才能獲取原文的;
ES中,單獨(dú)使用_source存原文,各field默認(rèn)"store":false
_all是為了響應(yīng)不指明field的全文檢索請(qǐng)求。
在script中,可以使用_source.field和doc['field']來(lái)獲取內(nèi)容,分別從_source store和inverted index里拿數(shù)據(jù)。
elasticsearch有兩種數(shù)據(jù)結(jié)構(gòu)
1、倒排索引
2、 field data (用于做字段聚合,group by)
disk-based field data(doc_values
將uninverted index的數(shù)組變成類似cassandra的列存儲(chǔ)
views=[1,1000,5000,...]
變成
1
1000
5000
...
讀取過(guò)程利用操作系統(tǒng)的VFS cache
即時(shí)監(jiān)控工具插件
Kopf
Bigdesk(不支持2.x)
Marvel
site plugin
通過(guò)es的接口去獲取靜態(tài)web網(wǎng)站文件,利用es的接口打開(kāi)靜態(tài)網(wǎng)站,省得你自己去架設(shè)網(wǎng)站
這種插件統(tǒng)一叫site plugin,站點(diǎn)插件,依附于es
插件目錄下會(huì)有一個(gè)_site目錄,里面放網(wǎng)站文件
pwd
/usr/local/elasticsearch/plugins/kopf/_site
rsyslog跟logstash的原理一樣,都是用sincedb來(lái)記錄上次讀取到文件的哪個(gè)位置
很多內(nèi)核組件都需要調(diào)用rsyslog來(lái)記錄日志,所以需要保證rsyslog進(jìn)程不掛
ll /dev/log
srw-rw-rw- 1 root root 0 Nov 16 15:12 /dev/log
logstatsh2.2工作流程圖
timestamp用的UTC時(shí)間
logstatsh里的每一個(gè)插件
file插件
input插件
codec插件
event插件
都對(duì)應(yīng)著一個(gè)xxx.rb源代碼文件,文件里有實(shí)現(xiàn)的源代碼
------------------------------------------------------------------------------------
.kibana索引結(jié)構(gòu)
1、Index patterns
2、saveObjects
{
saveSearch
saveVisualize
saveDashboard}
index pattern
曾經(jīng)需要指定time-based,現(xiàn)在直接根據(jù)fieldstats接口自動(dòng)確定是否有date類型字段
fields數(shù)組,記錄每個(gè)field的 type, name, indexed, analyzed, doc_values, count, scripted
scripted field是動(dòng)態(tài)提交的腳本內(nèi)容。在indexpattern里還會(huì)多記錄:script、lang、type。默認(rèn),type固定是number,lang是。
需要使用groovy的,可以手動(dòng)修改ES索引數(shù)據(jù)。
search
每個(gè)_id是一個(gè)已保存搜索,記錄title、column、sort、kibanaSavedObjectMeta。
kibanaSavedObjectMeta是一串searchSourceJSON。即搜索語(yǔ)句處理轉(zhuǎn)換成的query JSON。
搜索框可以寫querystring,也可以直接寫JSON。
visualization
每個(gè)_id是一個(gè)已保存visualize,記錄title、savedSearchId、kibanaSavedObjectMeta、visState。
visState里是一串a(chǎn)ggregation的JSON。
savedSearchId是和本visualize關(guān)聯(lián)的savedSearch的_id。
在savedSearchId空缺時(shí),可以直接在visualize上定義搜索語(yǔ)句,依然叫kibanaSavedObjectMeta。內(nèi)容還是一串searchSourceJSON。
dashboard
每個(gè)_id是一個(gè)已保存儀表盤,記錄title、panelsJSON、kibanaSavedObjectMeta。
panelsJSON是一個(gè)數(shù)組,每個(gè)元素代表一個(gè)panel的定義。包括:
type: 具體加載的 app 類型,就默認(rèn)來(lái)說(shuō),肯定就是 search 或者 visualization 之一。
id: 具體加載的 app 的保存 id。也就是上面說(shuō)過(guò)的,它們?cè)诟髯灶愋拖碌?_id 內(nèi)容。
size_x: panel 的 X 軸長(zhǎng)度。Kibana 4 采用 gridster 庫(kù)做掛件的動(dòng)態(tài)劃分,默認(rèn)為 3。
size_y: panel 的 Y 軸長(zhǎng)度。默認(rèn)為 2。
col: panel 的左邊側(cè)起始位置。Kibana 4 指定 col 最大為 12。每行第一個(gè) panel 的 col 就是 1,假如它的 size_x 是 4,那么第二個(gè) panel 的 col 就是 5。
row: panel 位于第幾行。gridster 默認(rèn)的 row 最大為 15。
--------------------------------------------------------------------------------------
經(jīng)典時(shí)間序列數(shù)據(jù)庫(kù)實(shí)現(xiàn):rrdtool,很多老監(jiān)控系統(tǒng)都基于rrdtool實(shí)現(xiàn),elasticsearch也可以做時(shí)間序列數(shù)據(jù)庫(kù)
Round Robin Database tool
1個(gè)rrd有多個(gè)rra;
rra存儲(chǔ)CDP值,以及計(jì)算這個(gè)個(gè)CDP需要幾個(gè)PDP和具體CF的信息;
每個(gè)step,傳入的值叫PDP。
CF:average,min,max,last
不同DST下,收到的值跟寫入的PDP不一致:
Values = 300, 600, 900, 1200
Step = 300 seconds
COUNTER = 1,1, 1,1
DERIVE = 1,1,1,1
ABSOLUTE = 1,2,3,4
GAUGE = 300,600,900,1200
graphite:python實(shí)現(xiàn),提供HTTP接口,解決rrdtool必須固定間隔寫入一次數(shù)據(jù)的問(wèn)題;擴(kuò)展方式太復(fù)雜。
influxdb:golang實(shí)現(xiàn),部署簡(jiǎn)單,提供類SQL語(yǔ)法;集群方式不穩(wěn)定。
opentsdb: open time serial database ,基于hbase,數(shù)據(jù)不歸并全部保存;大范圍讀取性能極差。
監(jiān)控
logstatsh output zabbix,nagios等等 logstatsh有各種各樣的output插件 輸出到zabbix ,nagios來(lái)做監(jiān)控
在logstatsh里寫dsl,if message =xx 各種正則匹配有error的message
監(jiān)控nginx
logstatsh采集ngx_http_stub_status_module的nginx模塊
./configure --prefix=/usr/local/nginx --with-http_gzip_static_module \
--with-http_stub_status_module --with-pcre
ngx_http_stub_status_module
業(yè)務(wù)監(jiān)控系統(tǒng)的維度
1、終端用戶體驗(yàn)監(jiān)控——抓取端到端延遲、運(yùn)行的正確率和呈現(xiàn)給終端用戶的質(zhì)量數(shù)據(jù)。在應(yīng)用可用性方面,APM通過(guò)建立模擬終端用戶行為的transaction來(lái)實(shí)現(xiàn),
這是終端用戶體驗(yàn)監(jiān)控的第二個(gè)重點(diǎn)
2、應(yīng)用拓?fù)浒l(fā)現(xiàn)和可視化——應(yīng)用在執(zhí)行過(guò)程中所涉及的軟、硬件基礎(chǔ)組件,數(shù)據(jù)在這些組件和應(yīng)用間流動(dòng)。這些節(jié)點(diǎn)和方向線,APM需要用拓?fù)鋱D展示給用戶。
3、用戶定義的事務(wù)分析——用戶在應(yīng)用中的一系列行為,可以通過(guò)用戶定義的事務(wù)來(lái)整合分析。用戶向應(yīng)用發(fā)起一個(gè)請(qǐng)求,就產(chǎn)生了一個(gè)事務(wù)。
4、應(yīng)用組件的深度探究——用戶在應(yīng)用中的行為,會(huì)產(chǎn)生針對(duì)應(yīng)用拓?fù)渲猩婕暗能浻布M件的資源消耗。APM要針對(duì)這些包括服務(wù)器端組件在內(nèi)的資源消耗進(jìn)行細(xì)粒度的監(jiān)控
5、ITOA——對(duì)下述技術(shù)的組合使用:復(fù)雜操作行為的處理;數(shù)據(jù)模式的發(fā)現(xiàn)和識(shí)別;非結(jié)構(gòu)化文本的索引、搜索和推斷;拓?fù)浞治?;多維度數(shù)據(jù)庫(kù)的搜索和分析,用elk等技術(shù)收集日志
一個(gè)index下面就一個(gè)type,即使一個(gè)index下面有多個(gè)type其實(shí)也是所有type合并在一起的一張寬表
而實(shí)際物理存儲(chǔ)的時(shí)候,index下面就是直接的分片直接的數(shù)據(jù),而不是type,type的概念是ES剛出來(lái)的時(shí)候?yàn)榱烁P(guān)系型數(shù)據(jù)庫(kù)做對(duì)比而出來(lái)的概念
從ES2.0開(kāi)始已經(jīng)淡化了
ES默認(rèn)是5個(gè)分片一個(gè)副本,副本的原理是:一個(gè)document過(guò)來(lái),這個(gè)document會(huì)發(fā)到主分片和副本分片,然后主分片和副本分片可以理解為兩個(gè)
獨(dú)立的ES進(jìn)程,處理發(fā)過(guò)來(lái)的document,當(dāng)主分片掛掉了translog 會(huì)丟失5秒的數(shù)據(jù) ,因?yàn)閠ranslog每隔5秒刷寫到磁盤,ES掛掉重啟之后需要從磁盤里的
translog文件里讀取出日志,如果掛掉的時(shí)刻剛好在這5秒的間隔,那么主分片就會(huì)丟失5秒的數(shù)據(jù),但是因?yàn)橛懈北痉制?,所以不用?br>
副本分片的缺點(diǎn),因?yàn)槭仟?dú)立的es進(jìn)程,所以最好副本分片單獨(dú)一臺(tái)機(jī)器,這樣就需要每個(gè)分片獨(dú)立增加一臺(tái)機(jī)器,默認(rèn)5個(gè)分片就要增加5臺(tái)機(jī)器
副本分片是一個(gè)document同時(shí)發(fā)到主分片和副本分片,而不是直接的塊復(fù)制,把segment直接復(fù)制到副本分片,這樣做的好處是,在segment合并的時(shí)候不需要再
把整個(gè)segment發(fā)送到副本分片,節(jié)省帶寬和資源
f