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的应用场景
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的简单部署已完成。如若想看接下来的扩展以及进阶内容,那就请敬请期待更新吧。