前言

操作系统,应用服务和业务逻辑,都在不停的产生日志数据。过去,日志数据基本都存在单机磁盘上,只能用来做临时的事后分析和审计;有 Hadoop 以后,大家渐渐习惯收集日志到 HDFS 中,然后每天运行 MapReduce 任务做统计报表;但是面对诸如“新上线的版本过去几分钟在各地反馈如何”,“昨天 23:40 左右这个投诉用户有没有异常”这种即时的开放性问题,传统的日志处理方案显得非常的笨拙和低效,因为解答没有唯一套路,答案需要尝试下钻挖掘才能得出。复杂多变的实时数据分析需求,需要的是灵活快捷的响应处理。Splunk 公司正是凭借着自己在这个大数据细分领域的一枝独秀,成为百亿美元级的明星公司。但是 Splunk 每 GB 高达 4500 美元的报价,又让人望而却步。直到 ELKstack 的出现,大家终于有了可选择的开源产品。

ELKstack 是 Elasticsearch、Logstash、Kibana 三个开源软件的组合。在实时数据检索和分析场合,三者通常是配合共用,而且又都先后归于 Elastic.co 公司名下,故有此简称。

ELKstack 具有如下几个优点:

  • 处理方式灵活。Elasticsearch 是实时全文索引,不需要像 storm 那样预先编程才能使用;
  • 配置简易上手。Elasticsearch 全部采用 JSON 接口,Logstash 是 Ruby DSL 设计,都是目前业界最通用的配置语法设计;
  • 检索性能高效。虽然每次查询都是实时计算,但是优秀的设计和实现基本可以达到百亿级数据查询的秒级响应;
  • 集群线性扩展。不管是 Elasticsearch 集群还是 Logstash 集群都是可以线性扩展的;
  • 前端操作炫丽。Kibana 界面上,只需要点击鼠标,就可以完成搜索、聚合功能,生成炫丽的仪表板。

当然,ELKstack 也并不是实时数据分析的灵丹妙药。在不恰当的场景,反而会事倍功半。我自 2014 年初开 QQ 群交流 ELKstack,发现网友们对 ELKstack 的原理概念,常有误解误用;对实现的效果,又多有不能理解或者过多期望而失望之处。更令我惊奇的是,网友们广泛分布在传统企业和互联网公司、开发和运维领域、Linux 和 Windows 平台,大家对非专精领域的知识,一般都缺乏了解,这也成为使用 ELKstack 时的一个障碍。

为此,我决定写这本 ELKstack 技术指南,帮助大家厘清技术细节,分享一些实战案例。本书并不会逐一介绍 Elasticsearch 的全部聚合语法或者分词特性,而是从日志数据处理的角度,介绍数据的解析、导入、可视化方式,讲解集群的稳定性和性能优化原理和方法,剖析代码要点并提供 ELKstack 二次开发实例。

本书包括 3 大部分共 19 章,各部分可以独立阅读。但对于还没有大规模应用经验的新手,建议按顺序阅读全文。

