dockercompose搭建elk

Elastic Stack简介

如果你没有听说过Elastic Stack,那你一定听说过ELK,实际上ELK是三款软件的简称,分别是Elasticsearch、 Logstash、Kibana组成,在发展的过程中,又有新成员Beats的加入,所以就形成了Elastic Stack。所以说,ELK是旧的称呼,Elastic Stack是新的名字。

dockercompose搭建elk_第1张图片

全系的Elastic Stack技术栈包括:

dockercompose搭建elk_第2张图片

Elasticsearch

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的。我们希望搜索解决方案要运行速度快,我们希望能有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP来索引数据,我们希望我们的搜索服务器始终可用,我们希望能够从一台开始并扩展到数百台,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。因此我们利用Elasticsearch来解决所有这些问题及可能出现的更多其它问题。

ElasticSearch是Elastic Stack的核心,同时Elasticsearch 是一个分布式、RESTful风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为Elastic Stack的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。

Elasticsearch的发展是非常快速的,所以在ES5.0之前,ELK的各个版本都不统一,出现了版本号混乱的状态,所以从5.0开始,所有Elastic Stack中的项目全部统一版本号。(elk版本号必须要统一)

Kibana

Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,设计用于和 Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索、查看、交互操作。您可以很方便的利用图表、表格及地图对数据进行多元化的分析和呈现。

官网:https://www.elastic.co/cn/kibana

dockercompose搭建elk_第3张图片

Beats

Beats是elastic公司开源的一款采集系统监控数据的代理agent,是在被监控服务器上以客户端形式运行的数据收集器的统称,可以直接把数据发送给Elasticsearch或者通过Logstash发送给Elasticsearch,然后进行后续的数据分析活动。Beats由如下组成:

  • Packetbeat:是一个网络数据包分析器,用于监控、收集网络流量信息,Packetbeat嗅探服务器之间的流量,解析应用层协议,并关联到消息的处理,其支 持ICMP (v4 and v6)、DNS、HTTP、Mysql、PostgreSQL、Redis、MongoDB、Memcache等协议;
  • Filebeat:用于监控、收集服务器日志文件,其已取代 logstash forwarder;
  • Metricbeat:可定期获取外部系统的监控指标信息,其可以监控、收集 Apache、HAProxy、MongoDB MySQL、Nginx、PostgreSQL、Redis、System、Zookeeper等服务;

Beats和Logstash其实都可以进行数据的采集,但是目前主流的是使用Beats进行数据采集,然后使用 Logstash进行数据的分割处理等,早期没有Beats的时候,使用的就是Logstash进行数据的采集。

Beats平台其实是一个轻量性数据采集器,通过集合多种单一用途的采集器,从成百上千台机器中向Logstash或ElasticSearch中发送数据。

dockercompose搭建elk_第4张图片

通过Beats包含以下的数据采集功能

  • Filebeat:采集日志文件
  • Metricbeat:采集指标
  • Packetbeat:采集网络数据

dockercompose搭建elk_第5张图片

如果我们的数据不需要任何处理,那么就可以直接发送到ElasticSearch中

如果们的数据需要经过一些处理的话,那么就可以发送到Logstash中,然后处理完成后,在发送到ElasticSearch

最后在通过Kibana对我们的数据进行一系列的可视化展示

dockercompose搭建elk_第6张图片

Filebeat

介绍

Filebeat是一个轻量级的日志采集器

dockercompose搭建elk_第7张图片

为什么要用Filebeat?

当你面对成百上千、甚至成千上万的服务器、虚拟机和溶气气生成的日志时,请告别SSH吧!Filebeat将为你提供一种轻量型方法,用于转发和汇总日志与文件,让简单的事情不再繁华,关于Filebeat的记住以下两点:

  • 轻量级日志采集器
  • 输送至ElasticSearch或者Logstash,在Kibana中实现可视化

架构

用于监控、收集服务器日志文件.

dockercompose搭建elk_第8张图片

