目录

    本文主要简单介绍了 ELK 的技术栈,并给出了 Docker compose 的编排配置。阅读本文,可在本地通过 Docker 将 ELK 跑起来。后续会将 ELK 在服务器上进行部署,相关的配置再补充。

    1. ELK 技术栈介绍

    ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写,Elasticsearch,Logstash 和 Kibana。这三款软件都是开源软件,通常是配合使用,简称为 ELK 协议栈。

    ELK 已经成为目前最流行的集中式日志解决方案。

    基本流程是 Logstash 负责从各种数据源里采集数据,然后发送到 Elasticsearch,Elasticsearch 对这些数据创建索引,然后由 Kibana 对其进行各种分析并以图表的形式展示。

    Logstash 在服务器上占用过多系统资源,通常会引入 Beats 作为日志的收集器。Beats 所占系统的 CPU 和内存几乎可以忽略不计。

    2. Elasticsearch

    Elasticsearch 是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,使用 Java 语言编写。

    主要特点

    • 实时分析
    • 分布式实时文件存储,并将每一个字段都编入索引
    • 文档导向,所有的对象全部是文档
    • 高可用性,易扩展,支持集群(Cluster)、分片和复制(Shards 和 Replicas)
    • 接口友好,支持 JSON

    3. Logstash

    Logstash 是一个具有实时渠道能力的数据收集引擎,使用 JRuby 语言编写。其作者是世界著名的运维工程师乔丹西塞 (JordanSissel)。

    主要特点

    • 几乎可以访问任何数据
    • 可以和多种外部应用结合
    • 支持弹性扩展

    它由三个主要部分组成:

    • Shipper-发送日志数据
    • Broker-收集数据,缺省内置 Redis
    • Indexer-数据写入

    4. Kibana

    Kibana 是一个开源的分析与可视化平台,设计出来用于和 Elasticsearch 一起使用的。Kibana 可以使用搜索、查看、交互存放在 Elasticsearch 索引里的数据,能够很轻松地进行高级数据分析与数据可视化。

    Kibana 能够更好地处理海量数据,并据此创建柱形图、折线图、散点图、直方图、饼图和地图。

    5. Filebeat

    Fielbeat 是基于 logstash-forwarder 的源码改造而来,换句话说:Filebeat 就是最新版的 logstash-forwarder。它负责从当前服务器获取日志然后转发给 Logstash 或 Elasticserach 进行处理。

    Filebeat 包含两个部分 prospectors 和 harversters。 harversters 负责从文件中收集日志;prospectors 负责管理 harversters。

    6. 实践

    # docker-compose.yml
    version: '2'
    services:
      elasticsearch:
        image: elasticsearch:latest
        container_name: elasticsearch
        restart: always
        network_mode: "bridge"
        ports:
          # 主机向外暴露的端口 9200 作为对外提供服务的 HTTP 端口;9300 作为交互的 TCP 端口
          - "9200:9200"
          - "9300:9300"
        volumes:
           # 将日志索引文件的存储目录挂载到主机的目录,防止因容器挂掉活重启导致历史日志文件丢失
           - ./data:/usr/share/elasticsearch/data
    
      kibana:
        image: kibana:latest
        container_name: kibana
        restart: always
        network_mode: "bridge"
        ports:
          # 暴露 5601 端口用于 Kibana 界面的访问
          - "5601:5601"
        external_links:
          # 连接到 elasticsearch 容器用来获取数据
          - elasticsearch:elasticsearch
    
      logstash:
        image: logstash:latest
        container_name: logstash
        restart: always
        network_mode: "bridge"
        ports:
          # 端口 5044 用于接收来着 Filebeat 收集的日志数据;8080 用于接收来自插件 Logstash-input-http 的日志数据;
          - "5044:5044"
          - "8080:8080"
        volumes:
          # 挂载 conf 目录,用于添加自定义的配置文件,patterns 用于添加自定义的 grok 规则文件
          - ./conf:/config-dir
          - ./patterns:/opt/logstash/patterns
        external_links:
          - elasticsearch:elasticsearch
        command: logstash -f /config-dir
    
      filebeat:
        image: olinicola/filebeat:1.0.1
        container_name: filebeat
        restart: always
        network_mode: "bridge"
        extra_hosts:
          # 以 extra_hosts 的方式,指定 Logstash 的位置
          - "logstash:127.0.0.1"
        volumes:
          # 挂载配置文件 filebeat.yml;挂载本机的日志目录 /data/logs; 挂载本机的系统日志目录 /var/log; 挂载 registry 目录,用来确定 Filebeat 读取文件的位置,防止 Filebeat 因重启或挂机导致又从头开始读取日志文件,造成日志数据重复。
          - ./filebeat.yml:/etc/filebeat/filebeat.yml
          - ./data/logs:/data/logs
          - /var/log:/var/host/log
          - ./registry:/etc/registry
    
    # patterns/nginx
    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} %{QS:http_host} %{QS:upstream_addr} %{NUMBER:request_time} (?:%{NUMBER:upstream_response_time}|-)
    NGX_ERR_DATE_TIME %{YEAR}/%{MONTHNUM}/%{MONTHDAY} %{TIME}
    NGINXERROR %{NGX_ERR_DATE_TIME:timestamp} \[%{LOGLEVEL:level}\] %{POSINT:pid}#%{NUMBER}: \*%{NUMBER} %{GREEDYDATA:error_msg}
    
    # conf/01-input.conf
    input {
      beats {
        port => 5044
        type => "logs"
      }
    
      http {
        port => 8080
      }
    }
    
    # filebeat.yml
    filebeat:
      prospectors:
        -
          paths:
              - /data/logs/nginx/access.log
          document_type: nginx-access
        -
          paths:
              - /data/logs/nginx/error.log
          document_type: nginx-error
        -
          paths:
              - /var/host/log/messages*
          document_type: syslog
        -
          paths:
              - /var/host/log/secure*
          document_type: syslog-secure
        -
          paths:
              - /var/host/log/cron*
          document_type: syslog-cron
      registry_file: /etc/registry/mark
    output:
      logstash:
        hosts: ["logstash:5044"]
    shipper:
      name: n31
    logging:
      files:
        rotateeverybytes: 10485760 # = 10MB
    

    以 CentOS 为例,首先需要安装 Docker 和 Docker compose。

    yum install docker
    yum install epel-release
    yum install python-pip
    pip install --upgrade pip
    pip install docker-compose
    

    启动 Docker。

    service docker start
    docker-compose up
    

    本地通 http://127.0.0.1:5601 即可访问 Kibana 页面了。

    7. 参考