1、简介
今天我们主要分享的是如何利用ELK集群系统收集日志并分析展示,ELKStack主要由elasticsearch、logstash、kibana这三个组件组成。传统收集日志的方式主要是rsyslog日志服务器集中收集管理,结合第三方软件LogAnalyzer展示输出。传统查看日志的方式无非就是常用的tail、grep、awk等,不管怎么说处理小规模还是能接受的,在规模较大的场景中,此方法效率低下。日志量太大、文本搜索太慢、如何归档、如何多维度查询,这些都是管理海量日志面临的问题。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集、管理、访问,但是集中的架构还是无法解决日志处理压力大的问题,此时ELKStack的分布式模型就可以解决这些问题。
Elasticsearch是一个基于Lucene实现的开源、分布式、Restful的全文本搜索引擎;此外,它还是一个分布式实时文档存储,其中每个文档的每个field均是被索引的数据,且可被搜索;也是一个带实时分析功能的分布式搜索引擎,能够扩展至数以百计的节点实时处理PB级的数据。
Logstash是一个用来搜集、分析、过滤日志的工具。支持多数据获取机制,通过TCP/UDP协议、文件、syslog、windows EventLogs及STDIN等;获取到数据后,它支持对数据执行过滤、修改等操作。
Kibana是一个开源的分析与可视化平台,基于Web的图形界面,用于搜索、分析和可视化存储在Elasticsearch指标中的日志数据。可以通过Kibana进行搜索利用Elasticsearch的REST接口来检索数据,不仅允许用户创建定制仪表板视图,还允许以特殊的方式查询和过滤数据。
2、ELK架构
ELK能够解决海量日志搜索问题,一个处理海量日志平台的架构自然耦合要灵活,以下架构适合较大集群的解决方案,需要配置为集群模式。为了分担负荷,这种架构的优点在于引入了消息队列机制,均衡了网络传输,降低了网络阻塞,避免了丢失数据的可能性。单体架构仅用于实验,因为logstash的核心代码是用ruby语言开发,虽然运行在jruby上,但是由于中间涉及到数据结构的转化,架构中Logstash依然存在占用系统资源过多的问题。
ELKStack单体架构
ELKStack容器时代的应用架构
ELKStack集群架构
Elastic Stack还可以结合hadoop生态使用
3、ELK部署
本次ELK实验中我们使用的是elasticsearch、logstash、kibana较为通用的架构模型。在此基础上又引入了一个轻量级的消息队列redis,共使用三台主机配置。实验中logstash服务端、redis只配置了单台,生产环境建议配置高可用。
- 节点名称IP node1:192.168.200.200 node1.elk.com node2:192.168.200.201 node2.elk.com node3:192.168.200.202 node3.elk.com
- 节点用途 node1: es节点、logstash服务端、kibana web-gui、redis、es第三方插件 node2: es节点、logstash Agent节点 node3: es节点、logstash Agent节点、nginx日志
3.1 elasticsearch集群配置
- 首先配置java环境本次使用的是openjdk1.7,官方已经建议使用1.8
# yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel
# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr
- ELK集群安装
wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.2.noarch.rpm
# yum localinstall elasticsearch-1.7.2.noarch.rpm
node1
# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: myes
node.name: "node1.elk.com"
#transport.tcp.port: 9300
#http.port: 9200
#node.master: true
#node.data: true
#index.number_of_shards: 1
#index.number_of_replicas: 0
【es配置非常简单,以上注释信息默认即可,也可以根据生产环境具体定义】
node2
# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: myes
node.name: "node2.elk.com"
node3
# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: myes
node.name: "node3.elk.com"
- 将3个节点es服务启动
# systemctl daemon-reload
# systemctl start elasticsearch.service
# systemctl status elasticsearch.service
- 测试集群通信是否正常 tcp测试结果
# tcpdump -i ens33 -nn tcp port 9300
http测试结果
curl测试结果
curl 获取集群节点信息
curl 获取节点自定义信息
node1安装es第三方插件【安装节点根据情况自定】
# /usr/share/elasticsearch/bin/plugin -i bigdesk -u file:///root/bigdesk-latest.zip
# /usr/share/elasticsearch/bin/plugin -i head -u file:///root/elasticsearch-head-latest.zip
# /usr/share/elasticsearch/bin/plugin -i marvel-latest.zip -u file:///root/marvel-latest.zip
# /usr/share/elasticsearch/bin/plugin -l
Installed plugins:
- bigdesk
- head
- marvel
http://192.168.200.200:9200/_plugin/marvel
http://192.168.200.200:9200/_plugin/bigdesk
http://192.168.200.200:9200/_plugin/head
3.2 redis配置
# yum install redis
# systemctl start redis
# systemctl status redis
3.3 nginx配置
# yum install nginx
# systemctl start nginx
# systemctl status nginx
3.4 logstash配置
wget https://download.elastic.co/logstash/logstash/packages/centos/logstash-1.5.4-1.noarch.rpm
# yum install logstash-1.5.4-1.noarch.rpm
node1
# vi /etc/profile.d/logstash.sh
export PATH=/opt/logstash/bin:$PATH
. /etc/profile.d/logstash.sh
node2
# vi /etc/profile.d/logstash.sh
export PATH=/opt/logstash/bin:$PATH
. /etc/profile.d/logstash.sh
node3
# vi /etc/profile.d/logstash.sh
export PATH=/opt/logstash/bin:$PATH
. /etc/profile.d/logstash.sh
- 自定义日志格式
# vi /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-0.3.0/patterns/grok-patterns
#nginx Logs
NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:clientip} - %{NOTSPACE:remote_user} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} %{NOTSPACE:http_x_forwarded_for}
node2、node3logstash Agent配置 配置收集nginx日志 ->redis输出 【Logstash Agent】
# vi /etc/logstash/conf.d/nglogredissample.conf
input {
file {
path => ["/var/log/nginx/access.log"]
type => "nginxlog"
start_position => "beginning"
}
}
filter {
grok {
match => { "message" => "%{NGINXACCESS}" }
}
}
output {
redis {
port => "6379"
host => ["192.168.200.200"]
data_type => "list"
key => "logstash-%{type}"
}
}
node1logstash Server配置 redis输入 ->配置处理nginx日志 ->es存储 【Logstash Server】
# vim /etc/logstash/conf.d/serversample.conf【输出屏幕测试一下】
input {
redis {
port => "6379"
host => "127.0.0.1"
data_type => "list"
key => "logstash-nginxlog"
}
}
output {
stdout {
codec => rubydebug
}
}
测试一下node1节点输出的信息
# logstash -f /etc/logstash/conf.d/serversample.conf
- 验证redis缓存的数据
测试从redis中获取数据没问题,output配置为elasticsearch
# vim /etc/logstash/conf.d/serversample.conf
input {
redis {
port => "6379"
host => "127.0.0.1"
data_type => "list"
key => "logstash-nginxlog"
}
}
output {
elasticsearch {
cluster => "myes"
index => "logstash-%{+YYYY.MM.dd}"
}
}
测试logstash配置文件语法
# logstash -f /etc/logstash/conf.d/sample.conf --configtest
启动logstash SysV服务脚本,生产环境使用daemon守护进程的方式启动
# service logstash start
# service logstash status
3.5 kibana配置
- 下载源码包
wget https://download.elastic.co/kibana/kibana/kibana-4.1.1-linux-x64.tar.gz
node1节点安装kibana web图形展示
# tar xf kibana-4.1.1-linux-x64.tar.gz -C /usr/local/
# cd /usr/local/
# ln -sv kibana-4.1.1-linux-x64 kibana
# vim /usr/local/kibana/config/kibana.yml
elasticsearch_url: "http://192.268.200.200:9200" 【不是集群名而是任意节点名】
- 启动kibana
# /usr/local/kibana/bin/kibana -l /var/log/kibana.log &
- 测试访问 http://192.168.200.200:5601
4、总结
ELK也算是如今最流行并且更新速度最快的开源大数据产品,这就是为什么好多企业开始应用ELKStack日志平台了。ELK为业务提供日志搜索功能,也可以为系统日志提供存储搜索。在本次实验也验证了logstash本身的重量级,其实近些年elasticsearch相关的轻量级采集程序衍生出好多,具体如下:
- filebeat: 主要用于采集文件形式日志。
- metricbeat: 主要用于监测操作系统运行性能指标。
- packetbeat: 主要用于采集网络流量数据。
- Heartbeat: 主要用于检测服务间的连通性监控,比如icmp, tcp, http。
- Winlogbeat: 专门针对windows的event log事件日志数据采集。
- Auditbeat:采集Linux审计框架数据,以及各类主流操作系统文件完整性监测。
X-Pack是一个Elastic Stack的扩展,将安全,警报,监视,报告和图形功能整合于一个软件包中。
通过对es的了解和其它分布式系统的学习,其实分布式系统就是系统的各组件分布于网络上多个计算机;各组件彼此之间仅仅通过消息传递来通信并协调行动。ELK的分布式还比较容易理解和掌握的,ELK是一个开源的实时日志分析平台,其特点是分布式、可扩展,高可用、RESTful风格的搜索和数据分析引擎。希望今后能够在更多领域对ELK深入研究和应用。