文章目录
- 1.简介
- 2.特点
- 3.发展历史
- 3.1 Lucene
- 3.2 ES 发展历史
- 初始版本:0.7.0 2010年5月14日
- 1.0.0:2014年2月14日
- 2.0.0:2015年10月28日
- 5.0.0:2016年10月26日
- 6.0.0:2017年8月31日
- 7.0.0:2019年4月10日
- 4.Kibana
- 5.小结
- 参考文献
1.简介
Elasticsearch(ES) 是一个基于 Apache Lucene 开源的分布式、高扩展、近实时的搜索引擎,主要用于海量数据快速存储,实时检索,高效分析的场景。通过简单易用的 RESTful API,隐藏 Lucene 的复杂性,让全文搜索变得简单。
ES 功能总结有三点:
- 分布式存储
- 分布式搜索
- 分布式分析
因为是分布式,可将海量数据分散到多台服务器上存储,检索和分析,只要是海量数据需要完成上面这三种操作的业务场景,一般都会考虑使用 ES,比如维基百科,Stack Overflow,GitHub 后台均有使用。
下面是 DB-Engines Ranking 给出的数据库流行度排行榜(截止至 202203)。ES 位居 Top 10 的位置,受欢迎的程度,可见一斑。
2.特点
ES 为什么这么受欢迎,得益于其相较于传统数据库所拥有的强大功能。
- ES 不是什么新技术,主要是将全文检索、数据分析以及分布式技术结合在一起,形成了独一无二的 ES;
- 数据库的功能面对很多领域是不够用的,比如全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理;ES 作为传统数据库的一个补充,提供了数据库所不不能提供的很多功能;
- 可以作为一个大型分布式集群(数百台服务器),处理 PB 级数据,服务大公司;也可以运行在单机上,服务小公司;
- 对用户而言,开箱即用,非常简单,作为中小型的应用,分钟级部署,就可以作为生产环境的系统来使用了。
ES 底层基于 Lucene 开发,针对 Lucene 的局限性,ES 提供了 RESTful API 风格的接口、支持分布式、可水平扩展,同时它可以被多种编程语言调用。
ES 除了进行全文检索,也支持聚合/排序。随着 ES 功能越来越强大,其和传统数据库的边界越来越模糊。我们既可以把 ES 当作搜索引擎来使用,也可以将其作为传统关系型数据库来使用。
3.发展历史
3.1 Lucene
没有 Lucene 就没有 Elasticsearch。
上图为 Doug Cutting,他是 Lucene 之父,也是 Hadoop 之父。Doug Cutting 毕业于斯坦福大学,在 Xerox 积累了一定的工作经验后,从 1997 年开始,利用业余时间开发出了 Lucene。Lucene 面世于1999年,并于 2005 年成为 Apache 顶级开源项目。
Lucene 优点:
- 基于 Java 开发的开源搜索引擎类库。
- 高性能:在相同的硬件环境下,基于 Hadoop 的 webmap(Lucene 的第一个应用)的反应速度是之前系统的 33 倍。
Lucene 的不足:
- 只能基于Java语言开发。
- 类库的接口学习和使用成本高。
- 原生并不支持水平扩展(这对于搜索引擎来说是一个非常大的问题)。
3.2 ES 发展历史
因为 Lucene 的强大但不易用,Shay Banon 在 Lucene 的基础上做了二次开发,于是 ES 诞生了。
Shay Banon 是 ElasticSearch 之父,也是 Elastic 公司的创始人。
2004 年,Shay Banon 基于Lucene 开发了 ElasticSearch 的前身 Compass。在考虑 Compass 的第三个版本时,他意识到有必要重写 Compass 的大部分内容,以“创建一个可扩展的搜索解决方案”。因此,他创建了“一个从头构建的分布式解决方案”,并使用了一个公共接口,即 HTTP 上的 JSON,它也适用于 Java 以外的编程语言。
2010 年,Shay Banon 发布了 Elasticsearch 的第一个版本。
ES多个版本可能出现破坏性变更,例如,在 6.x,ES 不允许一个 Index 中出现多个 Type。在 ES 官网,每个版本都对应着一个使用文档。
在使用 ES 之前,我们先了解下 ES 的发展简史。下面列出一些比较重大的更新版本,可以在了解了基本概念之后再看一遍。
初始版本:0.7.0 2010年5月14日
- Zen Discovery 自动发现模块
- Groovy Client支持
- 简单的插件管理机制
- 更好支持ICU分词器
1.0.0:2014年2月14日
- 支持聚合分析Aggregations
- CAT API 支持
- Doc values 引入
- 支持联盟查询
- 断路器支持
2.0.0:2015年10月28日
- query/filter 查询合并,都合并到query中,根据不同的context执行不同的查询
- 增加了 pipleline Aggregations
- 在 ES 中,有 Query 和 Filter 两种 Context
- Query Context :相关性算分
- Filter Context :不需要算分(YES OR NO), 可以利用 Cache 获得更好的性能
- 存储压缩可配置
- Rivers 模块被移除
- Multicast 组播发现成为组件
5.0.0:2016年10月26日
- Lucene 6.x 的支持,磁盘空间少一半;索引时间少一半;查询性能提升25%;支持IPV6。
- Internal engine级别移除了用于避免同一文档并发更新的竞争锁,带来15%-20%的性能提升
- Shrink API ,它可将分片数进行收缩成它的因数,如之前你是15个分片,你可以收缩成5个或者3个又或者1个,那么我们就可以想象成这样一种场景,在写入压力非常大的收集阶段,设置足够多的索引,充分利用shard的并行写能力,索引写完之后收缩成更少的shard,提高查询性能。
- 引入新的字段类型 Text/Keyword 来替换 String
- 提供了 Painless 脚本,代替Groovy脚本
- 新增 Sliced Scroll类型,现在Scroll接口可以并发来进行数据遍历了。每个Scroll请求,可以分成多个Slice请求,可以理解为切片,各Slice独立并行,利用Scroll重建或者遍历要快很多倍。
- 限制索引请求大小,避免大量并发请求压垮 ES
- 限制单个请求的 shards 数量,默认 1000 个
6.0.0:2017年8月31日
- Index sorting,即索引阶段的排序。
- 顺序号的支持,每个 es 的操作都有一个顺序编号(类似增量设计)
- 无缝滚动升级
- 逐步废弃type,在 6.0 里面,开始不支持一个 index 里面存在多个 type
- Index-template inheritance,索引版本的继承,目前索引模板是所有匹配的都会合并,这样会造成索引模板有一些冲突问题, 6.0 将会只匹配一个,索引创建时也会进行验证
- Load aware shard routing, 基于负载的请求路由,目前的搜索请求是全节点轮询,那么性能最慢的节点往往会造成整体的延迟增加,新的实现方式将基于队列的耗费时间自动调节队列长度,负载高的节点的队列长度将减少,让其他节点分摊更多的压力,搜索和索引都将基于这种机制。
- 已经关闭的索引将也支持 replica 的自动处理,确保数据可靠。
7.0.0:2019年4月10日
- 集群连接变化:TransportClient被废弃 以至于,es7的java代码,只能使用restclient
- 重大改进-正式废除单个索引下多Type的支持
- ES6 时,官方就提到了ES7会删除 type,并且 ES6 时已经规定每一个index只能有一个 type。在 ES7 中使用默认的_doc 作为 type,官方说在 8.x 版本会彻底移除 type。 API 请求方式也发生变化,如获得某索引的某ID的文档:GET index/_doc/id其中index和id为具体的值
- Lucene9.0
- 引入了真正的内存断路器,它可以更精准地检测出无法处理的请求,并防止它们使单个节点不稳定
- Zen2 是 Elasticsearch 的全新集群协调层,提高了可靠性、性能和用户体验,变得更快、更安全,并更易于使用 新功能
- New Cluster coordination
- Feature - Complete High Level REST Client
- Script Score Query
- 性能优化
- Weak-AND算法提高查询性能
- 默认的Primary Shared数从5改为1,避免 Over Sharding。shard也是一种资源,shard过多会影响集群的稳定性。因为shard过多,元信息会变多,这些元信息会占用堆内存。shard过多也会影响读写性能,因为每个读写请求都需要一个线程。所以如果index没有很大的数据量,不需要设置很多shard。
- 更快的前 k 个查询
- 间隔查询(Intervals queries) 某些搜索用例(如法律和专利搜索)引入了查找单词或短语彼此相距一定距离的记录的需要。 E S7 中的间隔查询引入了一种构建此类查询的全新方式,与之前的方法(跨度查询 span queries)相比,使用和定义更加简单。 与跨度查询相比,间隔查询对边缘情况的适应性更强。
4.Kibana
说到 ES 必须要提一下 Kibana 。
ES、Logstash 和 Kibana 共同组成 ELK。ELK 是这三个开源项目的首字母缩写。这个三个项目组合在一起,就形成了 ELK 软件栈。他们三个共同形成了一个强大的生态圈。
简单地说,Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 ES 等存储库中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。Elasticsearch 处于最核心的位置,它可以帮我们对数据进行快速地搜索及分析。
Kibana 以 Web 的形式提供了一个可视化操作 ES 的工具,负责数据展示,分析,管理,监督及应用。如支持根据 ES 数据绘制图表,ES 查询语法自动补全等高级特性,方便我们操作 ES。
事实上 Elasticsearch 的完整栈有如下的几个:
- Elasticsearch
- Kibana
- Logstash
- Beats
其中 Beats 是一个免费且开放的平台,集合了多种单一用途数据采集器。它们从成千上万台机器和系统中向 Logstash 或 Elasticsearch 发送数据。
5.小结
Elasticsearch 是一个基于 Lucene 的开源搜素和分析引擎,有很好的性能,天生支持水平个扩展。
ES 功能丰富,易于使用,即可做搜索引擎,也可做传统数据库来使用,支持多种客户端语言接入。此外,ES 拥有活跃的社区,背后还有一个强大的公司公司 Elastic 做支撑,功能在不断丰富迭代。