1.Elasticsearch的概述
Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库—无论是开源还是私有。
但是 Lucene 仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理。Lucene 非常 复杂。
Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。
然而,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确的形容:
Elasticsearch 将所有的功能打包成一个单独的服务,这样你可以通过程序与它提供的简单的 RESTful API 进行通信, 可以使用自己喜欢的编程语言充当 web 客户端,甚至可以使用命令行(去充当这个客户端)。
就 Elasticsearch 而言,起步很简单。对于初学者来说,它预设了一些适当的默认值,并隐藏了复杂的搜索理论知识。 它 开箱即用 。只需最少的理解,你很快就能具有生产力。
随着你知识的积累,你可以利用 Elasticsearch 更多的高级特性,它的整个引擎是可配置并且灵活的。 从众多高级特性中,挑选恰当去修饰的 Elasticsearch,使它能解决你本地遇到的问题。
2. Elasticsearch可以做什么
当你经营一家网上商店,你可以让你的客户搜索你卖的商品。在这种情况下,你可以使用ElasticSearch来存储你的整个产品目录和库存信息,为客户提供精准搜索,可以为客户推荐相关商品。
当你想收集日志或者交易数据的时候,需要分析和挖掘这些数据,寻找趋势,进行统计,总结,或发现异常。在这种情况下,你可以使用Logstash或者其他工具来进行收集数据,当这引起数据存储到ElasticsSearch中。你可以搜索和汇总这些数据,找到任何你感兴趣的信息。
对于程序员来说,比较有名的案例是GitHub,GitHub的搜索是基于ElasticSearch构建的,在github.com/search页面,你可以搜索项目、用户、issue、pull request,还有代码。共有40~50个索引库,分别用于索引网站需要跟踪的各种数据。虽然只索引项目的主分支(master),但这个数据量依然巨大,包括20亿个索引文档,30TB的索引文件。
Elasticsearch详细功能列表,参考官网:https://www.elastic.co/cn/elasticsearch/features
3. Elasticsearch的基本概念
3.1 Cluster 集群
ES集群是一个或多个节点的集合,它们共同存储了整个数据集,并提供了联合索引以及可跨所有节点的搜索能力。
多节点组成的集群拥有冗余能力,它可以在一个或几个节点出现故障时保证服务的整体可用性。
集群靠其独有的名称进行标识,默认名称为“elasticsearch”。节点靠其集群名称来决定加入哪个ES集群,一个节点只能属一个集群。
如果不考虑冗余能力等特性,仅有一个节点的ES集群一样可以实现所有的存储及搜索功能。
集群具有高可用、可扩展的特性:
a)服务可用性:允许有节点停止服务;
b)数据可用性:部分节点丢失,不会丢失数据;
c) 可扩展性:随着请求量的不断提升,数据量的不断增长,系统可以将数据分布到其他节点,实现水平扩展;
集群健康状态:
green:所有主要分片和复制分片都可用
yellow:所有主要分片可用,但不是所有复制分片都可用
red:不是所有的主要分片都可用,当集群状态为 red,它仍然正常提供服务,它会在现有存活分片中执行请求,我们需要尽快修复故障分片,防止查询数据的丢失
3.2 Node节点
Node 是组成集群的一个单独的服务器(就是一个Java进程),用于存储数据并提供集群的搜索和索引功能。如果只启动了一个节点,则会形成一个单节点的集群。
节点启动时自动生成的随机的节点名称,用户可以按需要自定义任何希望使用的名称,但出于管理的目的,此名称应该尽可能有较好的识别性。
节点通过为其配置的ES集群名称确定其所要加入的集群。
官网对Node的介绍:https://www.elastic.co/guide/en/elasticsearch/reference/7.x/modules-node.html
几种节点类型:
Master-eligible Node和Master Node
每个节点启动后,默认就是Master eligible nodes节点,可设置node.master:false禁止
Master-eligible节点可以参加选主流程,成为Master节点
当第一个节点启动的时候,它会将自己选举成Master节点
每个节点上都保存了集群的状态,只有Master节点才能修改集群的状态信息(任意节点都能修改集群的状态信息会导致数据不一致性),集群状态(Cluster State)维护了一个集群中的必要信息:所有的节点信息、所有的索引和其相关的Mapping与Setting信息、分片的路由信息
Data Node和Coordinating Node
Data Node:可以保存数据的节点,叫做Data Node。负责保存分片数据。在数据扩展上起到了至关重要的作用
Coordinating Node:负责接收Client的请求,将请求分发到合适的节点,最终把结果汇集到一起,每个节点默认都起到了Coordinating Node的职责
Hot Node和Warm Node
不同硬件配置的Data Node,用来实现Hot & Warm架构, 降低集群部署的成本
Machine Learning Node
负责跑机器学习的Job,用来做异常检测
Tribe Node
5.3开始使用Cross Cluster Search,Tribe Node连接到不同的Elasticsearch集群,并且支持将这些集群当成一个单独的集群处理
3.3 Shards & Replicas分片与副本
一个分片是一个lucene index(此处的index是lucene自己的概念,与ES的index不是一回事);
主分片数是在索引创建时指定,后续不允许修改,除非Reindex;
一个索引中的数据保存在多个分片中(默认为一个),相当于水平分表。一个分片便是一个Lucene 的实例,它本身就是一个完整的搜索引擎。我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。
节点、索引、分片的关系:
一个节点对应一个ES实例;
一个节点可以有多个index(索引);
一个index可以有多个shard(分片);
Shards分片的重要性主要体现在以下两个特征:
分片允许您水平拆分或缩放内容的大小
分片允许你分配和并行操作的碎片(可能在多个节点上)从而提高性能/吞吐量
这个机制中的碎片是分布式的以及其文件汇总到搜索请求是完全由ElasticSearch管理,对用户来说是透明的。
在同一个集群网络或云环境上,故障是任何时候都会出现的,拥有一个故障转移机制以防分片和结点因为某些原因离线或消失是非常有用的,并且被强烈推荐。为此,Elasticsearch允许你创建一个或多个拷贝,你的索引分片进入所谓的副本或称作复制品的分片,简称Replicas。
副本有两个重要作用:
1、服务高可用:由于数据只有一份,如果一个node挂了,那存在上面的数据就都丢了,有了replicas,只要不是存储这条数据的node全挂了,数据就不会丢。因此分片副本不会与主分片分配到同一个节点;
2、扩展性能:通过在所有replicas上并行搜索提高搜索性能.由于replicas上的数据是近实时的(near realtime),因此所有replicas都能提供搜索功能,通过设置合理的replicas数量可以提高搜索吞吐量
3.4 Index索引
索引是文档的容器,是一类文档的集合,类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库(Database)
Mapping - 每个索引都有自己文档字段类型的定义
Setting - 每个索引可设置自己的数据分布等
3.5 Type类型
Type 可以理解成关系数据库中Table。6.0.0仍然兼容多type,但不建议使用。7.0.0以后完全移除多type结构,弃用该概念的原因:
我们虽然可以通俗的去理解Index比作 SQL 的 Database,Type比作SQL的Table。但这并不准确,因为如果在SQL中,Table 之前相互独立,同名的字段在两个表中毫无关系。
但是在ES中,同一个Index 下不同的 Type 如果有同名的字段,他们会被 Luecence 当作同一个字段 ,并且他们的定义必须相同。所以我觉得Index现在更像一个表,
而Type字段并没有多少意义。目前Type已经被Deprecated,在7.0开始,一个索引只能建一个Type为_doc
3.6 Document文档
Elasticsearch是面向文档的,文档是所有可搜索的最小单位。
文档会被序列化成JSON格式,保存在Elasticsearch中,格式灵活,支持数组和嵌套。
每个文档都有一个Unique ID,可以指定也可以自动生成。每个文档都有元数据, _index、_type、_id、_version、_score等。
上述是Elasticsearch的一些基本概念,理解这些概念对使用ES将有很大的帮助。
参考:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html