ELK DEMO

ELK简介

ElasticSearch:是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制, restful风格接口,多数据源,自动搜索负载等。

Logstash:是一个完全开源的工具,他可以对你的日志进行收集,分析,并将其存储供以后使用。

Kibana:也是一个开源和免费的工具, Kibana可以为Logstash和ElasticSearch提供友好的Web界面,可以帮助汇总、分析和搜索重要的数据日志。

ELK协议栈

ELK-1

ELK其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写。这三款软件都是开源软件,通常是配合使用,故被简称为ELK协议栈。

在需要收集日志的所有服务器上部署Logstash,Logstash收集应用服务器产生的日志,将日志收集在一起,交给全文搜索服务ElasticSearch,而Kibana则从ElasticSearch集群中查询数据生成图表,再返回给客户端浏览器。

ElasticSearch概述

ElasticSearch是一个实时分布式搜索和分析引擎。现在大部分数据库在提取可用知识方面显得异常无能,它们能够通过时间戳或者精确匹配做过滤查询,但是它们不能够进行全文搜索,不能处理同义词,以及根据相关性给文档打分。而ElasticSearch能根据同一份数据生成分析和聚合结果,更重要的是,它们在没有大量工作进程(线程)的情况下能做到对数据的实时处理。

ElasticSearch安装部署

  1. 下载安装包到指定的目录

    安装包路径为:https://www.elastic.co/cn/elasticsearch/

  2. 修改配置文件

    修改config目录下的elasticsearch.yml文件,主要修改内容如下:

    #配置ElasticSearch的集群名称,ElasticSearch会自动发现同一网段下的ElasticSearch节点,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。
    cluster.name: my-application
    #节点名称。
    node.name: node-1
    #设置索引数据的存储路径。
    path.data: /path/to/data
    #设置日志的存储路径。
    path.logs: /path/to/log
    #设置当前的IP地址。
    network.host: 192.168.10.228
    #设置对外服务的HTTP端口。
    http.port: 9200
    #配置种子主机列表,来进行节点发现,文件配置方式为主机ip,主机ip:端口,也可以使用主机名配置。
    #discovery.seed_hosts:
    #此处测试环境为单节点,所以增加“discovery.type: single-node”这个配置。
    discovery.type: single-node
    #当你开启新的集群是生产模式,你必须明确列出首次选举中符合主机资格的节点,使用该参数设置,单节点无必要。
    #cluster.initial_master_nodes: ["node-1"]
    
  3. 创建非root用户

    因为安全问题,必须使用非root用户运行此服务,具体操作如下:

    useradd es -m
    passwd <输入es>
    chown -R es:es /home/xiyulong/elasticsearch-7.13.4
    chown -R es:es /path/to/data
    chown -R es:es /path/to/log
    
  4. 运行命令

    在bin目录下运行下面的命令:

    ./elasticsearch
    
  5. 访问ElasticSearch

    在浏览器访问http://172.20.149.3:9200/(172.20.149.3是192.168.10.228的浮动ip),出现如下界面说明ElasticSearch启动成功。

    ELK-2

Kibana概述

Kibana是一个开源的分析和可视化平台,旨在与Elasticsearch合作,Kibana可搜索和查看存储在Elasticsearch索中的数据。开发者或运维人员可以轻松地执行高级数据分析。

Kibana安装部署

  1. 下载安装包到指定的目录

    安装包路径为:https://www.elastic.co/cn/kibana/

  2. 修改配置文件

    修改config目录下的kibana.yml文件,主要修改内容为:

    #设置对外服务的HTTP端口。
    server.port: 5601
    #设置当前的IP地址。
    server.host: "192.168.10.228"
    #设置连接ElasticSearch的地址
    elasticsearch.hosts: ["http://192.168.10.228:9200"]
    
  3. 创建非root用户

    因为安全问题,必须使用非root用户运行此服务,与上面的ElasticSearch操作类似。

  4. 运行命令

    在bin目录下运行下面的命令:

    ./kibana
    
  5. 访问Kibana

    在浏览器访问http://172.20.149.3:5601/,出现如下界面说明Kibana启动成功。

    ELK-3

Logstash概述

Logstash是一个开源的数据收集引擎,它具备实时数据传输能力。它可以统一过滤来自不同源的数据,并按照开发者的制定的规范输出到目的地。

Logstash组成结构

Logstash通过管道进行运作,管道有两个必要的元素,输入和输出,还有一个可选的元素 - 过滤器。输入插件从数据源获取数据,过滤器插件根据用户指定的数据格式修改数据,输出插件则将数据写入到目的地。

ELK-4

Logstash安装部署

  1. 下载安装包到指定目录

    安装包的路径为https://www.elastic.co/cn/kibana/

  2. 修改配置文件

    在logstash-7.13.4/config目录下定义自己的配置文件,如下:

    input {
        file {
            path => "/var/log/rte.log" #log文件的路径
            type => "rte.log"
        }
    }
    
    output {
        elasticsearch {
            hosts => "192.168.10.228:9200" #连接Elasticsearch的地址
            index => "rte.log"
        }
    }
    
  3. 运行命令

    在bin目录下运行下面的命令,将日志推送到ElasticSearch模块。

    ./logstash -f ../config/rte.log.conf
    
  4. 访问Logstash

    访问http://172.20.149.3:9200/_cat/indices?v可看到已存储的日志如下,其中有index为rte.log的日志。

    ELK-5

    访问http://172.20.149.3:9200/rte.log/_search可看到该index下的具体日志内容。

    ELK-6

