一、ElasticSearch是什么?
二、ElasticSearch基本概念
- 1. 全文搜索(Full-text Search)
- 2. NRT
- 3. Cluster
- 4. Node
- 5. shard
- 6. replica
- 7. 节点 & 集群(Node & Cluster)
- 8. 索引(Index)
- 9. 文档(Document)
- 10. 类型(Type)
- 11. 文档元数据(Document metadata)
- 12. 字段(Fields)
三、ElastichSearch核心概念 - 详细看附录7
1. 倒排索引(Inverted Index)
2. ES集群架构
3. ES发现机制
- 3.1 分布式以及 Elastic
- 3.2 分片(Shard)以及副本(Replica)
- 3.3 恢复以及容灾
- 3.4 选主
- 3.5 脑裂
4. ES存储机制
- 4.1 简单的文件系统存储
- 4.2 MMap文件系统存储
- 4.3 内存存储
- 4.4 默认存储类型
5. ES恢复机制
6. 索引写入
四、ElasticSearch基本使用 - 观看附录2
五、ElasticSearch应用场景
六、ElasticSearch面试题 -- 答案附录4
七、ElasticStack -- 参考附录3
## 一、ElasticSearch是什么?Elasticsearch是一个开源的分布式、RESTful 风格的搜索和数据分析引擎,它的底层是开源库Apache Lucene。
Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库——无论是开源还是私有,但它也仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理,因为Lucene 非常复杂。
为了解决Lucene使用时的繁复性,于是Elasticsearch便应运而生。它使用 Java 编写,内部采用 Lucene 做索引与搜索,但是它的目标是使全文检索变得更简单,简单来说,就是对Lucene 做了一层封装,它提供了一套简单一致的 RESTful API 来帮助我们实现存储和检索。
当然,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确地形容:
- 1. 一个分布式的实时文档存储,每个字段可以被索引与搜索;
- 2. 一个分布式实时分析搜索引擎;
- 3. 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据。
全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。
在全文搜索的世界中,存在着几个庞大的帝国,也就是主流工具,主要有:
- 1. Apache Lucene
- 2. Elasticsearch
- 3. Solr
- 4. Ferret
Near Realtime,近实时,有两个层面的含义,一是从写入一条数据到这条数据可以被搜索,有一段非常小的延迟(大约1秒左右),二是基于Elasticsearch的搜索和分析操作,耗时可以达到秒级。
### 3. Cluster集群,对外提供索引和搜索的服务,包含一个或多个节点,每个节点属于哪个集群是通过集群名称来决定的(默认名称是elasticsearch),集群名称搞错了后果很严重。命名建议是研发、测试环境、准生产、生产环境用不同的名称增加区分度,例如研发使用es-dev,测试使用es-test,准生产使用es-stg,生产环境使用es-pro这样的名字来区分。如果是中小型应用,集群可以只有一个节点。
### 4. Node单独一个Elasticsearch服务器实例称为一个node,node是集群的一部分,每个node有独立的名称,默认是启动时获取一个UUID作为名称,也可以自行配置,node名称特别重要,Elasticsearch集群是通过node名称进行管理和通信的,一个node只能加入一个Elasticsearch集群当中,集群提供完整的数据存储,索引和搜索的功能,它下面的每个node分摊上述功能(每条数据都会索引到node上)。
### 5. shard分片,是单个Lucene索引,由于单台机器的存储容量是有限的(如1TB),而Elasticsearch索引的数据可能特别大(PB级别,并且30GB/天的写入量),单台机器无法存储全部数据,就需要将索引中的数据切分为多个shard,分布在多台服务器上存储。利用shard可以很好地进行横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升集群整体的吞吐量和性能。
shard在使用时比较简单,只需要在创建索引时指定shard的数量即可,剩下的都交给Elasticsearch来完成,只是创建索引时一旦指定shard数量,后期就不能再更改了。
### 6. replica索引副本,完全拷贝shard的内容,shard与replica的关系可以是一对多,同一个shard可以有一个或多个replica,并且同一个shard下的replica数据完全一样,replica作为shard的数据拷贝,承担以下三个任务:
- 1. shard故障或宕机时,其中一个replica可以升级成shard。
- 2. replica保证数据不丢失(冗余机制),保证高可用。
- 3. replica可以分担搜索请求,提升整个集群的吞吐量和性能。
shard的全称叫primary shard,replica全称叫replica shard,primary shard数量在创建索引时指定,后期不能修改,replica shard后期可以修改。默认每个索引的primary shard值为5,replica shard值为1,含义是5个primary shard,5个replica shard,共10个shard。
因此Elasticsearch最小的高可用配置是2台服务器。
### 7. 节点 & 集群(Node & Cluster)Elasticsearch 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个Elasticsearch实例。单个Elasticsearch实例称为一个节点(Node),一组节点构成一个集群(Cluster)。
### 8. 索引(Index)Elasticsearch 数据管理的顶层单位就叫做 Index(索引),相当于关系型数据库里的数据库的概念。另外,每个Index的名字必须是小写。
### 9. 文档(Document)Index里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。Document 使用 JSON 格式表示。同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。
### 10. 类型(Type)1. Document 可以分组,比如employee这个 Index 里面,可以按部门分组,也可以按职级分组。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document,类似关系型数据库中的数据表。
2. 不同的 Type 应该有相似的结构(Schema),性质完全不同的数据(比如 products 和 logs)应该存成两个 Index,而不是一个 Index 里面的两个 Type(虽然可以做到)。
### 11. 文档元数据(Document metadata)文档元数据为_index, _type, _id, 这三者可以唯一表示一个文档,_index表示文档在哪存放,_type表示文档的对象类别,_id为文档的唯一标识。
### 12. 字段(Fields)1. 每个Document都类似一个JSON结构,它包含了许多字段,每个字段都有其对应的值,多个字段组成了一个 Document,可以类比关系型数据库数据表中的字段。
2. 在 Elasticsearch 中,文档(Document)归属于一种类型(Type),而这些类型存在于索引(Index)中,下图展示了Elasticsearch与传统关系型数据库的类比:
## 三、ElastichSearch核心概念 - 详细看附录7### 1. 倒排索引(Inverted Index)该索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。Elasticsearch能够实现快速、高效的搜索功能,正是基于倒排索引原理。
倒排索引的组成:
- 1. 单词词典(Term Dictionary)
- 2. 倒排列表(Posting List)
我们知道了词典和倒排文件是Lucene的两种基本数据结构,但是它们的存储方式截然不同,词典存储在内存中,倒排文件在磁盘上。
### 2. ES集群架构一个ES集群可以有多个节点构成,一个节点就是一个ES服务实例,通过配置集群名称cluster.name加入集群。节点为什么用过配置就能加入到集群中呢?我们来探究一下:
ES中节点有角色的区分,角色的区分是在conf/elasticsearch.yml中的配置来决定的
1. node.master: true/false
2. node.data: true/false
集群中的单个节点既可以是候选主节点也可以是数据节点,两两组合会有四种分类:
- 1. 仅为候选主节点
- 2. 仅为数据节点
- 3. 既是候选主节点也是数据节点
- 4. 既不是候选主节点也不是数据节点
主节点
主节点负责索引的添加、删除,监控哪些节点是集群的一部分,对分片进行分配、收集集群中各个节点的状态等,稳定的主节点对集群的健康非常重要。
候选主节点
当主节点死掉,只有候选主节点才能参与选举投票产生,也就是说候选主节点才可以被选举为主节点。
数据节点
数据节点主要负责对数据的增删改查聚合等操作,数据的查询以及存储都是由数据节点负责的,涉及到数据节点的,必须对机器的CPU、IO和内存有着相对高的要求。
协调节点
还有一种节点--协调节点,其本身不是通过设置来分配的,用户的请求可以随机发往任何一个节点,并由该节点负责分发请求、收集结果等一系列操作,而不需要主节点的转发。这种节点称之为协调节点。集群中任意节点都充当着协调节点的角色,节点之间也相互保持着联系。