/ ELK

基于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表现出的兴趣由来已久,然而迫于环境限制一直未能自己实现一次,昨天我重新安装了系统,准备在自己电脑上实现一个单机架构,学习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界面,添加策略,使用默认即可。

Kibana界面

整体架构图:

elk整体架构图

至此基本的环境就已经搭建完毕,对于配置logstash处理日志策略可以通过配置文件完成,下次再写。

0x05 ELK和Spark

可能大家也了解过关于使用Spark做日志分析。同为大数据处理框架,究竟谁更适合做日志分析呢。因为我之前也想问这个问题,最后发现使用Spark实在是太麻烦了,我们需要使用Hadoop做分布式存储,还要再去学一门语言,对于像我这样的不是专门做数据分析的,如果只需要我会一些正则语法即可处理好日志何乐而不为呢。归根到底,如果对日志的分析要求不高,不需要很复杂的计算(Spark提供了更加多的表达API),ELK这种简单轻量易扩展的特点,我觉得更加适合,如果你想从数据中挖掘更多的价值进行复杂的统计分析Spark会更合适,ELK更适合做检索。最后要说的关于数据量的问题,Spark可以处理的数据量更大一些,但是目前业务还达不到两者的瓶颈。