在Kibana中显示日志

  1. 环境说明

    在一台服务器中按上述步骤已部署好环境,日志已推送成功。

  2. 创建Index patterns

    • 首先访问http://172.20.149.3:5601/进入Kibana的图形界面。

      ELK-3

    • 点击左侧的Stack Management。

      ELK-7

    • 点击左侧的Index Patterns。

      ELK-8

    • 点击Create Index Patterns。

      ELK-9

    • 在Index pattern name搜索框中输入rte.log,索引到已上传的日志文件,再点击Next step。

      ELK-10

    • 在Time field中选择@timestamp,然后点击Create index pattern,至此Index Patterns创建结束,可以去过滤日志。

      ELK-11

  3. 进入Discover显示日志

    • 点击Analytics下的Discover。

      ELK-12

    • 进入到日志显示界面后,可看到输入的日志信息,可按时间去显示上传的日志。

      ELK-13

过滤日志DEMO

DEMO1-过滤upstream到downstream的信息

  1. 先过滤出所有的DEBUG信息,选择Field为message(因为日志信息都在message里面),Operator为is(标识只命中这一个条件),Value输入为DEBUG。

    ELK-14

    这样,所有的DEBUG信息就被过滤了出来。

    ELK-15

  2. 根据源目IP过滤出这条流,选择Field为message,Operator为is one of(标识命中其中之一就能过滤出来),Values中输入srcip:192.168.20.74,dstip:192.168.30.116。

    ELK-16

    这样,DEBUG日志中标有这样源目IP的信息就被过滤出了。

    ELK-17

  3. 通过上面的过滤可以过滤出很多的包,根据index过滤出这条流的其中一个包,新增过滤条件,Field选择为message,Operator选择为is,value输入index:6。

    ELK-18

    这样index为6的这个包就被过滤了出来。

    ELK-19

  4. 在第二个过滤条件中再增加from portname:0000:00:04.0这个选项,就可以将这整 个包的流程给过滤出来。

    ELK-20

    过滤内容如下。

    ELK-21

    ELK-22

DEMO2-过滤upstream到lbp的信息

过滤方法与上面完全一致,只是配置了route规则后,流转方向发生了变化,取就近的index过滤,日志内容如下。

ELK-23

ELK-24

日志说明

  • 上面的日志按先后顺序应该是recv、scatter、flow和send。

  • recv日志在端口收包时采集,主要标识了该模块的线程(thread字段表示)、从哪个端口进的包(from portname字段表示)、该包的索引(index字段表示)、源目ip(srcip和dstip字段表示)和协议类型(proto-type字段表示)。

  • scatter日志在对收到的报文进行初步分发时采集,标识了该模块的线程(thread字段表示)、最初从哪个端口进的包(from portname字段表示)、该包的索引(index字段表示)、流转方向(traffic-direction字段表示)、协议类型(proto-type字段表示)和分发到的ring(to_ring字段表示)。

  • flow日志表示进行规则查询后,去确定最终的一个转发方向,与scatter日志的字段完全一致,重点要关注流转方向(traffic-direction字段表示)和分发到的ring(to_ring字段表示),看这条报文最终要被转发到哪里,upstream口往downstream口或lbp口的转发的主要区别就在这里,从上面过滤的日志可以看到,upsream口往downstream口发包时,traffic-direction字段为FROM UPSTR TO ENGRESS,to-ring字段为PORT_1_IO_ANY,upsream口往lbp口发包时,traffic-direction字段为TO LBP,to-ring字段为PORT_2_IO_ANY。

  • send日志在将报文发出设备时采集,标识了该模块的线程(thrad字段表示),进包口和出包口(from portname字段和to portname字段表示),该包的索引(index字段表示),收包的ring(from ring字段表示)。

排错帮助

  • 若往设备upstream口发包后一条recv报文都看不到,说明在设备网卡处已将报文丢掉或者前端的发包设备有问题,可以逐步排查。

  • 若配置规则后,没有按规则转发,可以先查报错信息,若无报错重点关注对应flow日志的转发方向,看这条报文去了哪里。

  • 若往设备upstream口发包后只有recv日志,没有后续日志,可以先排查有无报错信息,若无报错去看后续ring的enqueue和dequeue数目是否一致,是否在此产生了丢包。

  • 同样缺少后续环节的日志,都可以先去查报错信息,若无报错都可能是在后续的ring中产生了丢包,可以按照上面给的思路去排查。

过滤参数说明

上述的过滤方式是本次实验的尝试,大家也可自己尝试去过滤其它字段得到需要的日志信息。

ELK服务运行过程中的报错及解决

运行ElasticSearch的报错

  1. JVM虚拟机内存不足

    ELK-25

    解决方法:修改虚拟机内存,vi elasticsearch-7.13.4/config/jvm.options,增加下面配置

    ELK-26

  2. max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

    解决方法:vi /etc/sysctl.conf,增加下面配置,添加完了执行sysctl -p,看结果是不是vm.max_map_count = 262144

    ELK-27