ELK常见架构

Elasticsearch + Logstash + Kibana

这是一种最简单的架构。这种架构,通过logstash收集日志,Elasticsearch分析日志,然后在Kibana(web界面)中展示。这种架构虽然是官网介绍里的方式,但是往往在生产中很少使用。

Elasticsearch + Logstash + filebeat + Kibana

与上一种架构相比,这种架构增加了一个filebeat模块。filebeat是一个轻量的日志收集代理,用来部署在客户端,优势是消耗非常少的资源(较logstash), 所以生产中,往往会采取这种架构方式,但是这种架构有一个缺点,当logstash出现故障, 会造成日志的丢失。

Elasticsearch + Logstash + filebeat + redis(也可以是其他中间件,比如kafka) + Kibana

这种架构是上面那个架构的完善版,通过增加中间件,来避免数据的丢失。当Logstash出现故障,日志还是存在中间件中,当Logstash再次启动,则会读取中间件中积压的日志。

filebeat安装部署

简介

Filebeat是一个日志文件托运工具,在你的服务器上安装客户端后,filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读),并且转发这些信息到elasticsearch或者logstarsh、redis中存放。

工作原理

filebeat由2个主要组件构成:prospector和harvesters。这两类组件一起协同完成Filebeat的工作,从指定文件中把数据读取出来,然后发送事件数据到配置的output中。

harvesters:主要负责进行单个文件的内容收集;在运行过程中,每一个Harvester会对一个文件逐行进行内容读取,并且把读写到的内容发送到配置的output中。

Prospector负责管理Harvsters,并且找到所有需要进行读取的数据源。如果input type配置的是log类,Prospector将会去配置度路径下查找所有能匹配上的文件,然后为每一个文件创建一个Harvster。每个Prospector都运行在自己的Go routine里。

当你开启filebeat程序的时候,它会启动一个或多个探测器(prospectors)去检测你指定的日志目录或文件,对于探测器找出的每一个日志文件,filebeat启动收割进程(harvester),每一个收割进程读取一个日志文件的新内容,并发送这些新的日志数据到处理程序(spooler),处理程序会集合这些事件,最后filebeat会发送集合的数据到你指定的地点。

下载

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.2.2-x86_64.rpm
sudo rpm -vi filebeat-5.2.2-x86_64.rpm

配置

