一、ELK介绍
ELK简介 ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。
Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。主要负责将日志索引并存储起来,方便业务方检索查询。
Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。是一个日志收集、过滤、转发的中间件,主要负责将各条业务线的各类日志统一收集、过滤后,转发给 Elasticsearch 进行下一步处理。
Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
二、elasticsearch实战
1.elasticsearch简介
Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene? 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:
1.分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。 2.实时分析的分布式搜索引擎。 3.可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。
2.elasticsearch安装与配置
server2/3/4安装软件
软件下载:https://elasticsearch.cn/download/ 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.6/index.html
安装软件: rpm -ivh jdk-8u171-linux-x64.rpm rpm -ivh elasticsearch-7.6.1-x86_64.rpm //7.6版本自带jdk
设置服务自启: systemctl daemon-reload systemctl enable elasticsearch
在下载软件后,修改配置文件:
vim /etc/elasticsearch/elasticsearch.yml
17 cluster.name: my-es //集群名称
23 node.name: server2 //主机名,需要解析
33 path.data: /var/lib/elasticsearch //数据目录
37 path.logs: /var/log/elasticsearch //日志目录
43 #bootstrap.memory_lock: true //锁定内存,内存小时千万不要开(我这里不开了)
55 network.host: 172.25.254.2 //主机IP
59 http.port: 9200 //http服务端口
68 discovery.seed_hosts: ["server2", "server3", "server4"] //集群中包含的节点
72 cluster.initial_master_nodes: ["server2", "server3", "server4"] //集群中的master节点(在启动这个集群的时候要找一个引导节点 derver2、3、4都可以成为引导节点)
上述在server2上已经做出下载及相应配置,此时要在server 3、4上做相同的配置,我们直接复制相关文件过去即可:
[root@server2 ~]# scp elasticsearch-7.6.1-x86_64.rpm server3:~
[root@server2 ~]# scp elasticsearch-7.6.1-x86_64.rpm server4:~
然后修改相应参数即可。
systemctl enable --now elasticsearch ## 设置服务自启
cat /var/log/elasticsearch/my-es.log
由下图可知,9300端口是节点之间用来通信的端口,ES集群之间是通过9300进行通讯。 并且 他会在三个节点中选一个当master(当然每个节点都有成为master的可能,他会自行选举),现在是分布式的节点,down一个,其他三个还都能用。 此时 三台机器的elasticsearch.service均已启动,现在我们需要一个图形来管理这个集群,当然用命令行也可以去控制,并且官方也给出了文档,(https://www.elastic.co/guide/en/elasticsearch/reference/7.6/cluster-health.html) 类似于下图,有好多API文档 都是关于管理的,可以自行查看:
3.elasticsearch图形化插件安装——elasticsearch-head
1.安装
上面我们也介绍到了:ealsticsearch只是后端提供各种api,那么怎么直观的使用它呢?elasticsearch-head将是一款专门针对于elasticsearch的客户端工具。
安装elasticsearch-head插件
安装docker镜像或者通过github下载elasticsearch-head项目都是可以的,1或者2两种方式选择一种安装使用即可
1. 使用docker的集成好的elasticsearch-head
# docker run -p 9100:9100 mobz/elasticsearch-head:5
docker容器下载成功并启动以后,运行浏览器打开http://localhost:9100/
2. 使用git安装elasticsearch-head
# yum install -y npm
# git clone git://github.com/mobz/elasticsearch-head.git
# cd elasticsearch-head
# npm install
# npm run start
检查端口是否起来
netstat -antp |grep 9100
浏览器访问测试是否正常
http://IP:9100/
下面介绍详细的安装步骤:
官方文档:https://gitcode.net/mirrors/mobz/elasticsearch-head?utm_source=csdn_github_accelerator
下载elasticsearch-head插件:
# wget https://github.com/mobz/elasticsearch-head/archive/master.zip
# unzip elasticsearch-head-master.zip
head插件本质上是一个nodejs的工程(其实就是前端),因此需要安装node:
# wget https://mirrors.tuna.tsinghua.edu.cn/nodesource/rpm_9.x/el/7/x86_64/nodejs-9.11.2-1nodesource.x86_64.rpm
# rpm -ivh nodejs-9.11.2-1nodesource.x86_64.rpm
# node -v
# npm -v
更换npm源安装
cd elasticsearch-head-master/
npm install --registry=https://registry.npm.taobao.org ##更换为国内淘宝的镜像源,不然安装的时候会很慢
当然中途遇到一个软件从github上下载 特别慢,所以我们直接按照下图所示安装即可:
修改ES集群的主机ip和端口(入口):任何节点都可以,这里以server2为例
# vim elasticsearch-head-master/_site/app.js
4388 "http://172.25.254.2:9200"
上面的修改代表这个插件(简单服务)和我们的es集群是相互独立的,因为它是通过http端口来访问的,不一定要安装在一个节点上,完全可以再开一台机器来运行它。
启动head插件
# npm run start & ##必须在elasticsearch-head-master目录里面运行,不然就得不到里面的依赖文件了
下图也展示了,9100端口已经起来了。
端口监听:通过某一端口来提供某一项服务。ip上有某一个接口,说明该程序在运行,没有就说明该程序没在运行。 我们可以把端口理解为 程序对外开放的接口。
接下来,修改ES跨域主持(server2/3/4三个节点都要设置)
#vim /etc/elasticsearch/elasticsearch.yml
http.cors.enabled: true # 是否支持跨域
http.cors.allow-origin: "*" # *表示支持所有域名
最后,重启ES服务
# systemctl restart elasticsearch.service
因上上面设置监听了本机所有端口,所以可以直接通过localhost来访问9200端口:
2.测试
在server2中添加数据
由上图可知:Server3、4上是有一个索引的,刚刚我们创建的index,数据存在3和4上,默认情况下server2也是可以存储的,可以看到 每个节点的节点状态都是一样的,但是在生产环境里面我们会将他们做一个区分,这样更利于集群的运行。(不然server2既要管理集群,又要存储数据,压力蛮大的,所以我们让节点各司其职就好了)
4.elasticsearch图形化插件安装——cerebro
可以使用docker部署cerebro。在Redhat8上,podman作为docker的完美替代,运行cerebro容器,可以用来管理ES集群节点。
项目地址:https://gitcode.net/mirrors/lmenezes/cerebro?utm_source=csdn_github_accelerator
在宿主机<172.25.254.50>上运行cerebro镜像。
podman search cerebro
podman load -i /home/westos/Desktop/cerebro.tar
podman run -d --name cerebro -p 9000:9000 docker.io/lmenezes/cerebro
以上两个插件都是非常好的,根据个人喜好选择一即可。
5.elasticsearch节点角色
Master | 主要负责集群中索引的创建、删除以及数据的Rebalance等操作。Master不负责数据的索引和检索,所以负载较轻。当Master节点失联或者挂掉的时候,ES集群会自动从其他Master节点选举出一个Leader。 |
---|
Data Node | 主要负责集群中数据的索引和检索,一般压力比较大 | Coordinating Node(提取节点) | 原来的Client node的,负责处理所有来自客户端的请求以及返回给客户端的响应结果,默认情况下每个node都是协调节点。主要功能是来分发请求和合并结果的。所有节点默认就是Coordinating node,且不能关闭该属性。 | Ingest Node(协调节点) | 专门对索引的文档做预处理 |
如果将node按功能分配角色:master node处理主节点事务、data node保存数据、ingest node进行数据预处理,那么coordinating node则是 route 客户端请求、处理搜索数据整合阶段并且分配批量索引操作 bulk indexing。
6.elasticsearch节点优化
在生产环境下,如果不修改elasticsearch节点的角色信息,在高数据量,高并发的场景下集群容易出现脑裂等问题。所以,在生产环境下,我们一般会把密集型计算的应用,尽量的区分开,保证它们之间尽量不要产生冲突,要是放在一起的话 绝对会产生争抢资源的情况, 默认情况下,elasticsearch集群中每个节点都有成为主节点的资格,也都存储数据,还可以提供查询服务。 节点角色是由以下属性控制:( 默认情况下这些属性的值都是true。) node.master: false|true node.data: true|false node.ingest: true|false search.remote.connect: true|false
node.master | 这个属性表示节点是否具有成为主节点的资格注意:此属性的值为true,并不意味着这个节点就是主节点。因为真正的主节点,是由多个具有主节点资格的节点进行选举产生的。 |
---|
node.data | 这个属性表示节点是否存储数据。 | node.ingest | 是否对文档进行预处理。 | search.remote.connect | 是否禁用跨集群查询 |
1.第一种组合:(默认)
node.master: true node.data: true node.ingest: true search.remote.connect: true 这种组合表示这个节点即有成为主节点的资格,又存储数据。 如果某个节点被选举成为了真正的主节点,那么他还要存储数据,这样对于这个节点的压力就比较大了。 测试环境下这样做没问题,但实际工作中不建议这样设置。
2.第二种组合:(Data node)
node.master: false node.data: true node.ingest: false search.remote.connect: false 这种组合表示这个节点没有成为主节点的资格,也就不参与选举,只会存储数据。 这个节点称为data(数据)节点。在集群中需要单独设置几个这样的节点负责存储数据。后期提供存储和查询服务。
3.第三种组合:(master node)
node.master: true node.data: false node.ingest: false search.remote.connect: false 这种组合表示这个节点不会存储数据,有成为主节点的资格,可以参与选举,有可能成为真正的主节点。 这个节点我们称为master节点。
4.第四种组合:(Coordinating Node)
node.master: false node.data: false node.ingest: false search.remote.connect: false 这种组合表示这个节点即不会成为主节点,也不会存储数据, 这个节点的意义是作为一个协调节点,主要是针对海量请求的时候可以进行负载均衡。
5.第五种组合:(Ingest Node)
node.master: false node.data: false node.ingest: true search.remote.connect: false 这种组合表示这个节点即不会成为主节点,也不会存储数据, 这个节点的意义是ingest节点,对索引的文档做预处理。
生产集群中可以对这些节点的职责进行划分: ??建议集群中设置3台以上的节点作为master节点,这些节点只负责成为主节点,维护整个集群的状态。 ? ??再根据数据量设置一批data节点,这些节点只负责存储数据,后期提供建立索引和查询索引的服务,这样的话如果用户请求比较频繁,这些节点的压力也会比较大。 ? ??所以在集群中建议再设置一批协调节点,这些节点只负责处理用户请求,实现请求转发,负载均衡等功能。
三、logstash数据采集——日志采集/数据预处理
1.logstash简介
2.Logstash安装与配置
(1)软件下载 https://elasticsearch.cn/download/
官方文档 https://www.elastic.co/guide/en/logstash/7.6/index.html
(2)logstash安装
rpm -ivh jdk-8u171-linux-x64.rpm
rpm -ivh logstash-7.6.1.rpm
数据目录在/var/lib/logstash
3.标准输入到标准输出(一般情况下不用这种)
stdin/stdout,表示以命令行的格式,在终端输入什么信息,那么在终端也输出什么(类似一个管道)
/usr/share/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }'
4.file输出插件——标准输入到文件
可以参考官方文档:
input {
stdin {}
}
output {
stdout{}
elasticsearch {
hosts => ["172.25.254.2:9200"] ## 最后要输出到哪里
index => "logstash-%{+YYYY.MM.dd}"
}
}
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf
5.file输入文件-把文件内容输出到es主机
我们将/var/log/messages 定为输入的文件,但是首先要解决其权限问题:
[root@server5 conf.d]# ll /var/log/messages
-rw------- 1 root root 72575 Mar 28 17:01 /var/log/messages
[root@server5 conf.d]# ll -d /var/log/
drwxr-xr-x. 8 root root 248 Mar 28 16:22 /var/log/
[root@server5 conf.d]# chmod 644 /var/log/messages
vim /etc/logstash/conf.d/test.conf
input {
#stdin {}
file {
path => "/var/log/messages"
start_position =>"beginning"
}
}
output {
stdout{}
elasticsearch {
hosts => ["172.25.254.2:9200"]
index => "logstash-%{+YYYY.MM.dd}"
}
}
[root@server5 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf
6.sincedb文件
这里我们将上一个索引删掉,再次运行指令,发现,虽然依旧读取的是/var/log/message文件,但是却没有任何输出了,
[root@server5 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf
下面 我们测试一下他是否还能记录输入的数据,下面显示logstash的输入输出没问题。 但是,与我们规定的逻辑不一致,我们规定的是读取/var/log/message的beginning,但是上图显示的却只有新产生的日志。 但是在生产环境中,如果节点意外重启,它始终会记得上一个进程,也就是logstash读到哪一个地方了,他有这样一个缓存,那么即使重启,也会先读取缓存,然后接着读取即可,以免造成数据冗余。
那么这个缓存文件在什么地方? /usr/share/logstash/data/plugins/inputs/file
[root@server5 conf.d]# cd /usr/share/logstash/
[root@server5 logstash]# ls
bin data Gemfile.lock LICENSE.txt logstash-core-plugin-api NOTICE.TXT vendor
CONTRIBUTORS Gemfile lib logstash-core modules tools x-pack
[root@server5 logstash]# cd data/
[root@server5 data]# ls
dead_letter_queue plugins queue uuid
[root@server5 data]# cd plugins/
[root@server5 plugins]# ls
inputs
[root@server5 plugins]# cd inputs/
[root@server5 inputs]# ls
file
[root@server5 inputs]# cd file/
[root@server5 file]# ls
[root@server5 file]# l .
-bash: l: command not found
[root@server5 file]# l.
. .. .sincedb_452905a167cf4509fd08acb964fdb20c
[root@server5 file]# cat .sincedb_452905a167cf4509fd08acb964fdb20c
51212556 0 64768 616 1648461662.537986 /var/log/messages
[root@server5 file]# pwd
/usr/share/logstash/data/plugins/inputs/file
[root@server5 file]# rm -f .sincedb_452905a167cf4509fd08acb964fdb20c
[root@server5 file]# cd
sincedb文件内容解释: ??cat .sincedb_452905a167cf4509fd08acb964fdb20c ??20297 0 64768 119226 1551859343.6468308 /var/log/messages ?sincedb文件一共6个字段 ??1.inode编号 ??2.文件系统的主要设备号 ??3.文件系统的次要设备号 ??4.文件中的当前字节偏移量 ??5.最后一个活动时间戳(浮点数) ??6.与此记录匹配的最后一个已知路径
那么 如果我们将sincedb文件删除,那么logstash就会重新从头读取文件。
7.Syslog输入插件——实现简单的日志采集及管理
logstash可以伪装成日志服务器,直接接受远程日志。其他节点只需要配置一下rsyslog,就会自动把你的日志传过去了。
input {
#stdin {}
#file {
# path => "/var/log/messages"
# start_position =>"beginning"
#}
syslog {}
}
output {
stdout{}
elasticsearch {
hosts => ["172.25.254.2:9200"]
index => "syslog-%{+YYYY.MM.dd}"
}
}
[root@server5 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf
服务起来以后,会自动开一个端口,用来接收日志: 然后,配置客户端传入日志:(把日志发过去)
[root@server3 ~]# vim /etc/rsyslog.conf
15 $ModLoad imudp
16 $UDPServerRun 514
92 *.* @@172.25.254.5:514 //所有日志发送到server5的514端口
[root@server3 elasticsearch]# systemctl restart rsyslog.service
8.多行过滤插件——多行过滤可以把多行日志记录合并为一行事件
针对多行日志表示的单个事件,如果按照之前的方法上传到ES后,会分别按多行显示出来,无法分析多行日志表示的意思,因此需要通过“多行过滤”将多个日志记录合并为一行事件。
首先,编辑配置文件</etc/logstash/conf.d/file.conf>:
vim /etc/logstash/conf.d/file.conf
input {
#stdin {}
file {
path => "/var/log/my-es.log"
start_position =>"beginning"
codec => multiline {
pattern => "^\["
negate => "true"
what => "previous"
}
}
syslog {}
}
output {
stdout{}
elasticsearch {
hosts => ["172.25.254.2:9200"]
index => "eslog-%{+YYYY.MM.dd}"
}
}
[root@server5 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf
最后,在server5终端和浏览器上查看:
9.grok过滤插件
(1)grok简介
官方文档: https://www.elastic.co/guide/en/logstash/7.6/plugins-filters-grok.html
grok是Logstash最重要的插件之一,用于将非结构化数据解析为结构化和可查询的数据。即将一个key对应的一长串非结构化的value,转成多个结构化的key-value。
从数据分析的角度:非结构化数据不便于检索、统计、分析。 非结构化数据变成结构化数据后才有检索、统计、分析的价值。
Grok是将非结构化日志数据解析为结构化和可查询内容的好方法。
下图是官方给出的例子: (2)grok插件的具体使用
[root@server5 html]# yum install -y httpd
[root@server5 html]# echo www.westos.org > index.html
[root@server5 html]# systemctl start httpd
[root@server5 html]# curl localhost
www.westos.org
压力测试的结果是以下面的方式呈现的,这很不科学。
response 200表明该请求被成功地完成,所请求的资源发送到客户端。
这都是httpd响应状态码
|