一、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 ‘
remoteaddr−
remote_user [
timelocal]
status ’
‘”
request"
body_bytes_sent “
httpreferer”′‘”
http_user_agent" proxy_add_x_forwarded_for “upstream_addr" "$request_time”’;
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
- 全文完~