我正在参加「掘金·启航计划」
ElasticeSarch的概述
什么是ElasticSearch?
Elasticsearch 是一个分布式、RESTful 风格、基于Lucene的搜索和数据分析引擎,Elasticsearch 会集中存储您的数据,让您飞快完成搜索,微调相关性,进行强大的分析,并轻松缩放规模。
- ElasticSearch常用作为全文检索、数据分析的工具。
- ElasticSearch和 Elasticsearch、Kibana、Beats 和 Logstash等开源产品并称为 Elastic Stack(ELK),能够安全可靠地从任何来源获取任何格式的数据,然后对数据进行搜索、分析和可视化。
- ElasticSearch是基于Restful WebApi,使用Java语言开发的搜索引擎库类,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。其客户端在Java、C#、PHP、Python等许多语言中都是可用的。
为什么需要学ElasticSearch?
- ElasticSearch是一个开源搜索引擎,具有良好用户社区以及不断增长的贡献者社区。
- 软件开发中,搜索功能是一个非常重要的功能,Elasticsearch掌握近实时的搜索和分析能力,才能刚有效管理分析数据。
- ElasticSearch开发学习成本低,使用起来非常便捷高效。
- 很多国内大厂都在使用,并有ElasticSearch云产品推出。
ElasticSearch的主要功能和应用场景?
ElasticSearch主要功能,官网描述如下
- ElasticSearch具有海量数据的分布式存储以及集群管理,达到了服务与数据的高可用以及水平扩展。
- ElasticSearch具有有较好的安全性,具有很好的监控管理的功能,并且兼容开发语言丰富。
- ElasticSearch具有近实时搜索,性能卓越。对结构化、全文、地理位置等类型数据,做到高效处理。
ElasticSearch主要应用场景,官网描述如下
- 日志管理与分析、安全指标监控、系统应用性能监控。
- 网站全文检索、大数据分析、地理空间数据可视化
ElasticSearch与Solr的对比?
Elasticsearch 和 Solr,这两款都是基于 Lucene 搭建的,可以独立部署启动的搜索引擎服务软件。由于内核相同,所以两者除了服务器安装、部署、管理、集群以外,对于数据的操作 修改、添加、保存、查询等等都十分类似。
ElasticSearch的区别
- ElasticSearch是分布式的,自带分布式协调管理功能,不需要其他组件。Solr则是利用Zookeeper进行分布式管理。
- ElasticSearch安装配置基于 JSON 较为简单,更易于上手,而Solr颗粒度具有细化的配置。
- Solr建立索引会产生io阻塞,查询性能较差, 搜索效率下降。实时搜索效率不高,es实时搜索效率高。
- ElasticSearch在数据监控和指标上更优于Solr。
- Solr支持更多格式的数据,比如JSON、XML、CSV,而Elasticsearch仅支持json文件格式。
- Solr更加适合于传统搜索应用,并且有完善的文档和示例,Elasticsearch适合实时海量数据检索。
ElasticeSarch基本概念
MYSQL | ElasticSearch |
---|---|
数据库(database) | 索引(index) |
表(table) | 类型(type)6.0后舍弃 |
行(row) | 文档(document) |
列(column) | 字段(filed) |
正向索引 | 倒排索引 |
SQL | DSL |
SELECT ... | GET http://... |
UPDATE ... | PUT http://... |
DELETE | DELETE http://... |
索引(Index)
- 一个索引是一个文档的集合,每个索引有唯一的名字,通过名字来操作索引和索引下的文档。类似通过字典的目录来查询数据。
类型(Type)
- 指在一个索引中,可以索引不同类型的文档,如用户数据、博客数据。从6.0.0 版本起已废弃,一个索引中只存放一类数据。
文档(Document)
- 被索引的一条数据,索引的基本信息单元,以JSON格式来表示。
字段(Filed)
- 相当于是数据表的字段,对文档数据根据不同属性进行的分类标识。
映射(Mapper)
- mapping 是处理数据的方式和规则方面做一些限制,如:某个字段的数据类型、默认值、分析器、是否被检索等等。
分片(Shards)
一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有 10 亿文档数据的索引占据 1TB 的磁盘空间,而任一节点都可能没有这样大的磁盘空间。或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch 提供了将索引划分成多份的能力,每一份就称之为分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的「索引」,这个「索引」可以被放置到集群中的任何节点上。
分片很重要,主要有两方面的原因:
- 允许你水平分割/扩展你的内容容量
- 允许你在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量
至于一个分片怎样分布,它的文档怎样聚合和搜索请求,是完全由 Elasticsearch 管理的,对于作为用户的你来说,这些都是透明的,无需过分关心。
如同完整的大数据,分割成多个小数据,分布到不同的地方,小数据就是分片,所有的分片合起来就是完整的数据
被混淆的概念是:一个 Lucene 索引,我们在 Elasticsearch 称作分片。一个 Elasticsearch 索引是分片的集合。当 Elasticsearch 在索引中搜索的时候,他发送查询到每一个属于索引的分片(Lucene 索引),然后合并每个分片的结果到一个全局的结果集
副本(Replicas)
一个分片可以有多个备份(副本),副本主要解决了两个问题
- 在节点/分片挂掉的情况下,可以保证数据的访问,提供了高可用。
- 拓展了程序的吞吐量,搜索可以在所有副本中并行运行,降低了主节点的压力。
系统架构
Elasticsearch是采用主从同步,负载均衡的架构模式。
当一个节点被选举成为主节点时, 它将负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。任何节点都可以成为主节点。我们的示例集群就只有一个节点,所以它同时也成为了主节点。
作为用户,我们可以将请求发送到集群中的任何节点,包括主节点。每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回給客户端。Elasticsearch 对这一切的管理都是透明的。