1、什么是 ELK Stack?

那么,ELK 到底是什么呢? “ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。

Elastic Stack 是 ELK Stack 的更新换代产品。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LyMVuef2-1678518175643)(null)]

Elasticsearch:这个开源的分布式搜索引擎基于 JSON 开发而来,具有 RESTful 风格。它使用简单,可缩放规模,十分灵活,因此受到用户的热烈好评,而且如大家所知,围绕这一产品还形成了一家专门致力于搜索的公司。

**Logstash和Kibana:**Elasticsearch 的核心是搜索引擎,所以用户开始将其用于日志用例,并希望能够轻松地对日志进行采集和可视化。有鉴于此,我们引入了强大的采集管道 Logstash 和灵活的可视化工具 Kibana。

**Beats:**我们向 ELK Stack 中加入了一系列轻量型的单一功能数据采集器,并把它们叫做 Beats。

lepus 操作系统监控 elk监控系统_搜索引擎

官网:https://www.elastic.co/cn/what-is/elk-stack

2、ELK常见的几种架构体系

2.1、Elasticsearch + Logstash + Kibana

lepus 操作系统监控 elk监控系统_elasticsearch_02

此架构由Logstash分布于各个节点上搜集相关日志、数据,并经过分析、过滤后发送给远端服务器上的Elasticsearch进行存储。Elasticsearch将数据以分片的形式压缩存储并提供多种API供用户查询,操作。用户亦可以更直观的通过配置Kibana Web方便的对日志查询,并根据数据生成报表。

这是最简单的一种ELK架构方式。优点是搭建简单,易于上手。缺点是Logstash耗资源较大,运行占用CPU和内存高。另外没有消息队列缓存,存在数据丢失隐患。

2.2、Elasticsearch + Logstash + Filebeat + Kibana

lepus 操作系统监控 elk监控系统_elasticsearch_03

与上一种架构相比,这种架构增加了一个filebeat模块。filebeat是一个轻量的日志收集代理,用来部署在客户端,优势是消耗非常少的资源(较logstash), 所以生产中,往往会采取这种架构方式,此种架构将收集端logstash替换为beats,更灵活,消耗资源更少,扩展性更强。同时可配置Logstash 和Elasticsearch 集群用于支持大集群系统的运维日志数据监控和查询。但是这种架构有一个缺点,没有消息队列缓存,当logstash出现故障,会造成日志的丢失。

2.3、Elasticsearch + Logstash + Filebeat + Redis(Kafka)+ Kibana

lepus 操作系统监控 elk监控系统_elasticsearch_04

logstash节点和elasticsearch节点可以根据日志量伸缩节点数量, filebeat部署在每台需要收集日志的服务器上。

此种架构引入了消息队列机制,位于各个节点上的beats先将数据/日志传递给消息队列(kafka、redis、rabbitMQ等),logstash从消息队列取数据进行过滤、分析后将数据传递给Elasticsearch存储。最后由Kibana将日志和数据呈现给用户。因为引入了Kafka(或者Redis),所以即使远端Logstash server因故障停止运行,数据将会先被存储下来,从而避免数据丢失。

工作流程:Filebeat采集—>发到kafka—> logstash处理从kafka缓存的数据进行分析—> 输出到es—> 显示在kibana

这种模式特点:这种架构适合于日志规模比较庞大的情况。但由于 Logstash 日志解析节点和 Elasticsearch 的负荷比较重,可将他们配置为集群模式,以分担负荷。引入消息队列,均衡了网络传输,从而降低了网络闭塞,尤其是丢失数据的可能性。

3、Docker部署ELK日志监控分析系统

3.1、下载需要的镜像

docker pull elasticsearch:7.17.7
docker pull logstash:7.17.7
docker pull kibana:7.17.7

3.2、下载docker-compose命令

下载dokcer-compose

curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

给dokcer-compose权限

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

3.3、编写配置文件

# 系统下创建目录架构
opt
    elk
        elasticsearch
            data #必须拥是777权限
            elasticsearch.yml
        kibana
            kibana.yml
        logstash
            pipeline
            logstash.conf
            logstash.yml
        docker-compose.yml
touch -p /opt/elk/docker-compose.yml
mkdir -p /opt/elk/elasticsearch/data
touch -p /opt/elk/elasticsearch/elasticsearch.yml
sudo chmod 777 /opt/elk/elasticsearch/data
touch -p /opt/elk/kibana/kibana.yml
touch -p /opt/elk/logstash/pipeline/logstash.conf
touch -p /opt/elk/logstash/logstash.yml

