Elasticsearch介绍,包括文档与索引、倒排索引、搜索和分析、可伸缩和弹性(节点、分片、跨集群复制)。
内容大部分源自官方文档第一节“What is Elasticsearch?”
基于7.11版本。
Elasticsearch是一个分布式搜索和分析引擎,为所有类型的数据提供了近实时的搜索和分析。不仅可以进行简单的数据探索,还可以汇总信息来发现数据中的趋势和模式。随着数据和查询量的增长,分布式特性可以使部署顺畅的无缝的增长。
目录
1. 文档和索引
文档(Document)
Elasticsearch是分布式文档存储,它不会将信息存储为“行-列”数据结构,而是存储为JSON文档的数据结构。当一个集群中有多个节点时,存储的文档分布在集群中,并且可以从任何节点访问。
Elasticsearch使用倒排索引的数据结构,支持非常快速的全文本搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。
索引(Index)
索引是一个逻辑命名空间,可以看作是文档的优化集合,每个文档都是字段的集合。默认Elasticsearch对每个字段中的所有数据建立索引,并且每个索引字段都具有专用的优化数据结构。如:文本字段存储在倒排索引中,数字、地理字段存储在BKD树中。
Elasticsearch还支持动态映射(dynamic mapping),自动检测并向索引添加新字段。可以定义规则来控制动态映射,也可以显式定义映射以完全控制字段的存储和索引方式。
显式定义映射的意义:
- 区分全文本字符串字段和精确值字符串字段
- 执行特定语言的文本分析
- 优化字段进行部分匹配
- 自定义日期格式
- 无法自动检测到的数据类型,如地理信息
为不同的目的以不同的方式对同一字段建立索引通常很有用。
倒排索引(inverted index)
倒排索引的结构,适用于快速的全文(Text)搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。
倒排索引建立的是分词(Term)和文档(Document)之间的映射关系,在倒排索引中,数据是面向词而不是面向文档的。
- Term(词):精准值,foo、Foo是不相同的词
- Text(文本):非结构化文本,默认文本会被解析为词,这是索引中实际存储的内容
Elasticsearch索引存储结构图:
一个索引包含很多分片,一个分片是一个Lucene索引,它本身就是一个完整的搜索引擎,可以独立执行建立索引和搜索任务。
Lucene索引又由很多分段组成,每个分段都是一个倒排索引。 Elasticsearch每次refresh都会生成一个新的分段,其中包含若干文档的数据。
每个分段(Segment)内部,文档的不同字段被单独建立索引。每个字段的值由若干词(Term)组成。
词(Term)是原文本内容经过分词器处理和语言处理后的最终结果。
2. 搜索和分析
搜索(Search)
Elasticsearch提供了一个简单,一致的REST API,用于管理集群以及建立索引和搜索数据。
REST APIs支持结构化查询、全文本查询和结合了两者的复杂查询。
- 结构化查询:类似于SQL构建的查询,按索引中搜索字段,然后按字段对匹配项进行排序。
- 全文本查询:查找到所有与查询字符串匹配的文档,按相关性对它们进行排序。
可以使用Elasticsearch的全面JSON风格的查询语言(Query DSL)访问所有这些搜索功能。还可以构造SQL风格的查询来在Elasticsearch内部本地搜索和聚合数据。
分析(Analyze)
聚合使您能够构建数据的复杂摘要,并深入了解关键指标,模式和趋势。聚合利用了用于搜索的相同数据结构,速度很快,可以实时分析和可视化数据。聚合操作和搜索的请求在一起运行,可以在单个请求中同一时间相同的数据进行搜索文档,过滤结果并执行分析。
3. 可伸缩和弹性
集群(Cluster)
一个Elasticsearch集群由一个或多个节点(Node)组成,每个集群都有一个cluster name作为标识。
集群的三种状态:
- Green:所有主分片和副本分片都准备就绪。数据不会丢失
- Yellow:所有主分片准备就绪,但至少一个主分片对应的副本分片没有就绪。意味着高可用和容灾能力下降
- Red:至少有一个主分片没有就绪。此时查询的结果会出现数据丢失
Elasticsearch可以根据需要进行扩展,它天生就实现了分布式。你可以向集群添加节点以增加容量,它会自动将数据和查询负载分布到所有可用节点,不需要大改应用程序。
Elasticsearch索引只是一个或多个物理分片的逻辑分组,其中每个分片实际上是一个独立的的索引。通过将文档分布在索引中的多个分片上,并将这些分片分布在多个节点上,当集群增长(或缩小)时,Elasticsearch自动迁移分片以平衡集群。
节点(Node)
节点是属于集群的运行实例,测试时可以一个服务器上启动多个节点,线上通常一个服务器只有一个实例。
启动时,节点将使用单播来发现具有相同集群名称的现有集群,并尝试加入。
- 候选主节点(Master-eligible Node)
- 主节点(Master Node)
- 数据节点(Data Node)
- 协调节点(Coordinating Node)
- 热节点(Hot Node)
- 冷节点(Warm Node)
- 预处理节点(Ingest Node)
分片(Shard)
分片是单个Lucene实例。这是一个低级的工作单元,由ElasticSearch自动管理,在节点发生故障或新增时,可以自动的将分片从一个节点移动到另一个节点。分为主分片(primaries)和副本分片(replicas)两种类型。
- 主分片:建立索引时默认会有一个主分片,每个文档都属于一个主分片,创建索引后,主分片数量是固定的无法更改。
- 副本分片:每个主分片可以有零个或多个副本,可以随时更改,副本永远不会和主分片在同一节点上启动。副本提供数据的冗余副本,以防止硬件故障,并增加处理像搜索或检索文档这样的读请求的能力。
跨集群复制(Cross-cluster replication)
出于性能原因,群集中的节点必须位于同一网络上,跨不同数据中心中的节点在群集中平衡分片的时间太长了。但是这不符合高可用架构的要求,跨群集复制(CCR)可以解决单个集群重大故障问题。
CCR提供了一种将主集群的索引自动同步到次要远程集群的方法,次要远程集群可以作为热备份。如果主集群失败,次要集群可以接管。您还可以使用CCR创建次要集群,以满足用户在地理位置上接近的读请求。主集群上的索引是Leader,负责所有写请求,复制到次要集群上的索引是只读的Follower。