ELK近实时日志分析搜索系统

ELK简介

ELK 是 Elasticsearch、Logstash、Kibana 三大开源框架的首字母大写简称。市面上也被称为Elastic Stack。其中 Elasticsearch 是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用 Elasticsearch作为底层支持的框架,可见 Elasticsearch 提供的搜索能力确实强大,市面上很多时候我们称Elasticsearch 为 es。Logstash 是 ELK 的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/Redis/Elasticsearch/Kafka等)。Kibana 可以将 Elasticsearch 的数据通过友好的页面展示出来,提供实时分析的功能。简单来说,ELK就是集数据收集、传输、存储、分析、告警为一体的近实时日志分析搜索系统。

elasticsearch

E – Elasticsearch(存储,查询),分布式数据搜索引擎,基于Apache Lucene实现,可集群,提供数据的集中式存储,分析,以及强大的数据搜索和聚合功能。

logstash

L – logstash(收集),数据收集引擎,相较于Filebeat比较重量级,但它集成了大量的插件,支持丰富的数据源收集,对收集的数据可以过滤,分析,格式化日志格式。

kibana

K – kibana(展示),数据的可视化平台,通过该web平台可以实时的查看 Elasticsearch 中的相关数据,并提供了丰富的图表统计功能。

ELK架构

nginx+fliebeat --> kafka (消息缓存队列) – > elk or (数据库) --> mysql

在这里插入图片描述

(此图未引入kafka消息缓存队列,使用缓存队列主要是解决数据安全与均衡Logstash与Elasticsearch负载压力。)

此架构的工作方式大致如下,应用端日志收集器使用Filebeat,Filebeat轻量,占用服务器资源少,所以使用Filebeat作为应用服务器端的日志收集器,一般Filebeat会配合Logstash一起使用,Filebeat收集数据,Logstash过滤数据并将数据推送到Elasticsearch,Elasticsearch存储传入的数据,并提供方法以供查询,这种部署方式也是目前最常用的架构。

ELK的应用场景

  • 应用场景:

    要对大规模的日志进行搜索,进行分析。

  • 例子:

    前端nginx代理集群有5台,这上面都分布了nginx日志。突然当前时间点用户反馈网站访问不了,那我们就要去查看过滤出nginx日志http状态码为404,4xx,5xx的日志。如果使用awk,grep进行操作,那就登录到5台机器上进行操作,然后对结果进行一个合并。这种情况就不适用使用命令行工具去做分析和搜索,这种方法比较麻烦,效率又低,日志量大起来搜索又慢。对于这种情况,我们的日志就要进行集中化管理,集中化分析。如此一来,搭建ELK近实时日志分析搜索系统,无疑是一个好的解决方法。

ELK的安装部署

一、服务器准备

准备四台虚拟机

主机名 IP地址 描述
elasticsearch-1 192.168.220.21 es集群
elasticsearch-2 192.168.220.22 es集群
elasticsearch-3 192.168.220.23 es集群
kibana 192.168.220.20 logstash+kibana
web 192.168.220.105 nginx+filebeat

以及各个软件的安装包(版本都一致),下载地址(官网):https://www.elastic.co/cn/downloads

在这里插入图片描述

二、基础环境配置

ELK主机都需部署(都是如下操作)

1、jdk环境的部署
# 导入jdk安装包
[root@elasticsearch-1 ~]# mkdir /jdk && cd /jdk
[root@elasticsearch-1 jdk]# ls
jdk-8u381-linux-i586.tar.gz
# 解压到当前文件夹
[root@elasticsearch-1 jdk]# tar xf jdk-8u381-linux-i586.tar.gz
[root@elasticsearch-1 jdk]# ls
jdk1.8.0_381  jdk-8u381-linux-i586.tar.gz

# 配置/etc/profile文件
[root@elasticsearch-1 ~]# vim /etc/profile
JAVA_HOME=/jdk/jdk1.8.0_381
JRE_HOME=/jdk/jdk1.8.0_381/jre
PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export PATH JAVA_HOME CLASSPATH JRE_HOME
# 重新加载文件
[root@elasticsearch-1 ~]# source /etc/profile

