一、ELK简介

1.什么是ELK?

“ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。

  • Elasticsearch 是一个搜索和分析引擎
  • Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。
  • Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。

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

2.ELK的作用

在现在的市场中,ELK多作为一套完整的日志收集系统所使用;能够更方便的为开发人员排查日志,定位bug。

3.官方图示

1619830130177

这是官方网站的一张图,很形象的说明了整个ELK的使用流程。

底层基于Logstash、Beats收集转换日志;然后传输到ES进行存储;最后开发人员通过Kibana图形化操作界面查看日志数据。

至于什么是Beats,后面说明。

4.什么是Beats?

Beats一系列轻量型的单一功能数据采集器,在2005年后官方加入到ELK中,从此ELK的名字被官方更为Elastic Stack,但我们口头上还是更喜欢称为ELK,毕竟比较朗朗上口嘛!

二、ELK的安装配置

1.安装前提说明

1.1 ELK版本要求一致

在官方文档中有这样一段话:

When installing the Elastic Stack, you must use the same version across the entire stack. For example, if you are using Elasticsearch 7.12.1, you install Beats 7.12.1, APM Server 7.12.1, Elasticsearch Hadoop 7.12.1, Kibana 7.12.1, and Logstash 7.12.1.

大概的意思是说当你安装Elastic Stack的时候,所使用的软件版本必须要一致,包括后续想要安装的APM ServerElasticsearch Hadoop等软件。

所以推荐安装的版本为7.12.1,为官方最新版。

1.2 安装JDK
  1. 下载JDK包

    自行去Oracle官网下载。

  2. 安装

    # 解压
    $ tar -zxvf java-1.8.0-openjdk.tar.gz -C /usr/local/elk
    # 修改解压文件夹
    $ mv elasticsearch.7.12.1 elasticsearch
    
  3. 配置

    修改/etc/profile文件(vim /etc/profile),添加一下内容配置

    # jdk配置
    # 解压后的jdk所在路径
    JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el6_10.x86_64
    PATH=$JAVA_HOME/bin:$PATH
    CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    JAVACMD=/usr/bin/java
    export JAVA_HOME JAVACMD CLASSPATH PATH
    
  4. 生效

    执行命令$ source /etc/profile,使配置文件生效。

  5. 测试

    # 执行命令
    $ java -version
    openjdk version "1.8.0_181"
    OpenJDK Runtime Environment (build 1.8.0_181-b13)
    OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
    
1.3 关闭防火墙

我们是在虚拟机软件中虚拟的一台linux中安装,所以为了能够实现外网访问,选择关闭linux防火墙。(也可以选择开放外放所需要访问的端口)

1.4 建立统一管理目录

/usr/local目录下简历elk目录,后续安装的软件都放在这个目录中,方便统一管理。

$ cd /usr/local
# elk统一目录
$ mkdir elk
1.5 建立新用户

因为es等一些软件不支持root用户启动,所以需要建立一个新的用户,来启动elk;所以后续启动软件的时候,都要切换为新用户启动。

建立新用户elk

# 建立新用户
$ useradd elk

elk文件夹的所属权限交给elk用户

# 在root用户下进行以上操作(只要linux提示无权限操作时,就需要切换到root用户才能操作)
$ chowm -R elk:elk ./elk

# 切换root用户命令
$ su root

2.ElasticSearch安装

2.1 安装

安装到我们创建的elk目录

# 解压
$ tar -zxvf elasticsearch.7.12.1.tar.gz -C /usr/local/elk
# 修改解压文件夹名称
$ mv elasticsearch.7.12.1 elasticsearch
2.2 配置

es的配置文件有以下三个:

  • elasticsearch.yml :Elasticsearch 配置
  • jvm.options :Elasticsearch 的JVM配置
  • log4j2.properties:Elasticsearch 日志配置

jvm.options

修改jvm.options中内存占用的大小配置

# 最小占用内存
-Xms1g
# 最大占用内存
-Xmx1g

elasticsearch.yml

# IP配置为:0.0.0.0 外网才能访问
network.host: 0.0.0.0
# 集群配置
cluster.initial_master_nodes: ["node-1"]
# 配置当前es节点的名称
node.name: node-1
# 配置端口号
http.port: 9200
2.3 启动
# 进入es bin目录
$ cd /usr/local/elk/elasticsearch/bin
# 后台启动
$ nuhup ./elasticsearch &
# 或者
$ ./elasticsearch -d
2.4 访问

游览器访问:http://192.168.213.136:9200/(IP地址为虚拟机IP地址,端口为在elasticsearch.yml中配置的端口)

1619833067425

2.5 BUG

max file descriptors [65535] for elasticsearch process is too low

出现以上bug时因为程序资源不够所致。

解决

  • 打开/etc/security/limits.conf,在里面添加如下内容

    # 注意 [65536] 数值的大小设根据报错信息来设置
    * soft nofile 65536
    * hard nofile 65536
    
  • 编辑/etc/pam.d/common-session,添加如下内容

    session required pam_limits.so 
    
  • 编辑/etc/profile,添加如下内容

    ulimit -SHn 65536
    
  • 重启计算机后查看

    $ ulimit -n
    

