ELK介绍及搭建(搭建未使用redis缓冲,后补充))

  • 作者:JetaimeTse
  • 分类:ELK
  • 发表日期:2020-08-29 19:55:00
  • 阅读(44)
  • 评论(0)

ELK介绍

简介

​ ELK是Elasticsearch、Logstash、Kibana的简称 ,这是ELK的核心组件,但不是全部。不同的架构用到的组件是不同的。

  • Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能,是一套开发REST和JAVA API,提供高效搜素功能,可拓展的分布式系统。它构建于Apache Lucene搜索引擎库之上。
  • logstash时一个开源的数据收集引擎,具备实时数据传输能力。由于日志文件来源多(如:系统日志、服务器日志、tomcat日志、nginx日志等),且内容杂乱,不便于人类进行观察。而logstash可以统一搜集过滤不同源的数据,并按照开发者制定的规范输出到目的地,变成可读性高的内容,且支持正则表达式。
  • Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许以特殊的方式查询和过滤数据。
  • Beats。目前Beats包含四种工具:
    • Packetbeat(搜集网络流量数据);
    • Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据);
    • Filebeat(搜集文件数据);
    • Winlogbeat(搜集 Windows 事件日志数据)

为什么使用ELK

​ 一般我们需要分析日志文件时,直接在日志文件中grep相关字段就能获得自己想要的信息。但是在规模较大的场景中,这种方法效率显得低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。

​ 一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。

​ 一个完整的集中式日志系统,需要包含以下几个主要特点:

  • 收集-能够采集多种来源的日志数据;
  • 传输-能够稳定的把日志数据传输到中央系统;
  • 存储-如何存储日志数据;
  • 分析-可以支持 UI 分析;
  • 警告-能够提供错误报告,监控机制;

​ ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。


Elasticsearch

基本概念

  • node:即一个 Elasticsearch 的运行实例,使用多播或单播方式发现 cluster 并加入。
  • cluster:包含一个或多个拥有相同集群名称的 node,其中包含一个master node。
  • index:类比关系型数据库里的DB,是一个逻辑命名空间。
  • alias:可以给 index 添加零个或多个alias,通过 alias 使用index 和根据index name 访问index一样,但是,alias给我们提供了一种切换index的能力,比如重建了index,取名customer_online_v2,这时,有了alias,我要访问新 index,只需要把 alias 添加到新index 即可,并把alias从旧的 index 删除。不用修改代码。
  • type:类比关系数据库里的Table。其中,一个index可以定义多个type,但一般使用习惯仅配一个type。
  • mapping:类比关系型数据库中的 schema 概念,mapping 定义了 index 中的 type。mapping 可以显示的定义,也可以在 document 被索引时自动生成,如果有新的 field,Elasticsearch 会自动推测出 field 的type并加到mapping中。
  • document:类比关系数据库里的一行记录(record),document 是 Elasticsearch 里的一个 JSON 对象,包括零个或多个field。
  • field:类比关系数据库里的field,每个field 都有自己的字段类型。
  • shard:是一个Lucene 实例。Elasticsearch 基于 Lucene,shard 是一个 Lucene 实例,被 Elasticsearch 自动管理。之前提到,index 是一个逻辑命名空间,shard 是具体的物理概念,建索引、查询等都是具体的shard在工作。shard 包括primary shard 和 replica shard,写数据时,先写到primary shard,然后,同步到replica shard,查询时,primary 和 replica 充当相同的作用。replica shard 可以有多份,也可以没有,replica shard的存在有两个作用,一是容灾,如果primary shard 挂了,数据也不会丢失,集群仍然能正常工作;二是提高性能,因为replica 和 primary shard 都能处理查询。

Logstash

​ Logstash事件处理有三个阶段:inputs → filters → outputs。是一个接收,处理,转发日志的工具。支持系统日志,webserver日志,错误日志,应用日志,总之包括所有可以抛出来的日志类型。

Input

输入数据到logstash,一些常用的输入为:

  • file:从文件系统的文件中读取,类似于tial -f命令;
  • syslog:在514端口上监听系统日志消息,并根据RFC3164标准进行解析;
  • redis:从redis service中读取;
  • beats:从filebeat中读取;

Filters

数据中间处理,对数据进行操作,一些常用的过滤器为:

  • grok:解析任意文本数据,Grok 是 Logstash 最重要的插件。它的主要作用就是将文本格式的字符串,转换成为具体的结构化的数据,配合正则表达式使用。内置120多个解析语法。

