作者:除了祝福我能怎么办_218 | 来源:互联网 | 2023-06-30 20:42
Elasticsearch是一个基于ApacheLucene™的分布式可扩展的实时搜索和分析引擎。优点实时分析的分布式搜索引擎,效率极高。可以扩展到上百台服务器,处理PB级别的结构
Elasticsearch是一个基于Apache Lucene™的分布式可扩展的实时搜索和分析引擎。
优点
实时分析的分布式搜索引擎,效率极高。
可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。
它是一个面向文档的数据库,既然是数据库那就来说一下它和数据库的对应关系:
|
|
|
|
|
关系型数据库 |
数据库 |
表 |
行 |
列 |
ElasticSearch |
索引 |
类型 |
文档 |
字段 |
Elasticsearch是如何做到快速索引的呢?
Elasticsearch采用了倒排索引的方式,这种方式比传统的关系型数据库中采用的B-Tree和B+Tree要快。
举个例子,如下图:
此时我们再使用“生化机”来进行搜索,则会
基本概念
-
Cluster:集群,包含多个节点,每个节点属于哪个集群是通过一个配置文件(elasticsearch.yml)来决定的,默认集群名称:elasticsearch;对于一些中小企业,一开始一个集群就一个节点很正常。
-
节点(node): 一个节点是一个逻辑上独立的服务,可以存储数据,并参与集群的索引和搜索功能, 一个节点也有唯一的名字,群集通过节点名称进行管理和通信.
主节点:主节点的主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康是非常重要的。虽然主节点也可以协调节点,路由搜索和从客户端新增数据到数据节点,但最好不要使用这些专用的主节点。一个重要的原则是,尽可能做尽量少的工作。
数据节点:持有数据和倒排索引。
-
索引(Index)
ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库,或者一个数据存储方案(schema)。索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。一个ES集群中可以按需创建任意数目的索引。
-
type:类型是索引内部的逻辑分区(category/partition),然而其意义完全取决于用户需求。一般来说,类型就是为那些拥有相同的域的文档做的预定义。类比传统的关系型数据库领域来说,类型相当于“表”。
-
Document:文档,ES中最小的数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常使用JSON数据结构来表示,每个index下的type中都可以存储1个或者多个document。一个document中会包含1个或者多个field,每个field就是一个数据字段。
-
shard:分片,单台服务器无法存放大量数据,ES可以将一个index中的数据切分为多个shard,每个shard存放该index的一部分数据,这些shard会散落在多台服务器上面。
shard的作用:
1)横向扩展,比如说目前有一份数据,3T,起初创建index时,创建了3个shard,每个shard存储1T,那么此时数据量增加到4T,只需要重新创建一个4个shard的索引,将数据导入即可;
2)数据分布在多个shard,多台服务器上,所有的操作,都会在多台服务器上并行分布式执行,提升吞吐量和性能
-
replica:副本,任何一个服务器随时可能故障或者宕机,此时shard可能会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。
replica的作用:
1)高可用性,一个shard宕机,数据不会丢失,服务继续提供;
2)提升搜索的吞吐量和性能;
写操作
-
索引新文档(Create)
当用户向一个节点提交了一个索引新文档的请求,节点会计算新文档应该加入到哪个分片(shard)中。每个节点都存储有每个分片存储在哪个节点的信息,因此协调节点会将请求发送给对应的节点。注意这个请求会发送给主分片,等主分片完成索引,会并行将请求发送到其所有副本分片,保证每个分片都持有最新数据。
每次写入新文档时,都会先写入内存中,并将这一操作写入一个translog文件(transaction log)中,此时如果执行搜索操作,这个新文档还不能被索引到。
-
刷新(refresh)
ES会每隔1秒时间(这个时间可以修改)进行一次刷新操作(refresh),此时在这1秒时间内写入内存的新文档都会被写入一个文件系统缓存(filesystem cache)中,并构成一个分段(segment)。此时这个segment里的文档可以被搜索到,但是尚未写入硬盘,即如果此时发生断电,则这些文档可能会丢失。
不断有新的文档写入,则这一过程将不断重复执行。每隔一秒将生成一个新的segment,而translog文件将越来越大。
-
flush
每隔30分钟或者translog文件变得很大,则执行一次fsync操作。此时所有在文件系统缓存中的segment将被写入磁盘,而translog将被删除(此后会生成新的translog)
-
合并segment
由于每一秒就会生成一个新的segment,很快将会有大量的segment。对于一个分片进行查询请求,将会轮流查询分片中的所有segment,这将降低搜索的效率。因此ES会自动启动合并segment的工作,将一部分相似大小的segment合并成一个新的大segment。合并的过程实际上是创建了一个新的segment,当新segment被写入磁盘,所有被合并的旧segment被清除。
读操作(Read)
查询的过程大体上分为查询(query)和取回(fetch)两个阶段。这个节点的任务是广播查询请求到所有相关分片,并将它们的响应整合成全局排序后的结果集合,这个结果集合会返回给客户端。
-
查询阶段
当一个节点接收到一个搜索请求,则这个节点就变成了协调节点。
第一步是广播请求到索引中每一个节点的分片拷贝。 查询请求可以被某个主分片或某个副本分片处理,协调节点将在之后的请求中轮询所有的分片拷贝来分摊负载。
-
取回阶段
查询过程得到的是一个排序结果,标记出哪些文档是符合搜索要求的,此时仍然需要获取这些文档返回客户端。
协调节点会确定实际需要返回的文档,并向含有该文档的分片发送get请求;分片获取文档返回给协调节点;协调节点将结果返回给客户端。