# 查看是否配置成功
root@elasticsearch-1 jdk]# java -version
-bash: /jdk/jdk1.8.0_381/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
# 此问题是因为少了glibc依赖,所以需要安装依赖
[root@elasticsearch-1 jdk]# yum install glibc.i686 -y
[root@kibana jdk]# java -version
java version "1.8.0_381"
Java(TM) SE Runtime Environment (build 1.8.0_381-b09)
Java HotSpot(TM) Client VM (build 25.381-b09, mixed mode)
2、关闭防火墙和selinux
# 关闭防火墙
[root@elasticsearch-1 ~]# systemctl stop firewalld && systemctl disable  firewalld
# 关闭selinux
[root@elasticsearch-1 ~]# setenforce 0 
[root@elasticsearch-1 ~]# sed -i 's/^SELINUX=enforcing$/SELINUS=disabled/' /etc/selinux/config
3、操作系统参数优化
# 设置进程数和文件句柄数以及内存限制配置
[root@elasticsearch-1 ~]# vim /etc/security/limits.conf
elastic soft memlock unlimited   #不进行内存限制
elastic hard memlock unlimited
elastic soft nofile 65535	     #进行打开文件数限制
elastic hard nofile 65535
elastic soft nproc 65535		 #进行打开文件数限制
elastic hard nproc 65535

# 虚拟内存设置
[root@elasticsearch-1 ~]# vim /etc/sysctl.conf
vm.max_map_count=655350			 #max_map_count文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量
# 执行sysctl -p生效
[root@elasticsearch-1 ~]# sysctl -p

三、ELK的部署

1、elasticsearch

(1) 创建es用户

[root@elasticsearch-1 ~]# useradd elastic
[root@elasticsearch-1 ~]# echo "123456" | passwd --stdin elastic

(2) 解压elasticsearch压缩包

[root@elasticsearch-1 elk]# ls
elasticsearch-8.6.0-linux-x86_64.tar.gz
# 将elasticsearch-8.6.0-linux-x86_64.tar.gz解压到 / 目录下
[root@elasticsearch-1 elk]# tar xf elasticsearch-8.6.0-linux-x86_64.tar.gz -C /
# 授予权限
[root@elasticsearch-1 ~]# chown -R elastic:elastic /elasticsearch-8.6.0/
[root@elasticsearch-1 ~]# ll -d /elasticsearch-8.6.0/
drwxr-xr-x 9 elastic elastic 172 Aug 30 16:01 /elasticsearch-8.6.0/

(3) 创建elasticsearch数据以及日志所存放的目录

[root@elasticsearch-1 ~]# mkdir -p /data/elasticsearch/{data,logs}
# 授予权限
[root@elasticsearch-1 ~]# chown -R elastic:elastic /data/elasticsearch/{data,logs}
[root@elasticsearch-1 ~]# ll /data/elasticsearch/
drwxr-xr-x 5 elastic elastic   87 Sep  4 17:27 data
drwxr-xr-x 2 elastic elastic 4096 Aug 31 09:45 logs

(4) 配置集群间安全访问证书密钥(仅在elasticsearch-1节点上操作即可)

# 签发ca证书
[root@elasticsearch-1 ~]# /elasticsearch-8.6.0/bin/elasticsearch-certutil ca
# 输入该指令后一直回车即可

# 签发节点证书
[root@elasticsearch-1 ~]# /elasticsearch-8.6.0/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
# 输入该指令后一直回车即可

(5) 将证书移至certs目录(仅在elasticsearch-1节点上操作即可)

# 无cert目录就创建(切记需用elastic用户创建)
[root@elasticsearch-1 ~]# mv /elasticsearch-8.6.0/elastic-stack-ca.p12 /elasticsearch-8.6.0/config/certs
[root@elasticsearch-1 ~]# mv /elasticsearch-8.6.0/elastic-certificates.p12 /elasticsearch-8.6.0/config/certs
[root@elasticsearch-1 ~]# scp -r /elasticsearch-8.6.0/config/certs 192.168.220.22:/elasticsearch-8.6.0/config/
[root@elasticsearch-1 ~]# scp -r /elasticsearch-8.6.0/config/certs 192.168.220.23:/elasticsearch-8.6.0/config/