官方提供的grok表达式,grok在线调试

  • mutate:对字段进行转换。例如对字段进行删除、替换、修改、重命名等。
  • drop:丢弃一部分events不进行处理。
  • clone:拷贝 event,这个过程中也可以添加或移除字段。
  • geoip:添加地理信息(为前台kibana图形化展示使用)

Outputs

outputs是logstash处理管道的最末端组件。一个event可以在处理过程中经过多重输出,但是一旦所有的outputs都执行结束,这个event也就完成生命周期。一些常见的outputs为:

  • elasticsearch:可以高效的保存数据,并且能够方便和简单的进行查询。
  • file:将event数据保存到文件中。
  • graphite:将event数据发送到图形化组件中,一个很流行的开源存储图形化展示的组件。

Codecs

codecs 是基于数据流的过滤器,它可以作为input,output的一部分配置。Codecs可以帮助你轻松的分割发送过来已经被序列化的数据。一些常见的codecs:

  • json:使用json格式对数据进行编码/解码。
  • multiline:将汇多个事件中数据汇总为一个单一的行。比如:java异常信息和堆栈信息。

Kibana

​ Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。可以用kibana搜索、查看、交互存放在Elasticsearch索引里的数据,使用各种不同的图表、表格、地图等kibana能够很轻易地展示高级数据分析与可视化。


Filebeat

​ Filebeat由两个主要组件组成:prospectors 和 harvesters。这两个组件协同工作将文件变动发送到指定的输出中。

Harvester

​ Harvester负责读取单个文件内容。每个文件会启动一个Harvester,每个Harvester会逐行读取各个文件,并将文件内容发送到制定输出中。Harvester负责打开和关闭文件,意味在Harvester运行的时候,文件描述符处于打开状态,如果文件在收集中被重命名或者被删除,Filebeat会继续读取此文件。所以在Harvester关闭之前,磁盘不会被释放。默认情况filebeat会保持文件打开的状态,直到达到close_inactive(如果此选项开启,filebeat会在指定时间内将不再更新的文件句柄关闭,时间从harvester读取最后一行的时间开始计时。若文件句柄被关闭后,文件发生变化,则会启动一个新的harvester。关闭文件句柄的时间不取决于文件的修改时间,若此参数配置不当,则可能发生日志不实时的情况,由scan_frequency参数决定,默认10s。Harvester使用内部时间戳来记录文件最后被收集的时间。例如:设置5m,则在Harvester读取文件的最后一行之后,开始倒计时5分钟,若5分钟内文件无变化,则关闭文件句柄。默认5m)。

