ElasticSearch是一款非常强大的、基于Lucene的开源搜索及分析引擎;它是一个实时的分布式搜索分析引擎,它能让你以前所未有的速度和规模,去探索你的数据。
它被用作全文检索、结构化搜索、分析以及这三个功能的组合:
Wikipedia_使用 Elasticsearch 提供带有高亮片段的全文搜索,还有 search-as-you-type 和 did-you-mean 的建议。
卫报使用 Elasticsearch 将网络社交数据结合到访客日志中,为它的编辑们提供公众对于新文章的实时反馈。
Stack Overflow_将地理位置查询融入全文检索中去,并且使用 more-like-this 接口去查找相关的问题和回答。
GitHub_使用 Elasticsearch 对1300亿行代码进行查询。
除了搜索,结合Kibana、Logstash、Beats开源产品,Elastic Stack(简称ELK)还被广泛运用在大数据近实时分析领域,包括:日志分析、指标监控、信息安全等。它可以帮助你探索海量结构化、非结构化数据,按需创建可视化报表,对监控数据设置报警阈值,通过使用机器学习,自动识别异常状况。
ElasticSearch是基于Restful WebApi,使用Java语言开发的搜索引擎库类,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。其客户端在Java、C#、PHP、Python等许多语言中都是可用的。
所以,ElasticSearch具备两个优势:
天生支持分布式,可水平扩展;
提供了Restful接口,降低全文检索的学习曲线,因为Restful接口,所以可以被任何编程语言调用;
ElasticSearch是基于Lucene的,那么为什么不是直接使用Lucene呢?
Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库。
但是 Lucene 仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理。Lucene 非常 复杂。
我们在哪些场景下可以使用ES呢?
1)海量数据的分布式存储以及集群管理,达到了服务与数据的高可用以及水平扩展;
2)近实时搜索,性能卓越。对结构化、全文、地理位置等类型数据的处理;
3)海量数据的近实时分析(聚合功能)
1)网站搜索、垂直搜索、代码搜索;
2)日志管理与分析、安全指标监控、应用性能监控、Web抓取舆情分析;
我们还需对比结构化数据库,看看ES的基础概念,为我们后面学习作铺垫。
Near Realtime(NRT) 近实时。数据提交索引后,立马就可以搜索到。
Cluster 集群,一个集群由一个唯一的名字标识,默认为“elasticsearch”。集群名称非常重要,具有相同集群名的节点才会组成一个集群。集群名称可以在配置文件中指定。
Node 节点:存储集群的数据,参与集群的索引和搜索功能。像集群有名字,节点也有自己的名称,默认在启动时会以一个随机的UUID的前七个字符作为节点的名字,你可以为其指定任意的名字。通过集群名在网络中发现同伴组成集群。一个节点也可是集群。
Index 索引: 一个索引是一个文档的集合(等同于solr中的集合)。每个索引有唯一的名字,通过这个名字来操作它。一个集群中可以有任意多个索引。
Type 类型:指在一个索引中,可以索引不同类型的文档,如用户数据、博客数据。从6.0.0 版本起已废弃,一个索引中只存放一类数据。
Document 文档:被索引的一条数据,索引的基本信息单元,以JSON格式来表示。
Shard 分片:在创建一个索引时可以指定分成多少个分片来存储。每个分片本身也是一个功能完善且独立的“索引”,可以被放置在集群的任意节点上。
Replication 备份: 一个分片可以有多个备份(副本)
ElasticSearch是面向文档的,文档是所有可搜索数据的最小单位。例如:
日志文件中的日志项;
一张唱片的详细信息;
一篇文章中的具体内容;
在ElasticSearch中,文档会被序列化成Json格式:
Json对象是由字段组成的;
每个字段都有对应的字段类型(如:字符串、数值、日期类型等);
每个文档都有一个唯一的ID(Unique ID)
可以自己指定此ID;
也可以通过ElasticSearch自动生成;
我们可以将文档理解成关系型数据库中的一条数据记录,一条记录包含了一系列的字段。
Json文档的格式不需要预先定义
字段的类型可以指定或者由ElasticSearch自动推算;
Json支持数组、支持嵌套;
每一个文档中都包含有一份元数据,元数据的作用主要是用来标注文档的相关信息,如:
_index
:文档所属的索引名;
_type
:文档所属的类型名(从7.0开始,每一个索引只能创建一个Type:_doc
,在此之前一个索引是可以设置多个Type的);
_id
:文档的Unqie Id;
_source
:文档的原始Json数据;
_version
:文档的版本信息;
_score
:文档的相关性算分;
索引指的就是一类文档的集合,相当于文档的容器。
索引体现了逻辑空间的概念,每个索引都有自己的Mapping定义,用来定义所包含的文档的字段名和字段类型;
索引中的数据(文档)分散在Shard(分片)上,Shard体现了物理空间的概念;
ElasticSearch集群实际上是一个分布式系统,而分布式系统需要具备两个特性:
高可用性
服务可用性:允许有节点停止服务;
数据可用性:部分节点丢失,不会丢失数据;
可扩展性
随着请求量的不断提升,数据量的不断增长,系统可以将数据分布到其他节点,实现水平扩展;
ElasticSearch的集群通过不同的名字来进行区分,默认名字“elasticsearch”;可以通过配置文件修改或者命令行修改:-E cluster.name=test
一个集群中可以有一个或者多个节点。
节点是什么?
节点是一个ElasticSearch的实例,其本质就是一个Java进程;
一台机器上可以运行多个ElasticSearch实例,但是建议在生产环境中一台机器上只运行一个ElasticSearch实例;
每个节点都有名字,可以通过配置文件进行配置,也可以通过命令行进行指定,如:**-E node.name=node1**
每个节点在启动之后,会被分配一个UID,保存在data目录下;
Master-Eligible【有资格、胜任者】 Node与Master Node的说明:
每个节点启动之后,默认就是一个Master Eligible节点,当然可以在配置文件中将其禁止,node.master:false
Master-Eligible Node可以参加选主流程,成为Master Node;
当第一个节点启动时,它会将其选举为Master Node;
每个节点都保存了集群状态,但只有Master Node才能修改集群的状态,包括如下:
所有的节点信息;
所有的索引和其相关的Mapping与Setting信息;
分片的路由信息;
Data Node与Coordinating【协调、整合】 Node的说明:
Data Node:可以保存数据的节点,负责保存分片数据,在数据扩展上起到至关重要的作用;
Coordinating Node:它通过接受Rest Client的请求,会将请求分发到合适的节点,最终将结果汇集到一起,再返回给Client;
每个节点都默认起到Coordinating Node的职责;
Hot Node(热节点)与Warm Node(冷节点)的说明:
Hot Node:有更好配置的节点,其有更好的资源配置,如磁盘吞吐、CPU速度;
Warm Node:资源配置较低的节点;
Machine Learning Node:负责机器学习的节点,常用来做异常检测;
可以解决数据水平扩展的问题,通过主分片,可以将数据分布到集群内的所有节点之上。
一个主分片是一个运行的Lucene的实例;
注意:
一个节点对应一个ES实例;
一个节点可以有多个index(索引);
一个index可以有多个shard(分片);
一个分片是一个lucene index(此处的index是lucene自己的概念,与ES的index不是一回事);
主分片数是在索引创建时指定,后续不允许修改,除非Reindex;
可以解决数据高可用的问题,它是主分片的拷贝。
副本分片数可以动态调整;
增加副本数,在一定程度上可以提高服务的可用性;
对于生产环境中分片的设定,需要提前做好容量规划,因为主分片数是在索引创建时预先设定的,后续无法修改。
分片数设置过小
导致后续无法增加节点进行水平扩展。
导致分片的数据量太大,数据在重新分配时耗时;
分片数设置过大
影响搜索结果的相关性打分,影响统计结果的准确性;
单个节点上过多的分片,会导致资源浪费,同时也会影响性能;