timg (1)
hello,大家好:
在日常的开发中,所有的框架,工具的出现都是为了解决某种问题
在我们实际工作中可能会遇到下面的场景。
场景一:

  在目前的互联网环境中,谁得到了用户数据谁就得到了天下
  数据怎么来呢?大量的爬虫来模拟用户操作获取用户数据,或者平台间的数据共享
  数据拿到之后怎么才能发挥出最大用处呢?这就需要大数据团队对数据进行细致的分析和处理
  分析之后的数据做成报表图标展示。
  但是这个流程中怎么让rd快速介入呢?
  开发没有生产环境服务器权限,需要通过系统管理员获取详细日志,沟通成本太高
  系统可能是有多个不同语言编写、分布式环境下的模块组成,查找日志费时费力
  数量巨大,查询时间很长

场景二:

  生产环境中大量的tomcat日志以及nginx日志
  这些日志在对生产环境中用户问题的及时定位起着重要作用
  那如何让这些信息的查询门槛降低到每一个RD都能数量操作使用呢?

为了解决上面的问题,有了这篇文章。
我们今天的主题就是:使用ELK(ElasticSearch + Logstash + Kibana)架构收集、存储、分析数据

分别介绍一下:
Elasticsearch 是一个近似实时的搜索平台,它让你以前所未有的速度处理大数据成为可能。
Elasticsearch所涉及到的每一项技术都不是创新或者革命性的,全文搜索,分析系统以及分布式数据库这些早就已经存在了。
它的革命性在于将这些独立且有用的技术整合成一个一体化的、实时的应用。
Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整搜索个对象或文档(document)。
然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。
在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。
这种理解数据的方式与以往完全不同,这也是Elasticsearch能够执行复杂的全文搜索的原因之一。

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

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

对于日志来说,最常见的需求就是收集、查询、显示,正对应logstash、elasticsearch、kibana的功能。
ELK架构专为收集、分析和存储日志所设计。同时可以通过开源项目Kibana对日志进行查看、搜索、分析、可视化:
三者的工作流程如下图:
a32ef370ca557f7258f4086c8d20e446_r
从上图的架构可以看出,redis( 什么是redis )负责收集各个应用的数据来源,由Logstash读取redis中的日志流并转存至ElasticSearch中建立索引
最后由Kibana定制查询读取ElasticSearch中的数据

接下来我们就一步一步的实现我们的实例,使用elk架构搭建一个日志查询系统。
为了让今天的示例更贴合实际,我们找了一些数据,分别是知乎用户的60万条数据和isjs线上的Nginx日志
好吧,开整:

环境搭建

1.redis 参考之前的文章:redis安装教程
2.Logstash,Kibana,ElasticSearch 到此处下载对应安装包:https://www.elastic.co/downloads

3.安装Kibana
将下好的压缩包解压缩到目标目录

$ cp /Users/xiaoqiang/Downloads/kibana-5.2.2-darwin-x86_64.tar.gz ./
$ tar xvf kibana-5.2.2-darwin-x86_64.tar.gz 
$ mv kibana-5.2.2-darwin-x86_64 Kibana   //个人习惯,可不做
//先不配置,直接run起来,ctrl+c终止服务
$ ./bin/kibana

打开后面地址查看是否正常:http://localhost:5601/
如果此处端口冲突的话,修改config/kibana.yml文件中的配置即可
这时候的页面打开显示下图内容
QQ20170319-0@2x
注意红框内的消息,提示我们ElasticSearch的9200端口没有被激活
下面我们开始安装ElasticSearch

4.安装ElasticSearch
注意:由于我们使用的版本是5.*,所以要求使用Java 8。对应的java环境配置就不展开讲了,自行百度安装即可
mac下由于之前会有默认的jdk1.6,安装会有些麻烦,推荐使用homebrew。参考stackoverflow。
配置好java环境之后执行命令:

$ cp /Users/xiaoqiang/Downloads/elasticsearch-5.2.2.tar.gz ./
$ tar xvf elasticsearch-5.2.2.tar.gz
$ mv elasticsearch-5.2.2 Elasticsearch   //个人习惯,可不做

正如前面讲的Elasticsearch是一个近似实时的搜索平台,它接受Logstash中的数据
并提供restfull接口来操作这些数据,默认开放端口是9200
如果和你本地的端口冲突,可以编辑config目录下的elasticsearch.yml文件
来修改你的端口,log地址等配置项,切记此处修改了之后将kibana中的配置也做相应修改

现在我们将ElasticSearch和Kibana同时启动看一下效果

$ cd Elasticsearch/
$ bin/elasticsearch
//如有报错接着检查java环境
$ cd ../kibana
$ bin/kibana