Prospector

    filebeat.prospectors: 
        - input_type: log    
          paths:      
            - /apps/logs/*/info.log

​ 负责管理Harvester并找到所有读取源。Prospector会找到/apps/logs/*目录下的所有info.log文件,并为每个文件启动一个Harvester。Prospector会检查每个文件,看Harvester是否已经启动,是否需要启动,或者文件是否可以忽略。若Harvester关闭,只有在文件大小发生变化的时候Prospector才会执行检查。只能检测本地的文件。

filebeat如何记录文件的状态:

​ Filebeat会将文件状态记录在文件中(默认在/var/lib/filebeat/registry)。此状态可以记住Harvester收集文件的偏移量。若连接不上输出设备,如ES等,filebeat会记录发送前的最后一行,并再可以连接的时候继续发送。Filebeat在运行的时候,Prospector状态会被记录在内存中。Filebeat重启的时候,利用registry记录的状态来进行重建,用来还原到重启之前的状态。每个Prospector会为每个找到的文件记录一个状态,对于每个文件,Filebeat存储唯一标识符以检测文件是否先前被收集。Filebeat

如何保证事件至少被输出一次:

​ Filebeat之所以能保证事件至少被传递到配置的输出一次,没有数据丢失,是因为filebeat将每个事件的传递状态保存在文件中。在未得到输出方确认时,filebeat会尝试一直发送,直到得到回应。若filebeat在传输过程中被关闭,则不会再关闭之前确认所有时事件。任何在filebeat关闭之前确认的时间,都会在filebeat重启之后重新发送。这可确保至少发送一次,但有可能会重复。可通过设置shutdown_timeout 参数来设置关闭之前的等待事件回应的时间(默认禁用)。


ELK架构

​ 第一种ELK架构,是最简单的一种ELK架构方式。优点是搭建简单,易于上手。缺点是Logstash耗资源较大,运行占用CPU和内存高。另外没有消息队列缓存,存在数据丢失隐患。建议供学习者和小规模集群使用。此架构首先由Logstash分布于各个节点上搜集相关日志、数据,并经过分析、过滤后发送给远端服务器上的Elasticsearch进行存储。Elasticsearch将数据以分片的形式压缩存储并提供多种API供用户查询,操作。用户亦可以更直观的通过配置Kibana Web Portal方便的对日志查询,并根据数据生成报表。

img

​ 第二种架构,引入了消息队列机制,位于各个节点上的Logstash Agent先将数据/日志传递给Kafka(或者Redis),并将队列中消息或数据间接传递给Logstash,Logstash过滤、分析后将数据传递给Elasticsearch存储。最后由Kibana将日志和数据呈现给用户。因为引入了Kafka(或者Redis),所以即使远端Logstash server因故障停止运行,数据将会先被存储下来,从而避免数据丢失。这种架构适合于较大集群的解决方案,但由于Logstash中心节点和Elasticsearch的负荷会比较重,可将他们配置为集群模式,以分担负荷,这种架构的优点在于引入了消息队列机制,均衡了网络传输,从而降低了网络闭塞尤其是丢失数据的可能性,但依然存在Logstash占用系统资源过多的问题。

img

​ 第三种架构,引入了Logstash-forwarder。首先,Logstash-forwarder将日志数据搜集并统一发送给主节点上的Logstash,Logstash分析、过滤日志数据后发送至Elasticsearch存储,并由Kibana最终将数据呈现给用户。这种架构解决了Logstash在各计算机点上占用系统资源较高的问题。经测试得出,相比Logstash,Logstash-forwarder所占用系统CPU和MEM几乎可以忽略不计。另外,Logstash-forwarder和Logstash间的通信是通过SSL加密传输,起到了安全保障。如果是较大集群,用户亦可以如结构三那样配置logstash集群和Elasticsearch集群,引入High Available机制,提高数据传输和存储安全。更主要的配置多个Elasticsearch服务,有助于搜索和数据存储效率。但在此种架构下发现Logstash-forwarder和Logstash间通信必须由SSL加密传输,这样便有了一定的限制性。

img

​ 第四种架构,将Logstash-forwarder替换为Beats。经测试,Beats满负荷状态所耗系统资源和Logstash-forwarder相当,但其扩展性和灵活性有很大提高。Beats platform目前包含有Packagebeat、Topbeat和Filebeat三个产品,均为Apache 2.0 License。同时用户可根据需要进行二次开发。这种架构原理基于第三种架构,但是更灵活,扩展性更强。同时可配置Logstash 和Elasticsearch 集群用于支持大集群系统的运维日志数据监控和查询。

img

小结:不管采用上面哪种ELK架构,都包含了其核心组件,即:Logstash、Elasticsearch 和Kibana。当然这三个组件并非不能被替换,只是就性能和功能性而言,这三个组件已经配合的很完美,是密不可分的。究竟该采用哪种架构,可根据现实情况和架构优劣而定。


应用

​ 在海量日志系统的运维中,以下几个方面是必不可少的:

  • 分布式日志数据集中式查询和管理;
  • 系统监控,包含系统硬件和应用各个组件的监控;
  • 故障排查;
  • 安全信息和事件管理;
  • 报表功能;

​ ELK组件各个功能模块如下图所示,它运行于分布式系统之上,通过搜集、过滤、传输、储存,对海量系统和组件日志进行集中管理和准实时搜索、分析,使用搜索、监控、事件消息和报表等简单易用的功能,帮助运维人员进行线上业务的准实时监控、业务异常时及时定位原因、排除故障、程序研发时跟踪分析Bug、业务趋势分析、安全与合规审计,深度挖掘日志的大数据价值。同时Elasticsearch提供多种API(REST JAVA PYTHON等API)供用户扩展开发,以满足其不同需求。

img

汇总ELK组件在大数据运维系统中,主要可解决的问题如下:

  • 日志查询,问题排查,上线检查;
  • 服务器监控,应用监控,错误报警,Bug管理;
  • 性能分析,用户行为分析,安全漏洞分析,时间管理;

小结:ELK组件在大数据运维中的应用是一套必不可少的且方便、易用的开源解决方案。


elk安装配置

  • www.elastic.co 下载elasticsearch,kibana,filebeat,logstash的安装包
  • centos7 如果没有内置java8或者更高的Java版本,需再安装java8或更高的Java版本
  • 将安装包上传至centos7 的opt目录下

elasticsearch安装配置并启动

  • 在opt目录下解压安装包,并移动至/usr/local,目录下
  tar zxvf (elastic安装包名)    mv [elastic解压后的文件夹]  [/usr/local/]
  • 在local目录下,即elastic所在文件夹下创建elk/data,elk/logs文件夹,用于存放数据
  cd /usr/local    mkdir -p elk/data    mkdir -p elk/logs
  • 进入elastic的配置文件夹,修改elasticsearch.yml,找到修改以下内容,记得去掉注释符,记得冒号后面应有一个空格
  cd elasticsearch-6.8.6/config    vi elasticsearch.yml    # 进入elasti配置文件    # 修改以下内容    cluster.name: yunyicluster    node.name: node-1    path.data: /usr/local/elk/data    path.logs: /usr/local/elk/logs    network.host: 0.0.0.0    http.port: 9200
  • 修改jvm.options, 找到修改以下内容
  -Xms512m   # 把 -Xms1g 改成 -Xms512m    -Xmx512m   # 同
  • 因为elastic不能用root用户启动,所以切换或者创建新的用户,并赋予权限给该用户
  useradd 用户名    在elastic文件夹所在目录下执行如下命令(/usr/local/)    chown -R 用户名:用户名 elasticsearch-6.8.2(elastic完整文件夹名字)    chown -R 用户名:用户名 elk(elastic数据存放的文件夹)
  • 使用root用户执行命令,然后在文件末尾添加以下内容
vi /etc/security/limits.conf    soft    nofile  65536   # 注意使用tab键隔开    hard    nofile  65536
  • 使用root用户执行命令,然后在文件末尾添加以下内容
  vi /etc/sysctl.conf    # 添加内容     vm.max_map_count=262144     sysctl -p   # 让配置生效
  • 如果是在虚机机中安装,宿主机想访问虚拟机,需关掉虚拟机的防火墙
  systemctl stop firewalld.service
  • 后台运行elaticsearch
  nohup /usr/local/elasticsearch-6.8.2/bin/elasticsearch >> /usr/local/elasticsearch/output.log 2>&1 &
  • 查看与关闭进程
  ps -ef | grep java     # 查看    kill -9 进程号        # 关闭

kibana安装配置并启动

  • 在opt目录下解压安装包,并移动至 /usr/local 目录下
tar zxvf (kibana安装包名)    - mv [kibana解压后的文件夹]  [/usr/local/]    cd /usr/local/kibana-6.8.6-linux-x86_64/config
  • 进入kibana配置文件,找到修改以下内容,记得去掉注释符,记得冒号后面应有一个空格
  vi kibana.yml    # 进入kibana配置文件    # 修改以下内容    server.port: 5601    server.host: "0.0.0.0"    elasticsearch.hosts: ["http://localhost:9200"]   # 如果kibana和elasticsearch不在一台机器,应修改ip地址    elasticsearch.username: "user"    elasticsearch.password: "pass"   # 如果elasticsearch配置了用户名密码
  • 后台运行kibana
  nohup /usr/local/kibana-6.8.6-linux-x86_64/bin/kibana >> /usr/local/kibana-6.8.6-linux-x86_64/output.log 2>&1 &
  • 查看与关闭进程
  ps -ef | grep kibana    # 查看    kill -9 进程号        # 关闭

logstash安装配置并启动

  • 在opt目录下解压安装包,并移动至 /usr/local 目录下
  tar zxvf (logstash安装包名)    mv [kibana解压后的文件夹]  [/usr/local/]    cd /usr/local/logstash-6.8.6/config
  • 进入logstash配置文件,找到修改以下内容,记得去掉注释符,记得冒号后面应有一个空格
  -Xms512m   # 把 -Xms1g 改成 -Xms512m    -Xmx512m   # 同
  • 修改logstash的启动文件
  vi logstash.conf    # 下面为修改内容,可能以后会多次修改,或者可单独创建启动文件    input {        stdin{}   # 终端输入    }    filter {    }    output {        stdout{}   # 终端输出    }
  • 启动logstash
  # logstash 顶层目录下    bin/logstash -f config/logstash.conf

filebeat安装配置并启动

  • 在opt目录下解压安装包,并移动至 /usr/local 目录下
  tar zxvf (filebeat安装包名)    mv [filebeat解压后的文件夹]  [/usr/local/]    cd /usr/local/filebeat-6.8.6
  • 修改filebeat配置文件
  cd /usr/local/filebeat-6.8.6/filebeat.yml    filebeat.inputs    -    type: log        enabled: true  # 启用模块        backoff:"1s"   # 多长时间检查一次要监视的文件        tail_files: false   # 如果设置为true,则filebeat将在每个文件的末尾而不是开头读取新日志,当此选项与日志轮换结合使用时,可能会跳过新文件中的第一个日志条目        path:             - /var/local/nginx/log/access.log   # 监视此文件        fields:            filetype: log-nginx-json   # 自定义字段,用来和其它log文件进行区分        fields_under_root: true   # 为true,则自定义字段将作为文档中的顶级字段    -     type: log   # 采集多个文件时        enabled: true         backoff:"1s"          tail_files: false        path:             - /var/log/messages        fields:               filetype: log-system        fields_under_root: true   #     output.elasticsearch:   # 输出到elasticsearch        hosts: ["localhost:9200"]    output.console   # 输出到控制台    output.logstash   # 输出到logstash        enabled: true        hosts: ["localhost:5044"]
  • 启动filebeat
  /usr/local/filebeat-6.8.6/filebeat -e -c filebeat.yml    # filebeat记录的位置信息    cd /usr/local/filebeat-6.8.6/data    cat registry    rm -rf *   # 清除位置信息

ELK使用

elastic

使用restful 操作elasticsearch

curl -H "Content-Type: application/json" -X PUT http://127.0.0.1:9200/index/type/row?pretty -d @sample.json  # 查看集群状态  GET /_cluster/health# 查询index库中的所有数据  GET /index/_search#   GET /index/_mapping#   GET /index/_seetings#  GET /index/_count# elasticsearch上存在的索引  GET /_cat/indices#   POST /index/_open#   POST /index/_close# 查看索引下面的所有文档  GET /index/_search  {      "query":{          "match_all":{}      }  }

logstash

查看已安装插件: cat Gemfile | grep 插件名

数据处理流程:input => 解码 => filter => 编码 => output

支持正则,filebeat不支持正则

input {      # file {   # 日志数据从本地文件来      #    path => "/var/log/message"      #    type => "system"         #    start_position => "beginning"      # }      # file {      #    path => "/usr/local/nginx/logs/access.log"      #    type => "nginx-access"      #     start_position => "beginning"      # }      beats {   # 日志数据有filebeat传输来          host => "0.0.0.0"          port => 5044      }  }filter {      if [filetype] == 'log-nginx-json' {          mutate {              split => ["message", "|"]   # 将数据中的message字段的信息用"|"分割             }          grok {                 match => { "message" => "%{HTTP_COMBTINEDLOG}" }   # nginx日志过滤              remove_field => ["beat", "offset", ...]   # 移除不想要的字段          }          date => {              match => ["timestamp", "dd/MMM/YYYY:HH:mm:ss Z"]              target => "@timestamp"          }      }  }output {      # stdout {  # 输出到控制台      # }      elasticsearch {          hosts => ["127.0.0.1:9200", "xxx.x.x.x:xxxx"]          index => "nginx-%{+YYYY.MM.dd}"      }  }

其它

  • 若虚拟机未联网
  vi /etc/sysconfig/network-scripts/ifcfg-ens33    # 在文件末尾添加如下内容    DNS1 = 202.103.24.68    # 重启网络    systemctl restart network
  • logstash安装插件步骤
  # 安装ruby    yum install ruby    https://rubygems.org/rubygems/rubygem-[version].zip    ruby setup.rb    gem -v    gem sources -l # 查看镜像源    gem sources --add https://gem.ruby-china.com/ --remove https://rubygems.org/    # 修改 ~/.gemrc文件,增加ssl_verify_mode:0,以便于RubyGems可以忽略SSL证书错误    cd /usr/local/logstash-6.6.2/bin/    ./logstash-plugin install logstash-output-mongodb[插件名]
  • logstash日志采集,如果希望从文件的第一条数据采集,需要删掉sincedb_path指向的文件
  • nginx
  # 修改nginx的日志为json格式    log_format log_json '{"remote_addr": "$remote_addr",'                        '"ident": "-",'                        '"user": "$remote_user",'                        '"timestamp": "$time_local",'                        '"request": "$request",'                        '"status": "$status",'                        '"bytes": "$body_bytes_sent",'                        '"referer": "$http_referer",'                        '"agent": "$http_user_agent",'                        '"x_forwarded": "$http_x_forwarded_for"'                        ' }';    access_log logs/access-json.log log_json;   # 使用log_json指代的格式生成日志,并保存到 logs/access-json.log  # 启动nginx    [path of nginx installed]/sbin/nginx -c conf/nginx.conf    # 关闭nginx    pkill nginx    # 查看nginx进程    ps -ef | grep nginx

提交评论

您尚未登录,登录之后方可评论~ 登录 or 注册

评论列表

暂无评论