流程如下:

  • 首先是input输入,我们可以指定多个数据输入源,然后通过通配符进行日志文件的匹配
  • 匹配到日志后,就会使用Harvester(收割机),将日志源源不断的读取到来
  • 然后收割机收割到的日志,就传递到Spooler(卷轴),然后卷轴就在将他们传到对应的地方

Logstash

Logstash是一个开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到最喜欢的存储库中(我们的存储库当然是ElasticSearch)

dockercompose搭建elk_第9张图片

我们回到我们ElasticStack的架构图,可以看到Logstash是充当数据处理的需求的,当我们的数据需要处理的时候,会将它发送到Logstash进行处理,否则直接送到ElasticSearch中

Logstash可以处理各种各样的输入,从文档,图表中=,数据库中,然后处理完后,发送到

dockercompose搭建elk_第10张图片

Logstash主要是将数据源的数据进行一行一行的处理,同时还直接过滤切割等功能。

dockercompose搭建elk_第11张图片

部署安装

要准备的:

1、2核4g或以上的服务器

2、docker

3、docker-compose

1、安装docker

首先到docker官网查看文档(docker的安装需要centos7.x以上):https://docs.docker.com/engine/install/centos/

1、卸载旧版本的docker

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2、设置镜像仓库

 sudo yum install -y yum-utils
 sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
    
    # 换成国内阿里云的docker仓库
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3、安装docker引擎

sudo yum install docker-ce docker-ce-cli containerd.io

4、docker版本检查

docker version

#启动docker
service docker start

# 设置开机自启动
systemctl enable docker

2、安装docker-compose

找到官网地址:https://docs.docker.com/compose/install/

1、安装

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2、授权

sudo chmod +x /usr/local/bin/docker-compose

3、准备镜像

docker pull logstash:7.9.3
docker pull kibana:7.9.3
docker pull elasticsearch:7.9.3
docker pull elastic/filebeat:7.9.3

4、搭建efk(注意文件挂载的位置)

1、docker-compose.yml

version: "3.9"
services:
  elasticsearch:
    image: elasticsearch:7.9.3
    restart: always
    container_name: elasticsearch
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms64m -Xmx128m
    volumes:
      - ./elasticsearch/data:/usr/share/elasticsearch/data
      - ./elasticsearch/download:/usr/share/elasticsearch/download

  kibana:
    image: kibana:7.9.3
    restart: always
    container_name: kibana
    ports:
      - 5601:5601
    environment:
      - elasticsearch_url=elasricsearch:9200
    depends_on:
      - elasticsearch

  filebeat:
    image: elastic/filebeat:7.9.3
    restart: always
    container_name: filebeat
    volumes:
      - ./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml
      - ./filebeat/logs:/var/log/filebeat/logs
    depends_on:
      - elasticsearch
      - kibana

需要注意的地方:

1、es设置成单节点模式

2、设置es的占用内存

3、 容器卷挂载:
	1)是方便在容器外面编辑容器配置文件,还有比如es安装ik分词插件什么的
	2)可以防止删除容器之后所有数据就没有(持久化)
	
	
4、容器间内部通讯:
    1)docker-compose 默认会创建一个桥接模式的网络 ,这些容器间可以直接通过服务(service)名字建立通讯,而不用写ip地址
    2)docker network ls 查看 网络  
    3)docker network inspect 网络名字查看网络配置
    

2、filebeat.yml

