一、elk介紹
1.ElasticSearch:
節點(Node):節點是一個ES的實例,一般一臺主機上部署一個節點-
集羣(Cluster):集羣由若干節點組成,和任意節點的通信等價於和集羣的 通信
分片(Shard):一個索引會分成多個分片存儲,分片數量在索引建立後不可更改
副本(Replica):副本是分片的一個拷貝,目的在於提高系統的容錯性和搜索的效率
索引(Index):類似數據庫的庫
類型(Type):類似數據庫的表
文檔(Document):類似數據庫的行,包含一個或多個Field
字段(Field):搜索的最小單元,可通過Mapping定義不同的屬性(比如可否被搜索)
2.Logstash:
設計及架構
LogStash由JRuby語言編寫,基於消息(message-based)的簡單架構,並運行在Java虛擬機(JVM)上。不同於分離的代理端(agent)或主機端(server),LogStash可配置單一的代理端(agent)與其它開源軟件結合,以實現不同的功能。
在LogStash的生態系統中,主要分爲四大組件:
- Shipper:發送事件(events)至LogStash;通常,遠程代理端(agent)只需要運行這個組件即可;
- Broker and Indexer:接收並索引化事件;
- Search and Storage:允許對事件進行搜索和存儲;
- Web Interface:基於Web的展示界面
LogStash的優勢:
- 對日誌數據更好的語法分析功能
- 更加靈活的日誌存儲方式
- 附帶搜索和目錄功能
- 易於安裝、可擴展、性能良好等
- 正是由於以上組件在LogStash架構中可獨立部署,才提供了更好的集羣擴展性。
在大多數情況下,LogStash主機可分爲兩大類:
代理主機(agent host):作爲事件的傳遞者(shipper),將各種日誌數據發送至中心主機;只需運行Logstash 代理(agent)程序;
中心主機(central host):可運行包括中間轉發器(Broker)、索引器(Indexer)、搜索和存儲器(Search and Storage)、Web界面端(Web Interface)在內的各個組件,以實現對日誌數據的接收、處理和存儲。
3.Kibana:
- Kibana是一個基於瀏覽器頁面的Elasticsearch前端展示工具。
二、安裝elk
- 本文將安裝Elasticsearch-1.7.2, Logstash-1.5.5, Kibana-4.1.1。 請注意版本要求,有些組件需要相對應的版本。
elk可以分佈式部署在不同的機器上,收集展示端在一臺機器上部署,客戶端只部署logstash,目錄統一在/data/Elk
1.安裝java和redis
- Elasticsearch和Logstash需要Java8,此過程省略。
- 安裝3.X,過程省略,在收集端安裝完啓動即可,端口爲默認
2.安裝Elasticsearch
把tar包解壓到/data/Elk
修改配置文件
cd /data/Elk/elasticsearch/
vim config/elasticsearch.yml
path.data: /data/Elk/logdata #指定elasticsearch收集日誌數據存放目錄
network.host: 1.1.1.11 #指定主機,默認指本機
3.安裝Elasticsearch
安裝Elasticsearch插件
elasticsearch 作爲一個系統service應用 ,可以安裝elasticsearch-servicewrapper插件。
在https://github.com/elasticsearch/elasticsearch-servicewrapper下載該插件後,解壓縮。將service目錄拷貝到elasticsearch目錄的bin目錄下。運行這個插件的好處是:elasticsearch需要的jvm參數和其它配置都已經配置好了,非常方便。
chmod +x bin/*
集羣管理:./bin/plugin -install mobz/elasticsearch-head http://1.1.1.11:9200/_plugin/head/
集羣性能監控:./bin/plugin -install lukas-vlcek/bigdesk/2.5.0 http://1.1.1.11:9200/_plugin/bigdesk/
#管理和監控:./bin/plugin -i elasticsearch/marvel/latest http://1.1.1.11:9200/_plugin/marvel/
#./bin/plugin -r elasticsearch/marvel/latest 卸載插件
#集羣管理: ./bin/plugin -install lmenezes/elasticsearch-kopf http://1.1.1.11:9200/_plugin/kopf/
- 注:對於插件的安裝和更新,默認走的Gem源爲 https://rubygems.org,對於咱們國內網絡來說是出奇的慢或是根本無法訪問(爬梯子除外),在安裝或是更新插件是,可以嘗試修改目錄下 Gemfile 文件中的 source爲淘寶源https://ruby.taobao.org,這樣會使你的安裝或是更新順暢很多。
4.安裝kibana
把tar包解壓到/data/Elk
修改配置文件
cd /data/Elk/kibana/
vim config/kibana.yml
port: 5601 #指定端口,默認是5601
host: "1.1.1.11" #指定主機
elasticsearch_url: "http://1.1.1.11:9200" #指定elasticsearch
- 配置文件中指明kibana偵聽5601端口並且通過9200端口從elasticsearch裏面獲取數據。
5.安裝Logstash
把tar包解壓到/data/Elk,服務端和客戶端都要安裝
服務端配置
- cat /data/Elk/logstash/conf/logstash_nginx_tomcat.conf
input {
redis {
host => "1.1.1.11"
port => 6379
type => "nginx_logs"
data_type => "list"
key => "db:nginx"
}
redis {
host => "1.1.1.11"
port => 6379
type => "tomcat_logs"
data_type => "list"
key => "db:tomcat"
}
}
filter {
if [type] == "nginx_logs" {
grok {
match => { "message" => "%{IPORHOST:clientip} \- %{NOTSPACE:remoteuser} \[%{HTTPDATE:timestamp}\] %{NUMBER:response} \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:bytes} \"%{NOTSPACE:referrer}\" \"%{GREEDYDATA:useragent}\" %{IPORHOST:proxyip} \"%{IPORHOST:apiip}(?::%{POSINT:apiport})?\" \"%{NUMBER:elapsedtime}\"" }
remove_field => [ "message"]
}
mutate {
split => { "elapsedtime" => "." }
}
mutate {
join => { "elapsedtime" => "" }
}
mutate {
convert => { "elapsedtime" => "float" }
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
useragent{
source => "useragent"
}
geoip {
source => "clientip"
}
}
if [type] == "tomcat_logs" {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{NOTSPACE:hostname} %{LOGLEVEL:loglevel} %{GREEDYDATA:content}" }
remove_field => [ "message"]
}
date {
match => [ "timestamp", "ISO8601","yyyy-M-dd HH:mm:ss"]
}
}
}
output {
if [type] == "nginx_logs" {
elasticsearch {
protocol => "http"
host => "1.1.1.11"
index => 'nginx_log_%{+YYYY_MM_dd}'
}
}
if [type] == "tomcat_logs" {
elasticsearch {
protocol => "http"
host => "1.1.1.11"
index => 'tomcat_log_%{+YYYY_MM_dd}'
}
}
}
客戶端配置
- cat /data/Elk/logstash/conf/logstash_nginx_tomcat.conf
input {
file {
path => ["/usr/local/nginx/logs/*.log"]
start_position => beginning
type => "nginx_logs"
}
file {
path => ["/data/tomcat/*/logs/catalina.out"]
start_position => beginning
type => "tomcat_logs"
}
}
output {
if [type] == "nginx_logs" {
redis {
host => "1.1.1.11"
port => 6379
data_type => "list"
key => "db:nginx"
}
}
if [type] == "tomcat_logs" {
redis {
host => "1.1.1.11"
port => 6379
data_type => "list"
key => "db:tomcat"
batch_events => 2
}
}
}
三、啓動ELK
1.給命令授權
chmod +x /data/Elk/elasticsearch/bin/*
chmod +x /data/Elk/kibana/bin/*
chmod +x /data/Elk/kibana/node/bin/*
chmod +x /data/Elk/logstash/bin/*
chmod +x /data/Elk/logstash/vendor/jruby/bin/*
2.elk啓動腳本
start-es.sh
#!/bin/bash
/data/Elk/elasticsearch/bin/elasticsearch &
sleep 2
shutdown-es.sh
#!/bin/bash
ps -ef| grep -e elasticsearch | grep -v grep | awk '{system("kill -9 " $2)}'
start-logstash.sh
#!/bin/bash
/data/Elk/logstash/bin/logstash -w 5 -f /data/Elk/logstash/conf/logstash_nginx-tomcat.conf -l /data/Elk/logstash/bin/stash_log.txt &
sleep 3
shutdown-logstash.sh
#!/bin/bash
ps -ef| grep -e logstash | grep -v grep | awk '{system("kill -9 " $2)}'
start-kibana.sh
#!/bin/bash
/data/Elk/kibana/bin/kibana &
shutdown-kibana.sh
#!/bin/bash
ps -ef| grep -e kibana | grep -v grep | awk '{system("kill -9 " $2)}'
start-all.sh
#!/bin/bash
/data/Elk/elasticsearch/bin/elasticsearch &
sleep 2
/data/Elk/logstash/bin/logstash -w 5 -f /data/Elk/logstash/conf/logstash_nginx-tomcat.conf -l /data/Elk/logstash/bin/stash_log.txt &
sleep 2
/data/Elk/kibana/bin/kibana &
shutdown-all.sh
#!/bin/bash
ps -ef| grep -e kibana | grep -v grep | awk '{system("kill -9 " $2)}'
ps -ef| grep -e logstash | grep -v grep | awk '{system("kill -9 " $2)}'
ps -ef| grep -e elasticsearch | grep -v grep | awk '{system("kill -9 " $2)}'
3.修改日誌格式
以分析nginx日誌爲例,將nginx的日誌格式改爲如下:
log_format main ‘
‘”
access_log /var/log/nginx/access.log main;
* 啓動nginx和tomcat並訪問項目
四、查看ELK
訪問http://1.1.1.11:9200/_plugin/head/ 查看日誌收集情況
訪問http://1.1.1.11:5601,查看kibana展示
建立索引,與上面logstash裏面配置的output命名一致
至此,整個搭建過程已完成,如需收集其他日誌,應按要求制定相應的匹配規則,設置字段。
五、elk優化(copy by network):
1.日誌類別與處理方法
Apache日誌:自定義apache輸出日誌格式,json輸出,無需filter參與
Tomcat日誌:需將多行日誌合併至一個事件中,並排除空白行
2.注意事項
Redis:部署多臺,僅提供高可用作用,無分擔負載作用,可使用ZeroMQ代替
ElasticSearch:
檢測節點狀態:
curl -XGET ‘http://127.0.0.1:9200/_cluster/health?pretty=true’
green status:所有shard被分配,且運行正常
yellow status:只有主shard被分配,如集羣正在節點間複製數據時
red status:存在未被分配的shard集羣監控:
Paramedic工具:
安裝:/usr/share/elasticsearch/bin/plugin -install karmi/elasticsearch-paramedic
查看:http://log.linuxidc.net:9200/_plugin/paramedic/index.html
Bigdesk工具:
安裝:/usr/share/elasticsearch/bin/plugin -install lukas-vlcek/bigdesk
查看:http://log.linuxidc.net:9200/_plugin/bigdesk/index.html數據保留策略:
1.LogStash默認爲每一天創建1個index,可手動 刪除index
curl -XDELETE http://127.0.0.1:9200/logstash-2013.12.19
shell優化腳本:https://github.com/cnf/logstash-tools/blob/master/elasticsearch/clean-elasticsearch.sh
2.優化index:
curl -XPOST 'http://127.0.0.1:9200/logstash-2013.12.19/_optimize'
curl -XPOST 'http://127.0.0.1:9200/_optimize' # 優化所有index
curl 'http://127.0.0.1:9200/logstash-2013.12.19/_stats?clear=true&store=true&pretty=true'
- 查看index的大小,index過多會影響優化耗時,定期可刪除數據
3.其他腳本
- clean_es.sh
01
#!/bin/bash
daysback=3
if [ ! -z $1 ]; then
daysback=$1
fi
start=8
end=`expr $start \+ $daysback`
if [ $? == 0 ]; then
for i in `seq $start $end`; do
d=`date --date "$i days ago" +"%Y.%m.%d"`
curl -XDELETE http://localhost:9200/logstash-$d > /dev/null 2>&1
done
else
echo "Invalid number of days specified, aborting"
fi
curl -XPOST 'http://localhost:9200/_optimize'
02
#!/bin/bash
#date=$(date -d "today" '+%Y-%m-%d-%H%M')
date=$(date -d "today" '+%Y-%m-%d')
date7=$(date -d "7 days ago" '+%Y_%m_%d')
save_days=5
filelist=`ls /data/Elk/elasticsearch/data/elasticsearch/nodes/`
for file in $filelist
do
cd /data/Elk/elasticsearch/data/elasticsearch/nodes/$file/indices/
/data/Elk/shutdown_elastic.sh
sleep 10
ls /data/Elk/elasticsearch/data/elasticsearch/nodes/$file/indices/*"$date7"
rm -rf /data/Elk/elasticsearch/data/elasticsearch/nodes/$file/indices/*"$date7"
/data/Elk/start_elastic.sh
#find /home/Elk/elasticsearch/data/elasticsearch/nodes/$file/indices/ -exec ls -l {} \;
# find /home/Elk/elasticsearch/data/elasticsearch/nodes/$file/indices/ -mtime +${save_days} -exec ls {} \;
# find /opt/huiti/interface/$file/indices -name "*.log" -mtime +15 -exec rm -rf {} \;
# find /opt/huiti/interface/$file/indices -name "*.txt" -mtime +15 -exec rm -rf {} \;
done
- 全文完~