内容目录

elasticsearch中有四种基本的数据操作。每个操作都有自己的资源需求。每个用例都使用这些操作,但它们会优先于某些操作。

  • index:在这里被用作动词,而不是其名称索引。处理文档并将其存储在索引中以供将来索引
  • delete:从索引中删除文档
  • update:删除文档并索引替换文档
  • search:从一个或多个索引中检索一个或多个文档或聚合。

简单地说,一个elasticsearch的集群由如下的部分组成:

file

如上所示,elastic stackelasticsearch、kibana、beats、logstash来组成。
kibana是用来可视化及搜索elasticsearch的数据,管理及监控elasticsearch集群,发送通知等,是elastic stack的窗口

elasticsearch是一个大数据的搜索及分析引擎。
beats、logstash是被用来把数据写入到elasticsearch中的工具。
最新的elastic stack建议使用elastic agent来作为数据摄入的方式。

了解 elasticsearch index 数据流

file

上图显示了文档被索引到elasticsearch集群的数据流。它包括以下基本步骤:

  1. 客户端发出将文档放入集群的请求,集群中的协调器节点接受请求进行处理

  2. 协调器节点使用索引请求中的管道(pipeline)参数来检查文档是否需要在路由到数据节点之前进行进一步处理(丰富或转换)
    如果答案为否,文档将被路由到集群中的数据节点。
    如果答案为是,文档将被路由到集群中的摄取节点(ingest node)以丰富文档。丰富过程完成后,摄取节点继续将丰富的文档路由到数据节点。

集群中哪个数据节点将进一步处理文档的决定是基于索引的分片信息和哈希模公式:
shard = hash(routing) % number_of_shards
从上面的公式中可以看出来,如果 number_of_shards 改变了,那么得出来的 shard 值也会改变。
这也是为啥我们在创建一个索引之后,不能修改 number_of_shards 这个参数。
一旦 number_of_shards 被修改了之后,我们必须通过 reindex 的方式写入另外一个索引来进行搜索和查询。

  1. 数据节点将文档解析为json对象,然后检查对象中是否有任何文本值。如果找到文本值,就会涉及文本分析过程。
    它分析文本并将其分解为更有用的解构组件。它还应用一些处理来使文档与全文搜索更相关。
    最后,文档被添加到内存缓冲区并附加到事务日志(translog

当缓冲区填满时,文档被写入一个段,然后缓冲区被清除。
同时,事务日志仍然保留文档,直到它变得足够大,执行完整提交。
文档永久刷新到磁盘,旧的事务日志被删除并创建新的。

如果启用复制,则触发复制数据过程。
该数据节点向包含索引副本分片的数据节点发送复制请求。
此处的整个索引过程将在该节点上完成以创建这些文档的副本。

了解 elasticsearch search 数据流

搜索是信息检索的通用术语。elasticsearch提供各种检索功能,包括全文搜索、地理搜索、范围搜索、脚本搜索和聚合。

elasticsearch如何在幕后执行搜索查询?下图显示了搜索操作的数据流

file

  1. 第一阶段:scatter
    客户端向集群发出搜索请求,集群中的协调器节点接受请求进行处理。
    基于索引的信息,协调器节点将搜索请求路由到包含索引数据的所有数据节点。

  2. 第二阶段:search
    在第一阶段接收到搜索请求的每个数据节点解析请求以检查搜索查询中的任何查询子句是否需要应用文本分析过程。
    如果是,文本分析处理开始。
    最后,数据节点在索引分片的每个段上执行搜索请求。

  3. 第三阶段:gathermerge
    第一阶段中的协调器节点从将搜索请求路由到的所有数据节点收集搜索结果。
    收集处理完成后,合并处理开始。
    它对搜索结果进行合并、排名和排序,然后将它们返回给客户端。

了解 elasticsearch 删除数据流

如何从elasticsearch中删除文档?下图显示了删除单个文档的幕后数据流

file

  1. 第一步:客户端发出从集群中删除文档的请求,集群中的协调节点接受请求进行处理

  2. 第二步:基于分片信息和文档ID,协调节点将删除请求路由到包含存储文档的主分片的数据节点

  3. 第三步:数据节点不会立即删除文档,它会将文档标记为已删除,然后将其添加到内存缓冲区并将其追加到事务日志(translog)中。
    此时,文档是不可搜索的。

当缓冲区填满时,changes 将写入段并且缓冲区被清除。
同时,事务日志仍然保留已删除的文档,直到它变得太大,执行完整提交。
更改被刷新到磁盘,文档被永久删除。

如果为索引启用了复制,则复制数据进程开始。
该数据节点将删除请求发送到包含索引副本分片的数据节点。
此处的整个删除过程将在该节点上完成,以将文档从副本分片中完全删除。

了解 elasticsearch 更新数据流

elasticsearch中的文档是不可变的。
elasticsearch更新文档时,它会删除原始文档并为新的、更新的文档编制索引。
这两个操作在每个lucene分片中以原子方式执行。
这个产生deleteindex操作的成本,但它不会调用任何摄取管道

可以描述update数据流为如下的操作:

Update = Delete + (Index - Ingest Pipeline)

最后修改日期: 2024年8月21日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。