0
点赞
收藏
分享

微信扫一扫

自动规划运维之ELK

穆风1818 2022-03-30 阅读 125

ELK

一、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端口已经起来了。
在这里插入图片描述

接下来,修改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中添加数据
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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节点,对索引的文档做预处理。

三、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文件删除,那么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终端和浏览器上查看:
在这里插入图片描述
在这里插入图片描述

举报

相关推荐

0 条评论