#=========================== Filebeat prospectors =============================
#filebeat.prospectors模块用来指定日志文件的来源。
filebeat.prospectors:
- input_type: log #input_type 指定日志类型,在这里是log, 应该也可以是json
  enabled: true
  paths:  #paths指定日志文件路径。
    - /root/myapp/tomcat/tomcat8/logs/*.log
#================================ redis =====================================
output.redis:
    hosts: ["152.136.233.203:6379"]
    password: "redis"
    datatype: list
    key: "tomcat-log"
    db: 1

#document_type:这个字段是用来给日志打标记的。 
#fields: 也是打标记,主要为了后面日志分析查找的方便,存储的时候也会根据fields分类存储,相同fields的数据存在同一个redis key中
#fields_under_root: 如果该选项设置为true, 则该fields会存储在top-level中。
#tail_files: 这个选项如果设置为true,则读取日志文件的新内容,而忽略原有的内容,一般要设置为true

启动

systemctl start filebeat

问题

  1. filebeat怎么设置从头开始读取

    1. 找到registry文件的位置,如果没有单独配置那么文件路径为/var/lib/filebeat/registry,不在也没关心,可以直接find命令查找

      find / -name registry
    2. 关闭filebeat –> 删掉registry文件 –> 启动filebeat

  2. Filebeat插件启动失败,不能直接查找报错原因

    老是在filebeat启动的这一步骤上出错,但是由于filebeat是由systemd启动的,因此原因也经常查不清楚,因此并不能直观的查出错误在哪里,所以今天教给大家两个寻找错误的根源的方法:

    直接使用filebeat的启动方法,而不使用systemctl start filebeat来启动。比如:

    /usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml -path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/filebeat -path.logs /var/log/filebeat

logstash 安装配置

下载

wget https://artifacts.elastic.co/downloads/logstash/logstash-5.2.2.tar.gz
tar xf logstash-5.2.0.tar.gz -C /opt/app/

配置

mkdir -p /data/ls-data  #创建/data/ls-data目录,用于logstash数据的存放
chown -R logstash:logstash /data/ls-data #修改该目录的拥有者为logstash
mkdir -p /log/ls-log #创建/data/ls-log目录,用于logstash日志的存放
chown -R logstash:logstash /log/ls-log #修改该目录的拥有者为logstash

创建配置文件

mkdir -p /config/logstash/config.d
vim logstash.conf
input {
  redis {
    host => "localhost"
    port => "6379"
    db => "1"
    data_type => "list"
    key => "tomcat-log"
    codec => plain {
          charset => "UTF-8"
    }
  }
}

output {
  elasticsearch { 
  	hosts => ["localhost:9200"] 
  	index => "tomcat-log"
  }
  stdout { codec => rubydebug }
}

input是redis, 需要指定redis的host 和port以及db,还要指明数据的类型,list表示这是一个redis的list对象。key指明redis中的key名称。

output 是elasticsearch, hosts指明elasticsearch的ip和端口,index指明这个日志存在elasticsearch中的索引名称。

修改配置文件(/opt/logstash-5.2.2/config/logstash.yml)

# 设置数据的存储路径为/data/ls-data
path.data: /data/ls-data
# 设置管道配置文件路径为/etc/logstash/conf.d
path.config: /etc/logstash/conf.d
# 设置日志文件的存储路径为/log/ls-log
path.logs: /log/ls-log
测试logstash
./logstash -f /config/logstash/config.d/logstash.conf --config.test_and_exit
#--config.test_and_exit表示,检查测试创建的logstash.conf配置文件,是否有问题,如果没有问题,执行之后,显示Configuration OK 证明配置成功!

启动

nohup /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf &

elasticsearch安装

下载

curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.2.tar.gz
tar -xvf elasticsearch-5.2.2.tar.gz -C  /opt/app/

配置

mkdir -p /data/es-data #创建/data/es-data目录,用于elasticsearch数据的存放
chown -R elasticsearch:elasticsearch /data/es-data  #修改该目录的拥有者为elasticsearch
mkdir -p /log/es-log   #创建/data/es-log目录,用于elasticsearch日志的存放
chown -R elasticsearch:elasticsearch /log/es-log #修改该目录的拥有者为elasticsearch

修改配置文件 (/opt/elasticsearch-5.2.2/config/elasticsearch.yml)

#设置data存放的路径为/data/es-data
path.data: /data/es-data
#设置logs日志的路径为/log/es-log
path.logs: /log/es-log
#设置内存不使用交换分区
bootstrap.memory_lock: false
#配置了bootstrap.memory_lock为true时反而会引发9200不会被监听,原因不明
#设置允许所有ip可以连接该elasticsearch
network.host: 0.0.0.0
#开启监听的端口为9200
http.port: 9200
#增加新的参数,为了让elasticsearch-head插件可以访问es (5.x版本,如果没有可以自己手动加)
http.cors.enabled: true
http.cors.allow-origin: "*"

启动

注意,如果你使用root用户启动elasticsearch,就会报错,启动失败,这是因为elasticsearch不允许用root用户启动。可以创建一个用户,用来启动elasticsearch

groupadd elasticsearch  #添加组
useradd -g elasticsearch elasticsearch #添加用户
chown -R elasticsearch:elasticsearch  /opt/app/elasticsearch-5.2.2/ #设置权限
/opt/app/elasticsearch-5.2.2/bin/elasticsearch -d  #启动,后台运行

kibana安装配置

安装

wget https://artifacts.elastic.co/downloads/kibana/kibana-5.2.2-linux-x86_64.tar.gz
tar -xzf kibana-5.2.2-linux-x86_64.tar.gz -C /opt/app/

配置(/opt/app/kibana-5.2.2-linux-x86_64/config/kibana.yml)

server.host: "0.0.0.0" #指明服务运行的地址
elasticsearch.url: "http://localhost:9200" #指明elasticsearch运行的地址和端口
kibana.index: ".kibana"  #指明kibana使用的索引,这个是自定义的。

启动

/opt/app/kibana-5.2.2-linux-x86_64/bin/kibana

参考

https://www.jianshu.com/p/e7362ccfe7e3

http://www.justdojava.com/2019/08/11/elk-install/

https://blog.51cto.com/liqingbiao/2177873

https://www.cnblogs.com/FengGeBlog/p/10644170.html