(6) 创建elasticsearch.keystore文件(仅在elasticsearch-1节点上操作即可)

[root@elasticsearch-1 ~]# /elasticsearch-8.6.0/bin/elasticsearch-keystore create
[root@elasticsearch-1 ~]# scp /elasticsearch-8.6.0/config/elasticsearch.keystore 192.168.220.22:/elasticsearch-8.6.0/config/
[root@elasticsearch-1 ~]# scp /elasticsearch-8.6.0/config/elasticsearch.keystore 192.168.220.23:/elasticsearch-8.6.0/config/

(7) 证书权限更新(所有的证书都必须是elastic权限)

[root@elasticsearch-1 ~]# ll /elasticsearch-8.6.0/config/certs/
-rw------- 1 elastic elastic 3596 Aug 29 11:53 elastic-certificates.p12
-rw------- 1 elastic elastic 2672 Aug 29 11:53 elastic-stack-ca.p12
[root@elasticsearch-1 ~]# ll /elasticsearch-8.6.0/config/elasticsearch.keystore
-rw-rw---- 1 elastic elastic 199 Aug 29 11:59 /elasticsearch-8.6.0/config/elasticsearch.keystore

(8) elasticsearch配置文件修改

vim /elasticsearch-8.6.0/config/elasticsearch.yml(添加如下内容)

# 集群名称,三个节点保持一致
cluster.name: zhangjiaxin-es
# 节点名称,一般为主机名,三个节点不一致
node.name: elasticsearch-1
# 节点角色,master表示管理节点,data表示数据节点,该配置中节点既是管理节点,也是数据节点,remote_cluster_client远程集群客户端节点。
node.roles: [master,data,remote_cluster_client]
# 数据存放路径
path.data: /data/elasticsearch/data
# 日志存放路径
path.logs: /data/elasticsearch/logs
# 绑定监听IP
network.host: 192.168.220.21
# 设置对外服务的http端口,默认为9200
http.port: 9200
# #是否允许跨域访问,true表示允许
http.cors.enabled: true
# 设置访问
http.cors.allow-origin: "*"
# 设置节点端口
transport.port: 9300
# 节点发现
discovery.seed_hosts: ["192.168.220.21", "192.168.220.22", "192.168.220.23"]
# 集群初始化时master节点
cluster.initial_master_nodes: ["elasticsearch-1", "elasticsearch-2", "elasticsearch-3"]
# 启用节点上ES的XPACK安全功能,相当于总开关
xpack.security.enabled: true
# 传输层的认证设置
xpack.security.transport.ssl:
  enabled: true
  verification_mode: none
  keystore.path: certs/elastic-certificates.p12
  truststore.path: certs/elastic-certificates.p12

(9) elasticsearch jvm参数配置

# 按照虚机分配的内存配置-Xms和-Xmx,本文中虚机内存为2G,设置-Xms和-Xmx值为1G,为一半
[root@elasticsearch-1 ~]# vim /elasticsearch-8.6.0/config/jvm.options
-Xms1g
-Xmx1g

(10) 将elasticsearch加入systemctl

[root@elasticsearch-1 ~]# vim /usr/lib/systemd/system/elasticsearch.service
[Unit]
Description=elasticsearch
After=network.target

[Service]
Type=forking
User=elastic
ExecStart=/elasticsearch-8.6.0/bin/elasticsearch -d
PrivateTmp=true
# 指定此进程可以打开的最大文件数
LimitNOFILE=65535
# 指定此进程可以打开的最大进程数
LimitNPROC=65535
# 最大虚拟内存
LimitAS=infinity
# 最大文件大小
LimitFSIZE=infinity
# 超时设置 0-永不超时
TimeoutStopSec=0
# SIGTERM是停止java进程的信号
KillSignal=SIGTERM
# 信号只发送给给JVM
KillMode=process
# java进程不会被杀掉
SendSIGKILL=no
# 正常退出状态
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

(11) 启动elasticsearch