filebeat:
  inputs:
    - type: log
      enabled: true
      paths:
        - /var/log/filebeat/logs/*.log

setup:
  ilm:
    enabled: false

  template:
    settings:
      index:
        number_of_shards: 1
        number_of_replicas: 0
    name: "filebeat"
    pattern: "filebeat-*"
  kibana:
    host: "kibana:5601"

output:
#  logstash:
#    hosts: ["logstash:5044"]
  elasticsearch:
    hosts: ["elasticsearch:9200"]
    index: "filebeat-%{+yyyy.MM.dd}"


docker-compose命令:

#启动服务
docker-compose up -d 
#启动并编译
docker-compose up -d --build
#停止并删除容器
docker-compose down
#查看容器日志
docker-compose logs 
docker logs 容器id

5、搭建elk

流程说明

dockercompose搭建elk_第12张图片

  • 应用APP生产日志,用来记录用户的操作
    • [INFO] 2019-03-15 22:55:20 [Main] - DAU|5206|使用优惠券|2019-03-15 03:37:20
    • [INFO] 2019-03-15 22:55:21 [Main] - DAU|3880|浏览页面|2019-03-15 07:25:09
  • 通过Filebeat读取日志文件中的内容,并且将内容发送给Logstash,原因是需要对内容做处理
  • Logstash接收到内容后,进行处理,如分割操作,然后将内容发送到Elasticsearch中
  • Kibana会读取Elasticsearch中的数据,并且在Kibana中进行设计Dashboard,最后进行展示

1、docker-compose.yml

version: "3.9"
services:
  elasticsearch:
    image: elasticsearch:7.9.3
    restart: always
    container_name: elasticsearch
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms64m -Xmx128m
    volumes:
      - ./elasticsearch/data:/usr/share/elasticsearch/data
      - ./elasticsearch/download:/usr/share/elasticsearch/download

  kibana:
    image: kibana:7.9.3
    restart: always
    container_name: kibana
    ports:
      - 5601:5601
    environment:
      - elasticsearch_url=elasricsearch:9200
    depends_on:
      - elasticsearch

  filebeat:
    image: elastic/filebeat:7.9.3
    restart: always
    container_name: filebeat
    volumes:
      - ./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml
      - ./filebeat/logs:/var/log/filebeat/logs
    depends_on:
      - elasticsearch
      - kibana
      
  logstash:
    image: logstash:7.9.3
    restart: always
    container_name: logstash
    volumes:
      - ./logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
      - ./logstash/template.json:/etc/logstash/template.json
    ports:
      - "5044:5044"
      - "9600:9600"
    environment:
      LS_JAVA_OPTS: "-Xms512m -Xmx512m"
    depends_on:
      - elasticsearch

2、filebeat.yml

filebeat:
  inputs:
    - type: log
      enabled: true
      paths:
        - /var/log/filebeat/logs/*.log

setup:
  ilm:
    enabled: false

  template:
    settings:
      index:
        number_of_shards: 1
        number_of_replicas: 0
    name: "filebeat"
    pattern: "filebeat-*"
  kibana:
    host: "kibana:5601"

output:
  logstash:
    hosts: ["logstash:5044"]
#  elasticsearch:
#    hosts: ["elasticsearch:9200"]
#    index: "filebeat-%{+yyyy.MM.dd}"

3、logstash.conf

input {
    beats {
       port => 5044
    }
}

filter {
    grok {
        pattern_definitions => {
            "QUALIFIED" => "[a-zA-Z0-9$_.]+"
        }

        match => {
            "message" => "%{TIMESTAMP_ISO8601:logdate}%{SPACE}\[%{USERNAME:logthread}\]%{SPACE}%{WORD:loglevel}%{SPACE}%{QUALIFIED:logclass:text}%{SPACE}-%{SPACE}%{GREEDYDATA:logmsg:text}"

        }

    }
}


output {
    elasticsearch {
        hosts =>["elasticsearch:9200"]
        index => "logstash-%{+yyyy.MM.dd}"
        template => "/etc/logstash/template.json"
        template_name => "logstash"
    }

}

4、template.json

{
  "template": "logstash-*",
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
    "properties": {
      "logclass": {
        "type": "text"
      },
      "logdate": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss.SSS"
      },
      "loglevel": {
        "type": "keyword"
      },
      "logthread": {
        "type": "keyword"
      },
      "logmsg": {
        "type": "text"
      }
    }
  }
}

6.grok表达式

参考地址:https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/ecs-v1/grok-patterns

正则表达式:https://www.runoob.com/regexp/regexp-rule.html

你可能感兴趣的:(spring,boot,dockercompose,docker)