elasticsearch.yml内容如下

## Default Elasticsearch configuration from Elasticsearch base image.
### https://github.com/elastic/elasticsearch/blob/master/distribution/docker/src/docker/config/elasticsearch.yml
cluster.name: "docker-cluster"
network.host: 0.0.0.0
### X-Pack settings
### see https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-xpack.html
xpack.license.self_generated.type: trial
xpack.security.enabled: true
xpack.monitoring.collection.enabled: true

kibana.yml内容如下

## Default Kibana configuration from Kibana base image.
### https://github.com/elastic/kibana/blob/master/src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.js
server.name: kibana
server.host: 0.0.0.0
i18n.locale: "zh-CN"
elasticsearch.hosts: [ "http://192.168.56.103:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
### X-Pack security credentials
elasticsearch.username: elastic
elasticsearch.password: elk123456

logstash.yml内容如下

## Default Logstash configuration from Logstash base image.
### https://github.com/elastic/logstash/blob/master/docker/data/logstash/config/logstash-full.yml
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://192.168.56.103:9200" ]
### X-Pack security credentials
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: elk123456

logstash.conf内容如下

input {
        tcp {
                port => 5000
        }
}
filter {}
### Add your filters / logstash plugins configuration here
output {
        elasticsearch {
                hosts => "192.168.56.103:9200"
                user => "elastic"
                password => "elk123456"
### 日志索引名称
                index => "elk"
        }
}

docker-compose.yml内容如下

version: "2.2"
services:
  ###配置elasticsearch
  es:
    image: elasticsearch:7.8.0
    container_name: elasticsearch 
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      discovery.type: single-node
      ###es的密码
      ELASTIC_PASSWORD: elk123456
      ES_JAVA_OPTS: "-Xmx256m -Xms256m"
    volumes:
       # 这里注意一下 如果你想吧docker中es的数据 映射出来 你本地的 /opt/elk/elasticsearch/data 必须拥有 777权限
      - /opt/elk/elasticsearch/data:/usr/share/elasticsearch/data
      - /opt/elk/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    network_mode: host
  ###配置Logstash
  ls:
    image: logstash:7.8.0
    container_name: logstash
    ports:
      - "5000:5000/tcp"
      - "5000:5000/udp"
      - "9600:9600"
    network_mode: host
    environment:
      discovery.type: single-node
      ES_JAVA_OPTS: "-Xmx256m -Xms256m"
    volumes:
    ###将本机目录/opt/elk/logstash/pipeline下的文件映射到docker容器里面
      - /opt/elk/logstash/pipeline:/usr/share/logstash/pipeline
      - /opt/elk/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml
    depends_on:
      - es       
  ###配置Kibana
  kb:
    image: kibana:7.8.0
    container_name: kibana
    ports:
      - "5601:5601"
    volumes:
      ###将本机目录/opt/elk/kibana/kibana.yml下的文件映射到docker容器里面
      - /opt/elk/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml
    network_mode: host
    depends_on:
      - es

discovery.type:表示这是单机启动

ES_JAVA_OPTS:配置该容器占用主机的内存等等

network_mode:设置docker容器的网络模式

depends_on:指必须后面的服务启动以后 这个才启动

3.4、部署完成启动

cd /opt/elk
docker-compose up

lepus 操作系统监控 elk监控系统_lepus 操作系统监控_05

3.5、访问kibana(记得打开个工具端口)

http://192.168.56.103:5601/
用户名:elastic
密码:elk123456

lepus 操作系统监控 elk监控系统_lepus 操作系统监控_06

4、Springboot集成Logstash

在pom文件中添加以下依赖 让springboot的日志集成logstash

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>7.2</version>
</dependency>

resources下添加logbacklogstash集成的文件

lepus 操作系统监控 elk监控系统_docker_07

logback-spring.xml配置如下

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--配置logstash 发送日志数据的地址 -->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>192.168.56.103:5000</destination>
<!--自己定义logstash的encoder-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n </pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--springboot的日志 -->
<include resource="org/springframework/boot/logging/logback/base.xml" />
<!--日志的打印级别 -->
<root level="INFO">
<appender-ref ref="LOGSTASH" />
<appender-ref ref="CONSOLE" />
</root>
</configuration>

application.properties配置如下

logging.config= classpath:logback-spring.xml