基于Docker的ELK日志分析系统搭建
0x01 介绍
ELK是目前比较新也发展比较快的一套数据分析套件,很多大规模互联网企业也采用ELK作为其日志分析架构,比如斗鱼数据平台,参考有哪些基于ELK的亿级实时日志分析平台实践的案例?。文中对斗鱼日志分析系统的初始到发展做了很完整的介绍,很有阅读价值。
ELK是elastic公司提供的一套完整的数据收集、处理、展示解决方案,是三个产品的首字母缩写,分别是ElasticSearch、Logstash 和 Kibana。
- ElasticSearch简称ES,它是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,使用 Java 语言编写。
- Logstash是一个具有实时传输能力的数据收集引擎,它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。
- Kibana为Elasticsearch 提供了可视化数据展示平台,基于Web。它可以在Elasticsearch的索引中查找,交互数据,并生成各种维度表格、图形。
他们的基本架构:
我对ELK表现出的兴趣由来已久,然而迫于环境限制一直未能自己实现一次,昨天我重新安装了系统,准备在自己电脑上实现一个单机架构,学习ELK架构的基本使用。
对于日志分析还有使用spark的架构,我会在文末进行一个简单的对比。
0x02 部署
还是采用了docker来部署
部署参考文档Elasticsearch, Logstash, Kibana (ELK) Docker image documentation
docker pull elasticsearch # 拉取elasticsearch镜像
docker pull logstash # 拉取logstash镜像
docker pull kibana # 拉取kibana镜像
ELK框架的工作流程是Logstash agent监控并采集日志,将采集的日志内容发给redis(不做存储),logstash index将日志手机在一起交给全文搜索服务ES,然后我们可以用ES进行自定义检索,通过Kibana来结合即可用过可视化界面进行展示。
我们通过docker-compose来配置elasticsearch、logstash、kibana联合环境
此处注意
version: '2'
services:
elasticsearch:
image: elasticsearch
container_name: elasticsearch
hostname: elasticsearch
restart: always
ports:
- "9200:9200"
volumes:
- /root/workdir/elkdata/esdata:/usr/share/elasticsearch/data
networks:
- elk
kibana:
image: kibana
container_name: kibana
hostname: kibana
restart: always
ports:
- "5601:5601"
depends_on:
- elasticsearch
external_links:
- elasticsearch:elasticsearch
networks:
- elk
logstash:
image: logstash
container_name: logstash
restart: always
hostname: logstash
ports:
- "5044:5044"
volumes:
- /root/workdir/elkdata/lsconf:/config-dir
external_links:
- elasticsearch:elasticsearch
depends_on:
- elasticsearch
command: logstash -f /config-dir
networks:
- elk
networks:
elk:
driver: bridge
说明:
/root/workdir/elkdata/esdata目录用于挂载elassticsearch索引数据
/root/workdir/elkdata/lsconf目录用于存放输入输出配置
01-input.conf
input {
beats {
port => 5044
type => "logs"
}
}
02-output.conf
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
}
}
kibana配置相对简单,没有什么要说明的
启动环境
docker-compose up -d
在后端启动ELK环境,这个时候一个ELK环境已经搭建完毕,但是我们还没有日志采集,通过5601端口访问kibana并不会有任何数据展示。下面使用Filebeat来做日志的推送
0x03 推送日志
Filebeat是一个日志文件托运工具,在你的服务器上安装客户端后,filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读),并且它可以转发这些信息到elasticsearch或者logstash中存放。我这次试用filebeat来推送日志到logstash的5044端口(在01-input.conf中定义),在logstash接受到这些文件后会处理后发送到elastricsearch(在02-output.conf中定义)。
安装过程:
1. 下载
https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.6.4-linux-x86_64.tar.gz
2. 解压
tar -zxvf filebeat-5.6.4-linux-x86_64.tar.gz
3. 修改filebeat.yml配置文件
日志路径修改为所需要推送日志的路径,支持文件名正则
- input_type: log
# Paths that should be crawled and fetched. Glob based paths.
paths:
- /var/log/test.log
推送到logstash
output.logstash:
# The Logstash hosts
hosts: ["172.18.0.4:5044"]
# Optional SSL. By default is off.
# List of root certificates for HTTPS server verifications
#ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]
# Certificate for SSL client authentication
#ssl.certificate: "/etc/pki/client/cert.pem"
# Client Certificate Key
#ssl.key: "/etc/pki/client/cert.key"
ip地址可以使用docker inspect logstash查看,或者在docker-compose.yml文件中指定容器ip
运行filebeat推送日志:
./filebeat -e -c filebeat.yml
0x04 Kibana界面
使用浏览器进入kibana界面,添加策略,使用默认即可。
整体架构图:
至此基本的环境就已经搭建完毕,对于配置logstash处理日志策略可以通过配置文件完成,下次再写。
0x05 ELK和Spark
可能大家也了解过关于使用Spark做日志分析。同为大数据处理框架,究竟谁更适合做日志分析呢。因为我之前也想问这个问题,最后发现使用Spark实在是太麻烦了,我们需要使用Hadoop做分布式存储,还要再去学一门语言,对于像我这样的不是专门做数据分析的,如果只需要我会一些正则语法即可处理好日志何乐而不为呢。归根到底,如果对日志的分析要求不高,不需要很复杂的计算(Spark提供了更加多的表达API),ELK这种简单轻量易扩展的特点,我觉得更加适合,如果你想从数据中挖掘更多的价值进行复杂的统计分析Spark会更合适,ELK更适合做检索。最后要说的关于数据量的问题,Spark可以处理的数据量更大一些,但是目前业务还达不到两者的瓶颈。