[root@elasticsearch-1 ~]# systemctl start elasticsearch && systemctl enable elasticsearch

(12) 设置elasticsearch密码

[root@elasticsearch-1 ~]# /elasticsearch-8.6.0/bin/elasticsearch-setup-passwords interactive

在这里插入图片描述

(13) 查看集群状态

curl -u elastic:123456 http://192.168.220.21:9200/_cat/health?v

在这里插入图片描述

2、kibana

(1) 创建用户

[root@elasticsearch-1 ~]# useradd kibana
[root@elasticsearch-1 ~]# echo "123456" | passwd --stdin kibana
# 程序不以root用户启动

(2) 解压kibana压缩包

[root@kibana kibana]# ls
kibana-8.6.0-linux-x86_64.tar.gz
# 将kibana-8.6.0-linux-x86_64.tar.gz解压到 / 目录下
[root@kibana kibana]# tar xf kibana-8.6.0-linux-x86_64.tar.gz -C /
# 进行授权
[root@elasticsearch-1 ~]# chown -R kibana:kibana /kibana-8.6.0/
[root@kibana ~]# ll /kibana-8.6.0/ -d
drwxr-xr-x. 11 kibana kibana 239 Aug 30 16:09 /kibana-8.6.0/

(3) 修改kibana.yml配置文件

vim /kibana-8.6.0/config/kibana.yml(添加如下内容)

# 语言设置为中文
i18n.locale:  "zh-CN"
# 对外开放端口
server.port: 5601
# 对外开放ip
server.host: "192.168.220.20"
# 服务名称
server.name: "kibana"
# 设置连接elasticsearch集群的hosts
elasticsearch.hosts: ["http://192.168.220.21:9200", "http://192.168.220.22:9200", "http://192.168.220.23:9200"]
# 开启跨集群监控
monitoring.ui.ccs.enabled: true
# 使用kibana_system用户连接elasticsearch集群
elasticsearch.username: "kibana_system"
elasticsearch.password: "220054"
# 设置日志格式以及日志存放地址
logging.appenders.default:
  type: file
  fileName: /data/kibana/logs/kibana.log
  layout:
    type: json

(4) 将kibana加入systemctl

[root@kibana ~]# vim /usr/lib/systemd/system/kibana.service
[Unit]
Description=kibana
After=network.target

[Service]
Type=simple
# 此处需要写你自己kibana启动的用户
User=kibana
# 此处需要写你kibana启动执行文件存放的路径
ExecStart=/kibana-8.6.0/bin/kibana
PrivateTmp=true

[Install]
WantedBy=multi-user.target

(5) 启动Kibana

[root@kibana ~]# systemctl start kibana && systemctl enable kibana

(6) 在浏览器中访问 Kibana

访问地址:http://192.168.220.20:5601/
并输入elastic账号以及密码, 即你在elasticsearch初始化的账号密码

在这里插入图片描述

3、logstash

(1) 解压logstash压缩包

[root@kibana logstash]# ls
logstash-8.6.0-linux-x86_64.tar.gz
# 将logstash-8.6.0-linux-x86_64.tar.gz解压到 / 目录下
[root@kibana logstash]# tar xf logstash-8.6.0-linux-x86_64.tar.gz -C /

(2) 进行logstash测试,查看logstash服务功能运行是否正常

# 在/logstash-8.6.0/config/目录下创建logstash-test.conf配置文件
[root@kibana logstash-8.6.0]# vim config/logstash-test.conf
input {
  # 控制台输入
  stdin {
     id => "my_plugin_id"
  }
}

output {
   # 控制台输出
   stdout {
   }
}

# 执行logstash并指定上述配置文件
[root@kibana logstash-8.6.0]# bin/logstash -f config/logstash-test.conf -t
(如若出现Configuration OK, 则表示logstash服务功能运行正常)

# 上述检查正常后,直接启动logstash测试标准输入和输出,logstash启动以后输入“hello world”、“测试”等进行测试,会得到一个json格式的响应
[root@kibana logstash-8.6.0]# bin/logstash -e 'input { stdin{}} output { stdout{ codec => rubydebug }}'

