View on GitHub

Wills' blog

  • home | github | resume |
  • Logstash, elastic和kibana

    30 Jun 2015

    前言

    在flunted+hadoop+pig的搜集和分析的系统流程完了之后。在图表的表示方面有点弱,于是又试了一下logstash+elastic+kibana的组合方式试试效果。

    flunted vs logstash

    在flunted的概念中,存在source和match的概念,source是log流的来源,match部分处理log,并且做过滤和输出。

    在logstash的概念中,将过滤的概念单独拿出来作为filter节,其他节input与source对应,output与match中输出的部分相对应。

    一个典型的logstash配置文件如下:

    input {
      file {
        path => "/data0/nginx-acess.log"
        add_field =>  { "type" => "access" }
      }
      file {
        path => "/data0/nginx-error.log"
        add_field =>  { "type" => "error" }
      }
    }
    
    filter {
      if !([message] =~ "error") {
        drop {}
      }
    
      json {
          source => "message"
      }
    
      date {
        match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
      }
    }
    
    output {
      elasticsearch {
        host => localhost
      }
    }
    

    logstash用ruby实现的,在配置文件里面,可以写简单的ruby脚本,比如根据正则匹配来做对log做不同处理等等。

    logstash的input plugin支持很多种的输入,file是其中的一种,通过追踪文件的变化,将文件逐行作为input获取出来。同时在input节里面,可以通过一些logstash的命令增加或者修改字段。如例子中的add_field的例子。例子中type是logstash的默认的一个属性,如果没有系统会加上一个默认的type属性。

    在filter节里面,会对input的每条记录逐行过滤和处理,其中需要用到一些grok,json等操作,也可以通过简单的ruby程序,将这些操作组成逻辑。

    output节里面,logstash会多每个输出做定向输出到各种容器里面,如hdfs,stdout和文件等等。

    elasticsearch

    logstash内的输出可以存储到elasticsearch里面,而elasticsearch提供的restapi可以对index进行增删改查等等操作。

    elasticsearch中,每个文档属于一种类型,类型存在与数据库中,而elasticsearch中的数据库叫做index。

    一般的elasticsearch的RESTApi中一般会包含/index/type的部分。例如:

    GET /megacorp/employee/1
    

    则表示megacorp的index中类型为employee的记录中id为1的记录。

    elasticsearch底层的存储是一个基于分片和主从的存储架构,分片是es的最小的存储单元,一个index其实是对于一组分片集合的逻辑。分片和分片的主从复制会被均匀的散布在各个节点上,每个节点都知道全局的数据分布情况,即那个分片的主或者从分布在哪里,于是从每个节点开始,都能访问整个集群。这保证了es在大规模分布式数据的高可用性。

    kibana

    kibana是一个非常强大的图形化工具。可以从elasticsearch提取出数据绘图。

    参考文档


    [click to comment]