打开:http://localhost:5601/查看是否正常
/(ㄒoㄒ)/~~此处要注意在墙外打开http://localhost:5601/会一直提示无响应,,害我调了半天
正常启动之后的页面是长这样的:
QQ20170319-1@2x
页面上的提示信息是告诉我们要想开始还需要配置索引
索引是什么呢?前面我们有讲Logstash可以对你的日志进行收集、分析,并将其存储供以后使用
索引就是来定位Logstash找出的数据,你可以对Logstash找出的数据分类处理,比方说nginx日志和tomcat日志
这两组数据要分别查找,就需要用索引来区分。

下面就让我们进入最后一步,Logstas的安装配置

5.安装Logstash

$ cp /Users/xiaoqiang/Downloads/logstash-5.2.2.tar.gz ./
$ tar xvf logstash-5.2.2.tar.gz
$ mv logstash-5.2.2 Logstash   //个人习惯,可不做

Logstash基本原理
LogStash实例中的三个主要功能:事件输入、事件数据过滤以及事件输出。
LogStash的这三个功能是根据配置信息执行的,这些信息存储在简单易懂的“.conf”文件中。
“.conf”文件中有不同的配置节对应LogStash所使用的三种不同类型的插件
输入(input)、过滤器(filter)以及输出(output)。
每个LogStash实例都是根据它在整体架构中的角色需求进行定制的。

logstash分为 index(中心节点)和agent ,
agent负责监控、过滤日志,index负责收集日志并将日志交给ElasticSearch 做搜索

Logstash中心节点配置
Logstash中心节点负责将Broker(Redis)中的数据流转化到ElasticSearch中,为此创建一个配置文件:

$ cd Logstash
$ mkdir userConfig
$ cd userConfig
$ vim index.conf

input {
  redis {
    host => "127.0.0.1"
    port => "6379"
    key => "logstash:demo"
    data_type => "list"
    codec  => "json"
    type => "logstash-redis-demo"
    tags => ["logstashdemo"]
  }
}

output {
  elasticsearch {
     hosts => [ "localhost:9200" ]
  }
}
//别忘了保存哦
$ cd ..
$ ./bin/logstash -f userConfig/index.conf

启动完成后,可以通过往Redis中push一条数据来测试是否成功:

//打开redis-cli,此命令用于redis-cli
RPUSH logstash:demo "{\"time\": \"2017-03-19 04:23:55\", \"message\": \"logstash is pushed\"}"

然后可以通过Kibana Web界面查看数据是否插入成功。
打开我们的kibana页面显示如下
QQ20170319-4@2x
因为我们前面还没有配置索引,如图一样我们配置一个通配符*,来匹配所有索引
配置成功之后页面会显示刚才插入redis的这条数据:
QQ20170319-5@2x

到了这一步,我们已经打通了redis —> Logstash -> Elasticsearch -> Kibana
距离我们的前端日志平台就差最后一步了
就是读取log日志

本来我要准备分析知乎的60万大数据的和我线上的nginx日志的
结果一个数据太大解压出错了,线上就根本没开nginx日志
没办法找了线上的一个tomcat日志
这些文件位于testData目录下,结构如下:
QQ20170319-7@2x

Shipper节点配置
Shipper节点上运行的同样是Logstash,只不过它的功能是将各类日志收集起来并发送到Redis中。

$ cd Logstash
$ cd userConfig
$ vim shipper.conf

input {
  file {
    type => "linux-syslog"
    path => [ "/Users/xiaoqiang/Documents/testData/locahost/*.log",
              "/Users/xiaoqiang/Documents/testData/locahost/*.text" ]
    start_position => "beginning"
  }
}
 
filter {
  date {
    match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
  }
  geoip {
    source => "clientip"
  }
}
 
output {
  redis {
    host => "127.0.0.1"
    port => 6379
    data_type => "list"
    key => "logstash:demo"
  }
}
//别忘了保存哦
$ cd ..
$ ./bin/logstash -f userConfig/shipper.conf

然后可以通过Kibana Web界面查看数据是否插入成功。
页面会显示刚才读取到的日志数据:
QQ20170319-8@2x
数据多了之后可以使用自定义过滤条件来找出指定的日志了
QQ20170319-9@2x
实际上,Logstash对指定文件进行检测,
一旦发现其发生了变化,会将变化的内容发送至Redis中。
除了input和output两个标签,filter中的date插件添加了时间戳,geoip插件将clientip字段转化为地理信息ip,
它们都是非常有用的插件,同时也证明了Logstash的配置非常容易,
可扩展性强,几行配置就可以实现非常复杂的日志处理分析功能。

结尾:
好了,到这里我们这一篇文章也该结尾了,我们使用linux搭建了一套自己的前端日志系统
是不是感觉棒棒的~\(≧▽≦)/~
我自己对linux不是很熟,也是第一次做。中途也出了很多问题,弄了好久终于可以使用了
现在是凌晨6点钟,今天也是自己的生日,把这篇文章当做自己的生日礼物吧,也送给大家
对文章有歧义或者有好的建议希望大家多多指教。邮箱:xiaoqiang@isjs.cn
原创文章,转载请注明出处。最后祝大家工作顺利天天开心。O(∩_∩)O~~

附录:
redis命令
ELK架构官方文档