在这里插入图片描述
在这里插入图片描述
(3) 进行logstash连接elasticsearch测试

首先需在kibana可视化页面创建logstash用户

在这里插入图片描述
并且用户也需要指定用户权限

在这里插入图片描述
设置的权限如下所示

在这里插入图片描述
创建logstash配置文件进行测试

# 在/logstash-8.6.0/config/目录下创建logstash-file.conf配置文件
[root@kibana logstash-8.6.0]# vim config/logstash-file.conf
input {
  # 控制台输入内容作为logstash的输入
  stdin {}
}

output {
    file {
      # 将输出结果也输出在/tmp/logstash-test.log文件下一份
      path => "/tmp/logstash-test.log"
    }
    elasticsearch {
      # 对应elasticsearch的集群,以及对外端口
      hosts => ["192.168.220.21:9200", "192.168.220.22:9200", "192.168.220.23:9200"]
      # 登录
      user => "manager"
      password => "220054"
    }
}

# 执行logstash并指定上述配置文件
[root@kibana logstash-8.6.0]# bin/logstash -f config/logstash-file.conf

控制台输入几个数据

在这里插入图片描述

查看/tmp/logstash-test.log文件内容,以及elasticsearch中的数据

在这里插入图片描述
在这里插入图片描述
数据推送成功,因为在推送elasticsearch时,未指定index,索引默认为log-*,数据将会存放到该index中,如上图所示。

4、使用filebeat+logstash收集nignx数据推送es

(1) 在一台nginx服务器上解压filebeat压缩包

[root@web /filebeat]# ls
filebeat-8.6.0-linux-x86_64.tar.gz
# 将logstash-8.6.0-linux-x86_64.tar.gz解压到 / 目录下
[root@web /filebeat]# tar xf filebeat-8.6.0-linux-x86_64.tar.gz -C /

(2) 设置filebeat配置文件

# 在/filebeat-8.6.0-linux-x86_64目录下修改filebeat.yml文件
[root@web /filebeat-8.6.0-linux-x86_64]# vim filebeat.yml
filebeat.inputs:
# 设置收集类型为log
- type: log
  enabled: true
# 收集nginx日志文件/usr/local/nginx/logs/access.log的内容
  paths:
   - nginx日志文件/usr/local/nginx/logs/access.log
 
output.logstash:
# 内容输出到对应192.168.220.20对应的5044端口上
  hosts: ["192.168.220.20:5044"]
  enabled: true
# 间隔为5s
  keep_alive: 5s

(3) 设置logstash配置文件

# 在/logstash-8.6.0/config/目录下创建logstash-es-test.conf配置文件
[root@kibana logstash-8.6.0]# vim config/logstash-es-test.conf
input {
  # 从filebeat取数据,端口与filebeat配置文件一致,对外暴露5044端口接受数据
  beats {
    port => "5044"
  }
}

output {
  # 输出到es集群中,并创建名称为nginx-%{+YYYY.MM.dd}的index索引
  elasticsearch {
    hosts => ["http://192.168.220.21:9200", "http://192.168.220.22:9200", "http://192.168.220.23:9200"]
    index => "nginx-%{+YYYY.MM.dd}"
    user => "manager"
    password => "220054"
  }
}

(4) 启动(需先启动logstash开启5044端口后,再启动filebeat)

# 启动logstash
[root@kibana ~]# /logstash-8.6.0/bin/logstash -f /logstash-8.6.0/config/logstash-es-test.conf

# 启动filebeat
[root@web ~]# /filebeat-8.6.0-linux-x86_64/filebeat -c /filebeat-8.6.0-linux-x86_64/filebeat.yml

(5) 访问nginx服务器的web服务

在这里插入图片描述
(6) 查看elasticsearch是否存在nginx-%{+YYYY.MM.dd}索引

在这里插入图片描述
(7) 最后查看索引中的数据

在这里插入图片描述
可以看到nginx服务的日志数据已到达elasticsearch,到此,ELK的简单部署已完成。如若想看接下来的扩展以及进阶内容,那就请敬请期待更新吧。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