ELK

ELK(Elasticsearch, Logstash, Kibana)是什么?网上很多,本文就不赘述了,这里推荐IBM的一篇文章:ELK+Filebeat 集中式日志解决方案详解,感觉图文并茂,讲的挺不错,而且里面也对Beat做了简单的说明。

Logstash vs Filebeat

这里也推荐一篇文章:Filebeat vs. Logstash — The Evolution of a Log Shipper.

如果你觉得上面的文章有些长,那我总结一下。

先看下二者的历史:

  1. 把Logstash和FileBeat放在一起比较其实不是非常合适,因为二者往往是互补的关系,可以配合使用,但这里放在一起比较的原因主要是说明他们的关系。
  2. Logstash是由Jordan Sissel(链接是Twitter的)这个大牛开发的,后来这个人加入了Elastic公司,Logstash也就由一个单独的软件变成了ELK技术栈内的一员。Logstash是由Jruby写的,运行依赖于JVM,所以它的突出问题就是性能不是很好,尤其是对内存消耗比较高。
  3. 同时,有人用Go语言开发了Lumberjack,刚开始的初衷是实现一个轻量级的日志收集系统,而日志分析则转交给其他软件去做,比如Logstash。Lumberjack背后的核心思想就是开发一套高效、可处理大量数据、内存消耗低、支持加密的网络协议。后来Lumberjack更名为Logstash-Forwarder,从此以后,Lumberjack单纯的指网络协议,而Logstash-Forwarder则成为基于Lumberjack的日志系统。
  4. 等到Lumberjack协议出了第二个版本以后(新版本的主要改变是支持嵌套JSON和一些流控机制),Logstash-Forwarder也被废弃了,出现了基于第二版Lumberjack的日志收集系统Beats。Beats是一个家族,里面包含Filebeat、Packetbeat、Winlogbeat等,用于收集不用数据源的日志,比如Filebeat用于收集文件式的日志。其中第一个出现的是Packetbeat,用于分析网络数据,后来其开发者也加入了Elastic公司,进而就有了后来其他的Beat。详情参见:https://www.elastic.co/downloads/beats

所以从二者的发展过程中我们就能看出来,最初的Logstash是既可以做日志收集,又可以做一些复杂分析的,但缺点是性能差,特别是运行依赖于JVM,作为Agent部署到每个节点上去的时候显得有些太重。于是乎就出现了基于更高效的编译型语言Go开发的Beat系列,它们很好的替代了Logstash收集日志的那一部分功能(当然也可以做一些简单的分析),但目前还做不了复杂的分析,特别是聚集类的分析。所以在实际使用中,如果我们不需要对日志做复杂的分析,那基本上选择Beat+ES+Kibana就可以了。但如果需要做复杂的分析,往往就是Beat+Logstash+ES+Kibana。这些软件都是Elastic公司开发的,所以可以无缝配合使用。

最后附张图(图片来源于上面的文章):

Beats和Logstash关系

Filebeat+ES+Kibana实例

该例子来源于:https://github.com/elastic/examples

当然第一步得安装对应的软件,这些软件都可以在https://www.elastic.co/downloads下载。需要说明的是目前主要有两种安装方式:一种是tar.gz包;一种是对应平台的包,比如rmp、deb等。二者各有利弊:

  • 通过tar.gz的好处是用户可以自定义安装目录,所有东西都安装在该目录下,不好处是软件没有自动纳入到系统管理里面,简单说就是你不能通过systemctl(对于upstart系统是service)命令去对软件的开机自动启动、软件启停等去管理,如果需要这样,需要自己手动去加service文件。
  • 通过rpm、deb等包安装的好处就是安装完成之后你就可以使用systemctl命令去管理软件了,不好处就是安装目录无法指定,而且配置文件和其他文件是分开在不同地方的。默认安装在/usr/share/目录下,配置文件在/etc目录下。

萝卜白菜,各有所爱。我个人推荐至少使用tar.gz安装一次,看看里面的目录等长啥样,如果第一次就通过rpm、deb包安装,安装完后,你可能连安装到哪里了都不知道。对于下面的例子,Filebeat要使用tar.gz的方式安装。

具体的安装过程就不赘述了,官网写的比较详细,网上教程也很多。这里说几个注意点(我是基于Ubuntu 16.04的):

  1. 通过tar.gz包安装的话,就是解压,设置环境变量,配置等;通过rpm、deb包安装的话,一条命令就搞定了。
  2. 对于ES,

    • 需要修改一下系统允许的最大虚拟内存,否则启动会失败,报错信息类似[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]。修改方法为,在/etc/sysctl.conf文件中增加(如果有,则修改)vm.max_map_count=262144,需重启才可生效。
    • ES不允许以root用户运行,需要使用其他用户。所以要注意其他用户一定要有权限访问和执行ES安装目录以及对应的文件。
    • 需要后台运行的话,在elasticsearch启动的时候加上-d参数即可。
    • ES的配置需要修改一下监听地址network.host(默认值是192.168.0.1),可修改为具体的IP或者0.0.0.0,端口号默认9200,可以不用修改。同时建议设置一下监听数据目录path.data,要注意修改的目录一定要是运行ES的用户可读可写的。
    • 安装例子需要的ES插件:
    <path_to_elasticsearch_root_dir>/bin/elasticsearch-plugin install ingest-user-agent
    <path_to_elasticsearch_root_dir>/bin/elasticsearch-plugin install ingest-geoip
    • 安装好ES之后,在浏览器中输入(或者curl等)http://<your_ip>:9200/,可看到类似如下结果则表示安装成功:
    {
      "name" : "i-gOkTs",
      "cluster_name" : "elasticsearch",
      "cluster_uuid" : "kmCU4GOqQteFbR4CekK6dA",
      "version" : {
        "number" : "6.2.1",
        "build_hash" : "7299dc3",
        "build_date" : "2018-02-07T19:34:26.990113Z",
        "build_snapshot" : false,
        "lucene_version" : "7.2.1",
        "minimum_wire_compatibility_version" : "5.6.0",
        "minimum_index_compatibility_version" : "5.0.0"
      },
      "tagline" : "You Know, for Search"
    }
  3. 对于Kibana,需要设置监听IPserver.host、ES地址elasticsearch.url,默认端口是5601,可以不修改。装完之后,如果http://<your_ip>:5601/能打开,则表示安装成功。

安装完之后,启动ES和Kibana。下载日志文件:apache_logs,假设下载的文件放在/root/temp目录。然后在Filebeat安装目录执行以下命令:

./filebeat modules enable apache2
./filebeat modules list
 ./filebeat -e --modules apache2 --setup  -M "apache2.access.var.paths=[/root/temp/*]"

如果运行正常的话,日志数据就会经Filebeat采集到ES里面(这里不需要复杂分析,所以没有使用Logstash)。在浏览器输入http://<your_ip>:9200/filebeat-*/_count,如果看到"count":10000字样,表示数据已经全部进入ES。

然后打开Kibana界面,选择Management-Index Patterns,在里面输入filebeat-*,下一步可选择I don't want to use Time Filter。然后打开Dashboard,选择[Filebeat Apache2] Access and error logs。然后在右上角选择2015-05-17 00:00:00.0002015-05-21 12:00:00.000时间段,就可以看到如下分析图了:

Kibana Show

ELK Stack作为一套开源的日志分析系统,已经被很多企业所采用,现在Beat家族加入后,相信前途会更好。

And, I love Go and Python. And, Happy Lunar New Year!