第一部分 Logstash 第1章:入门示例 介绍 Logstash 及其插件的配置安装方法,自定义配置语言的设计用途。并为不熟悉 Linux 系统管理的开发人员介绍了多种后台运行方式。 第2章:插件配置 本章列举 Logstash 最常用的几十种插件,通过实际示例和效果,讲解各插件的配置细节和用途。 第3章:场景示例 本章以最常见的运维、网络、开发和数据库场景,介绍 Logstash 处理 Nginx、Postfix、OSSEC、Log4J、MySQL 等日志的最佳实践。 第4章:性能与监控 了解 Logstash 的性能情况一直是个难题,本章从 Logstash 设计原理和 JVM 平台本质出发,介绍几种行之有效的压测和监控方案。 第5章:扩展方案 本章介绍采用 redis 和 kafka 完成 Logstash 水平扩展的方案,同时也介绍其他几种日志收集系统与 Logstash 的配合方式。 第6章:源码解析 本章解析 Logstash 源码中最重要的 pipeline 设计,以及 Logstash::Event 的来龙去脉。 第7章:插件开发 本章以最常见的用户登录记录和地址库解析需求,实际演示 Logstash 的自定义 input 和 filter 插件的编写,同时还涉及了插件打包的 RubyGems 规范等细节。 第二部分 Elasticsearch 第8章:架构原理 本章从更高级的架构层面,介绍 Elasticsearch 分布式设计中涉及稳定性和高性能的部分原理,并由此引发相关的优化配置介绍。还提供了一种针对时序数据索引的读写分离方案,适于拥有少部分 SSD 设备的用户。 第9章:数据接口用例 本章介绍 Elasticsearch 的 RESTful 接口的基础知识。并针对常见的重建索引需求提供两种快速实现方案;为有 Spark 经验的读者,介绍通过 Spark Streaming 接口读写 Elasticsearch 的方法。 第10章:性能优化 本章介绍 Elasticsearch 在日志处理场景下的读写优化知识和官方推荐的 curator 工具。其中重点介绍了 Elasticsearch 中几种不同的 cache 的区别和有效场景。 第11章:测试和扩展方案 本章介绍将 Elasticsearch 在生产环境中需要的一些周边工具,比如 Puppet 配置管理,Shield 权限管理,版本升级操作,别名切换流程设计等。 第12章:映射与模板的定制 本章详细介绍了 Elasticsearch 中的核心类型及其对应的常见映射设置,以及如何通过动态模板简化映射定制操作的复杂度。 第13章:监控方案 Elasticsearch 作为一个分布式系统,也是有一定的运维难度的。因此其本身的监控也相当重要。本章介绍 Elasticsearch 自带的一系列监控接口,以及由此衍生的多种实时或长期的监控方案。 第14章:Elasticsearch 在运维领域的其他应用 本章介绍除了 ELKstack 以外,Elasticsearch 在运维方面的其他运用方式,包括实时过滤接口、定时报警系统设计、时序数据存储和相关性排序等。 第三部分 Kibana 第15章:Kibana 的产品对比 本章介绍 Kibana3,Kibana4 之间,以及他们与 Hadoop、Splunk 之间的差异。方便读者在不同场景需求下,选择更正确的工具。 第16章:Kibana3 本章介绍 Kibana3 的界面操作方式,面板的配置细节及其效果,动态仪表板的高级用法,并提供了几种额外权限控制的部署方案。 第17章:Kibana3 源码解析 本章以 index.html 为入口,介绍 Kibana3 如何利用 angular.js,elastic.js 和 jquery.flot.js 三大框架实现单页应用。重点解析面板的实现过程,并分别演示了采用 facets 和 aggregations 接口开发一个 Kibana3 面板的过程。 第18章:Kibana4 本章介绍 Kibana4 的安装部署和界面操作方式。重点介绍 Kibana4 提供的几种可视化图表的配置细节和效果。并以几种场景的日志分析需求,演示了 Kibana4 全新的子聚合(sub aggregations)功能的效果。此外,本章最后还介绍了一种采用 phantom.js 截图方式记录长期报表数据的方案。 第19章:Kibana4 源码解析 本章介绍 Kibana4 的界面实现,重点包括其内部 ORM 实现的 Counrier 类,可视化绘图的 Vislib 类等。

我本人于 ELKstack,虽然接触较早,但本身专于 web 和 app 应用数据方面,动笔以来,得到诸多朋友的帮助,详细贡献名单见合作名单。此外,还要特别感谢曾勇(medcl)同学,完成 ES 在国内的启蒙式分享,并主办 ES 中国用户大会;吴晓刚(wood)同学,积极帮助新用户们,并最早分享了携程的 ELKstack 日亿级规模的实例。

欢迎捐赠,作者支付宝账号:[email protected]

ercode