人工智能、大数据快速发展的今天,对于 TB 甚至 PB 级大数据的快速检索已然成为刚需。Elasticsearch 作为开源领域的后起之秀,从2010年至今得到飞跃式的发展。 Elasticsearch 以其开源、分布式、RESTFul API 三大优势,已经成为当下风口中“会飞的猪”。
ELK Stack(ELK技术栈)由最早期的最核心的Elasticsearch(以下部分简称ES)、集合Logstash(日志存储)、Kibana、beats等发展而来,形成ELK Stack体系,如下图所示:
Elasticsearch为开源的、分布式、基于Restful API、支持PB甚至更高数量级的搜索引擎工具。
相对于MySQL,给出如下的对应关系表更容易理解。
从上表可以看出:
如下是传统的关系型数据库(如Oracle、MySQL)、非关系型的数据库(如 Mongo)所做不到的:
这里的全文检索,举例如下:
“公路局正在治理解放大道路面积水问题”,对于这段检索的文字,经过细粒度分词后能得出如下的分词结果:
公路局、公路、路局、路、局正、正在、正、治理、治、理解、理、解放、解、放大、大道、大、道路、道、路面、路、面积、面、积水、积、水、问题
如果进行全文检索,是针对以上分词后的结果逐个进行匹配,并由得分的高低快速的返回匹配结果。
这点,传统数据库几乎不可能做到。
可以把Logstash理解成流入、流程Elasticsearch的传送带。
支持:不同类型的数据或实施数据流经过Logstash写入ES或者ES中读出写入文件或者对应的实施数据流。
包括但不限于:
Kibana是ES大数据的图形化展示工具。集成了DSL命令行查看、数据处理插件、继承了x-pack(收费)安全管理插件等。
Beats是一个开源的用来构建轻量级数据汇集的平台,可用于将各种类型的数据发送至Elasticsearch与Logstash。
Beats目前官方支持的多个子产品,如下:
通过以上的介绍,我们对 ELK Stack 中的核心成员:Elasticsearch、Logstash、Kibana、Beats 是什么以及能干什么有了相对一致的认知。
海量的版本中,告诉你明确的选择。
Elasticsearch 于2010年提交到 GitHub。
2010年2月8日推出了 V0.4.0 的发行版本,2010年2月12日推出 V1.0.0 版本,2016年2月2日推出 V1.7.5 版本, 此为 1.X 最终版本,不再更新。
2015年10月28日推出 V2.0.0 版本,2017年7月25日推出 V2.4.6 版本,此为 2.X 最终版本,不再更新。
2016年10月26日推出 V5.0.0 版本,2018年2月20日推出 V5.6.8 版本,此并不是 5.X 的最终版本,还在更新中……
2017年11月14日推出 V6.0.0 版本,2018年2月20日推出 V6.2.2 版本。
……
Elasticsearch 版本更新还在持续迭代进行中。
从以上更新我们也能得出,ES5.X 的末期版本和 ES6.X 的初期版本时间存在重叠。
在 Elasticsearch5.X 之前的版本中,Kibana 和 Logstash 各有自己的一套版本管理体系。如 Kibana4.X 对应 Elasticsearch2.3.X。
为统一规范化版本管理,Elasticsearch 跃过 3.X 大版本、4.X 大版本,直接和 Kibana、Logstash、Feat 升级为相同的 5.X、6.X 乃至以后的 7.X 版本。
新手直接选择最新版本。
如果你是初次接触Elasticsearch,建议从最新版本学起。
最新版本的优点:
根据一位携程架构师 wood 于2017年11月29日表示的,生产环境 5.3.2 有大规模部署,稳定性还不错。测试环境也有部署 5.6.4,目前也没发现什么不稳定的问题。
主要基于以下三点原因:
从版本历史可以看出,近7年多的 ELK Stack 得到长足的发展。
早期版本的一些设计缺陷历史问题、一些开源社区 Bug,在新版本都已经纠正。
新版本在性能方面也得到较大幅度的提升。
此时,ES的作用类似传统业务系统中的MySQL、PostgreSQL、Oracle或者Mongo等的基础关系型数据库或非关系型数据库的作用。
我们举例说明。使用 ES 对基础文档进行检索操作,如将传统的 word 文档、PDF 文档、PPT 文档等通过 Openoffice 或者 pdf2htmlEX 工具转换为 HTML,再将 HTML 以JSON 串的形式录入到 ES,以对外提供检索服务。
原有的业务系统中存在MySQL、Oracle、Mongo等基础数据,但想实现全文检索服务,就在原有业务系统的基础上加异常ELK。
举例一,将原有系统中 MySQL 中的数据通过 logstashinputjdbc 插件导入到 ES 中,并通过 Kibana 进行图形化展示。
举例二,将原有存储在 Hadoop HDFS 中的数据导入到 ES 中,对外提供检索服务。
举例一,日志检索系统。将各种类型的日志通过 Logstash 导入 ES 中,通过 Kibana 或者 Grafana 对外提供可视化展示。
举例二,通过 Flume 等将数据导入 ES 中,通过 ES 对外提供全文检索服务。
主要借助 ES 强大的全文检索功能实现,如分页查询、各类数据结果的聚合分析、图形化展示(饼图、线框图、曲线图等)。
举例说明,像那些结合实际业务的场景,如安防领域、金融领域、监控领域等的综合应用。
本小节主要探讨了 ELK Stack 三种基础应用场景和一种扩展综合应用场景,让你对 ES 的应用有个全局的认知。
建议Elasticsearch为第一优先级,需要掌握的内容如下:
本小节详细讲述了 Elasticsearch 由初级到高级逐步深入的学习优先级,以及 Kibana、Logstash、Beats 的实践优先级,使得你的基础和进阶学习不再迷茫。
推荐以下几种
除了支持各种数据的可视化之外,最重要的是支持 Dev Tool 进行 RESTFUL API 增删改查操作。比 Postman 工具和 cURL 都要方便。如下面图所示。
可实现 ES 集群状态查看、索引数据查看、ES DSL 实现(增、删、改、查操作),比较实用的地方是 JSON 串的格式化。
用于实现 ES 集群状态查看(堆内存使用率、CPU使用率、内存使用率、磁盘使用率)。
其强势功能包括支持 SQL 转 DSL,不要完全依赖,可以借鉴用。
比如有 IK分词、ANSJ分词、结巴分词。网上还有结巴分词的其他最新版本。
在这里建议选用 IK 分词,原因有以下几点:
在此,推荐 elasticsearch-SQL,其支持的 SQL,极大缩小了复杂 DSL 的实现成本。
通过 elasticsearch-SQL 工具可以基于以下 SQL 语句方式请求 ES 集群。
select COUNT(*),SUM(age),MIN(age) as m, MAX(age),AVG(age)FROM bank GROUP BY gender ORDER BY SUM(age), m DESC
在原来执行的 DSL 的基础上新增 profile 参数,我把它称作“测试工具”。
profile API的目的是,将 ES 高层的 ES 请求拉平展开,直观的让你看到请求做了什么,每个细分点花了多少时间。
profile API给你改善性能提供相关支撑工作。
使用举例如下:
GET /_search
{ "profile": true, "query" : { "match" : { "message" : "message number" }
}
}
推荐 rally。相比传统的发包请求测试工具,rally 更加直观和准确、且指标很丰富。
整理了以下几个常见的问题,并做出了回复。
Q:没有 Lucene 基础,能不能学习 Elasticsearch?
A:这个完全不需要Lucence基础的,遇到了相关底层问题,再回头查Lucene基础完全可以。
Q:C/C++ 程序员,能不能进行 Elasticsearch 开发?
A:这个问题就是 C/C++ 转 Java 的问题,几乎没有难度。
Q:Elasticsearch 如何部署(Linux、Windows等)?
A:如果没有 Linux 环境,Windows 搭建 Demo 无可厚非;如果有 Linux 环境,请不要在 Windows 上浪费时间,没有必要。
如果作为业务系统对外提供服务,建议至少搭建到配置相对高 Linux 服务器(CPU24核心以上、内存64GB以上、磁盘1TB左右以上)上。
现在各种新技术(VR、AR、深度学习、区块链技术等)层出不穷,但大神刘未鹏告诉我们“底层的技术永远不过时”, 对于 Elasticsearch 而言,倒排索引、打分机制、全文检索原理、分词原理等底层技术属于“永远不过时”的技术,要深究。
相信这点,由浅入深夯实基础,各种看似复杂的问题回头再去看都是“小Kiss”。
现身说法,我曾经对 Jest 使用摸索了很久。久久不能知道正确使用的方式。
最终发现,GitHub 官网的 readme.md 上面提供了详尽的说明,其他地方找的资料都是徒劳。
我的反思中,不要读别人的二手、三手的翻译资料,直接参考官网来的更快。
不要惧怕英文,看似最难的,往往是最快的。
在这点,ES 相关 API 的使用更是如此。比如,ES 的聚合后分页等操作实现,在官网 API 的介绍中都有详尽的描述。
首先推荐几个英文社区。
优先级1:Google
英文能解决的,效率往往会很高。某度差的非常远。
例如,我在2018年2月23日遇到的集群状态为红色的解决方案。在 Google 输入关键词:elasticsearch ALLOCATION_FAILED,Google 搜索就能很快定位到集群状态为红色的解决方案。
优先级2:Elasticsearch 英文官方论坛
问题回答得都很深入,需要翻到底,结合 Google 翻译 translate.google.cn(无需)查看。
优先级3: Stack Overflow
一些问题的版本比较老,1.X 或者 2.X,不过问题的解决思路可以参考。
优先级4:GitHub
注意,GitHub的 issue 上有很多问题的解决方案,不要忽略了。
接着看一下中文社区,这里主要推荐 www.elasticsearch.cn 的 Elastic 中文社区。
相信你也会说有 CSDN 中文问答社区、Segmentfault 社区、相关 QQ 群、微信群等。
但是,我要说的是,毕竟 Elastic 中文社区是目前国内最专业的 ELK Stack 技术交流平台,这里的问题回复率非常快、有多位大牛常驻、质量非常好。
更为重要的是,每天都会有 ES 顶级大牛为你遴选最新的、最专业的 Elasticsearch 日报。
再强调一下,Elasticsearch 日报是最好的学习 ELK Stack 技术的方式,没有之一。
这里推荐两位 ELK Stack 领域大牛 Medcl 和 携程 Wood 大神。
Medcl,Elasticsearch 布道者、ES 员工、中国最早接触 ES 的人、ES-IK 开源分词插件作者、gopa 开源爬虫作者。
携程 Wood 大神,他的文章质量都是源码级实战剖析的结果,很深入、非常实用。
如何向两位大神学习呢?
方法一:精准方法。关注他们在 Elasticsearch 中文社区发表过的文章和回复过的问题,一个个的过一遍。
方法二:没有办法的办法——技术难题向他俩进行提问。
主要包含:
《Elasticsearch 全文指南》英文官网文档,待更新。
《Elasticsearch 全文指南》中文官网文档,请注意版本基于2.X,相关技术可以参考。
Elasticsearch 6.2 最新版本 JavaAPI 文档集合,请注意,各种 API 的使用很详尽,最上方有搜索按钮,可以输入关键词搜索。
Elasticsearch5.X 必知必会清单,还有中文版。
此清单言简意赅,非常实用。
学习和实践 ELK Stack 的过程中,势必会遇到很多问题,这些问题当时解决了,回头还可能会遇到。
建议形成自己专属的问题清单,记录各种遇到的问题。
比如,ELK 集群搭建部署清单、ELK 上线清单、ELK 集群优化清单、ES 聚合操作清单、ELK 常见问题排查清单。
这种思维方式来源于《清单革命》这本医学领域的巨著,对于我们学习 ELK Stack 也非常有帮助。
问题清单是技术积累的一小部分内容,这里的技术积累还包括:
死磕 Elasticsearch 方法论述
死磕 Elasticsearch 方法论:普通程序员高效精进的 10 大狠招!