3.Kibana

3.1 解压
# 解压
$ tar -zxvf kibana-7.12.1-linux-x86_64.tar.gz -C /usr/local/elk
# 修改解压文件夹
$ mv kibana-7.12.1 kibana
3.2 配置

修改vim /usr/local/elk/kibana/config/kibana.yml文件

kibana.yml

# kibana 端口
server.port: 5601
# 允许外网访问
server.host: "0.0.0.0"
# 监听ES
elasticsearch.hosts: ["http://localhost:9200"]
3.3 启动
$ cd /usr/local/elk/kibana/bin
# 守护式启动
$ nohup ./kibana &
3.4 访问

http://192.168.213.136:5601/

1619833316823

4.LogStash

4.1 安装
# 解压
$ tar -zxvf logstash-7.12.1-linux-x86_64.tar.gz -C /usr/local/elk
# 修改解压文件夹
$ mv logstash-7.12.1 logstash
4.2 配置

自定义与ES的传输管道

# 创建conf.d文件夹
$ cd /usr/local/elk/logstash
$ mkdir conf.d
$ cd cd conf.d/
# 创建logstash.yml文件
$ touch logstash.yml
$ vim logstash.yml

logstash.yml

logstash.yml文件中增加一下配置

# 输入
input{
	# 从filebeats中获取数据
    beats {
        # 端口必须为5044
        port => 5044
        # 日志类型
        type => 'systemlog'
        # 编码
        codec => plain {
          charset => "UTF-8"
        }
    }
}


# 输出
output {
    # 输出到ES
    elasticsearch {
        # ES的IP端口地址
        hosts => ["192.168.213.136:9200"]
        # 输出到ES的日志索引(在kibana中搜索此索引查看日志数据)
        index => "elk-%{+systemlog}-%{+YYYY.MM.dd}"
    }
}

修改logstash.yml

$ cd /usr/local/elk/logstash/config
$ vim logstash.yml

增改以下配置:

# 配置自定义的传输管道目录
path.config: /usr/local/elk/logstash/conf.d
# logstashIP地址
http.host: "127.0.0.1"
# logstash端口
http.port: 9623
4.3 启动
$ cd /usr/local/elk/logstash/bin
# -f 以指定的配置文件守护式启动
$ nohup ./logstash -f /usr/local/elk/logstash/conf.d/logstash.yml &

5.Filebeat

5.1 安装
# 解压
$ tar -zxvf filebeat-7.12.1-linux-x86_64.tar.gz -C /usr/local/elk
# 修改解压问价夹
$ mv filebeat-7.12.1 filebeat
5.2 配置

创建后续测试的文本文件

# 创建目录
$ cd /usr/local/elk
$ mkdir temp
$ cd temp
# 创建文件
$ touch test01.txt
$ touch test02.txt

filebeat.yml配置

$ cd /usr/local/elk/filebeat
$ vim filebeat.yml

增改以下配置:

# ============================== Filebeat inputs ===============================

# 配置filebeat的日志来源(也可以理解为filebrat所监听的文件,当监听文件有改用时,filebeat就会收集日志,传输入logstash)
filebeat.inputs:

# 文件类型(log表示日志文件),支持多个配置 
- type: log
  # 更改为true以启用此prospectors配置
  enabled: true
  # 监听文件路径,支持通配符
  paths:
    - /usr/local/elk/temp/test*.txt
	

# ------------------------------ Logstash Output -------------------------------
# 定义filebeat传输目标
# 将文件的监听日志传输到logstash
output.logstash:
  # 端口必须5044,与logstash我们所自定义的传输通道端口相同
  hosts: ["localhost:5044"]
5.3 启动
$ cd /usr/local/elk/filebeat
# 指定配置文件所启动
$ ./filebeat -c filebeat.yml
5.4 BUG

Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties
[2019-12-26T07:31:29,884][WARN ][logstash.config.source.multilocal] Ignoring the ‘pipelines.yml’ file because modules or command line options are specified
[2019-12-26T07:31:30,007][FATAL][logstash.runner ] Logstash could not be started because there is already another instance using the configured data directory. If you wish to run multiple instances, you must change the “path.data” setting.
[2019-12-26T07:31:30,026][ERROR][org.logstash.Logstash ] java.lang.IllegalStateException: Logstash stopped processing because of an error: (SystemExit) exit

原因:之前运行的filebeat instance有缓冲,保存在path.data里面有.lock文件,删除掉就可以。

解决

$ cd /usr/local/elk/filebeat/data
# 查看.lock文件,点[.]开头的文件都是隐藏文件,需要 -a才能展示
$ ls -a
# 删除文件后,重新启动即可
$ rm -rf .lock

三、ELK的使用测试

建立按顺序启动ESKibanaLogStashFileBeat后,去增删改我们创建的test01.txt文件;FileBeat会收集日志传输到LogStash,经处理后传输到ES

开发人员通过Kibana通过在LogStash中自定义数据传输管道时,配置的ES索引即可查看日志数据。

在搭建过程中还是遇到了许多坑,还是耗费两天时间搭建出来了;遇到问题多去查看官方文档,基本上都能找到答案。(保持初心,沉淀自己)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