44-45-Elasticsearch-文档搜索刷写分析控制展示相关

44-Elasticsearch-文档搜索刷写分析控制展示相关(初识了解):

文档搜索

早期的全文检索会为整个文档集合建立一个很大的倒排索引并将其写入到磁盘。 一旦

新的索引就绪,旧的就会被其替换,这样最近的变化便可以被检索到。

倒排索引被写入磁盘后是 不可改变 的:它永远不会修改。

不变性有重要的价值:

1、不需要锁。如果你从来不更新索引,你就不需要担心多进程同时修改数据的问题。

2、一旦索引被读入内核的文件系统缓存,便会留在哪里,由于其不变性。只要文件系统缓存中还有足够的空间,那么大部分读请求会直接请求内存,而不会命中磁盘。这提供了很大的性能提升。

其它缓存(像 filter 缓存),在索引的生命周期内始终有效。它们不需要在每次数据改变时被重建,因为

数据不会变化。

3、写入单个大的倒排索引允许数据被压缩,减少磁盘 I/O 和 需要被缓存到内存的索引的使用量。

如果需要让一个新的文档可被搜索,需重建整个索引。这要么对一个索引所能包含的

数据量造成了很大的限制,要么对索引可被更新的频率造成了很大的限制。

动态更新索引

如何在保留不变性的前提下实现倒排索引的更新?

用更多的索引。通过增加新的补充索引来反映新近的修改,而不是直接重写整

个倒排索引。每一个倒排索引都会被轮流查询到,从最早的开始查询完后再对结果进行合并。

Elasticsearch 基于 Lucene, 这个 java 库引入了按段搜索的概念。 每一 段 本身都是一

个倒排索引, 但索引在 Lucene 中除表示所有段的集合外, 还增加了提交点的概念 — 一

个列出了所有已知段的文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iUPpaYSM-1668857832002)(png/1622941000907.png)]

按段搜索会以如下流程执行:

  1. 新文档被收集到内存索引缓存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IbrGXRaS-1668857832003)(png/1622941022818.png)]

  1. 不时地, 缓存被 提交

(1) 一个新的段—一个追加的倒排索引—被写入磁盘。

(2) 一个新的包含新段名字的 提交点 被写入磁盘

(3) 磁盘进行 同步 — 所有在文件系统缓存中等待的写入都刷新到磁盘,以确保它们

被写入物理文件

  1. 新的段被开启,让它包含的文档可见以被搜索

  2. 内存缓存被清空,等待接收新的文档

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GRUhg4xu-1668857832003)(png/1622941061667.png)]

当一个查询被触发,所有已知的段按顺序被查询。词项统计会对所有段的结果进行聚合,以

保证每个词和每个文档的关联都被准确计算。 这种方式可以用相对较低的成本将新文档添

加到索引。

段是不可改变的,所以既不能从把文档从旧的段中移除,也不能修改旧的段来进行反映文档 的更新。 取而代之的是,每个提交点会包含一个 .del 文件,文件中会列出这些被删除文档 的段信息。

当一个文档被 “删除” 时,它实际上只是在 .del 文件中被 标记 删除。一个被标记删除的文档仍然可以被查询匹配到, 但它会在最终结果被返回前从结果集中移除。 文档更新也是类似的操作方式:当一个文档被更新时,旧版本文档被标记删除,文档的新版 本被索引到一个新的段中。 可能两个版本的文档都会被一个查询匹配到,但被删除的那个 旧版本文档在结果集返回前就已经被移除。

近实时搜索

随着按段(per-segment)搜索的发展,一个新的文档从索引到可被搜索的延迟显著降低 了。新文档在几分钟之内即可被检索,但这样还是不够快。磁盘在这里成为了瓶颈。提交 (Commiting)一个新的段到磁盘需要一个 fsync 来确保段被物理性地写入磁盘,这样在断 电的时候就不会丢失数据。 但是 fsync 操作代价很大; 如果每次索引一个文档都去执行一 次的话会造成很大的性能问题。
我们需要的是一个更轻量的方式来使一个文档可被搜索,这意味着 fsync 要从整个过程中 被移除。在 Elasticsearch 和磁盘之间是文件系统缓存。 像之前描述的一样, 在内存索引缓 冲区中的文档会被写入到一个新的段中。 但是这里新段会被先写入到文件系统缓存—这一 步代价会比较低,稍后再被刷新到磁盘—这一步代价比较高。不过只要文件已经在缓存中, 就可以像其它文件一样被打开和读取了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MIjAYRBZ-1668857832004)(png/1622941351559.png)]

Lucene 允许新段被写入和打开—使其包含的文档在未进行一次完整提交时便对搜索可见。

这种方式比进行一次提交代价要小得多,并且在不影响性能的前提下可以被频繁地执行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UvzlwYVP-1668857832005)(png/1622941371770.png)]

在 Elasticsearch 中,写入和打开一个新段的轻量的过程叫做 refresh 。 默认情况下每个分 片会每秒自动刷新一次。这就是为什么我们说 Elasticsearch 是 近 实时搜索: 文档的变化 并不是立即对搜索可见,但会在一秒之内变为可见。这些行为可能会对新用户造成困惑: 他们索引了一个文档然后尝试搜索它,但却没有搜到。
这个问题的解决办法是用 refresh API 执行一次手动刷新: /users/_refresh
尽管刷新是比提交轻量很多的操作,它还是会有性能开销。当写测试的时候, 手动刷新很有用,但是不要 在生产环境下每次索引一个文档都去手动刷新。 相反,你的应用需要意识到 Elasticsearch 的近实时的性 质,并接受它的不足。 并不是所有的情况都需要每秒刷新。可能你正在使用 Elasticsearch 索引大量的日志文件, 你可能想优化索引速度而不是近实时搜索, 可以通过设置 refresh_interval , 降低每个索引的刷新频率

{
 "settings": {
 "refresh_interval": "30s" 
 } 
 }

refresh_interval 可以在既存索引上进行动态更新。 在生产环境中,当你正在建立一个大的

新索引时,可以先关闭自动刷新,待开始使用该索引时,再把它们调回来

# 关闭自动刷新
PUT /users/_settings
{ "refresh_interval": -1 } 
# 每一秒刷新
PUT /users/_settings
{ "refresh_interval": "1s" }

es文档刷新简单流程入门

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DDWE5LIw-1668857832006)(png/1622941523024.png)]

用户发送请求,通过路由规则,找到主分片,然后想两个副本进行同步。副本数量会影响整体性能。设置多少的副本也是比较重要的。

es文档刷写简单流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DSRqUq9p-1668857832007)(png/1622942332588.png)]
内存中的索引-产生段-刷新到缓存-写入磁盘,磁盘多个段进行合并。

持久化变更

如果没有用 fsync 把数据从文件系统缓存刷(flush)到硬盘,我们不能保证数据在断 电甚至是程序正常退出之后依然存在。为了保证 Elasticsearch 的可靠性,需要确保数据变 化被持久化到磁盘。在 动态更新索引,我们说一次完整的提交会将段刷到磁盘,并写入一个包含所有段列表的提交点。Elasticsearch 在启动或重新打开一个索引的过程中使用这个提 交点来判断哪些段隶属于当前分片。 即使通过每秒刷新(refresh)实现了近实时搜索,我们仍然需要经常进行完整提交来确 保能从失败中恢复。但在两次提交之间发生变化的文档怎么办?我们也不希望丢失掉这些数据。Elasticsearch 增加了一个 translog ,或者叫事务日志,在每一次对 Elasticsearch 进行操作时均进行了日志记录
整个流程如下

  1. 一个文档被索引之后,就会被添加到内存缓冲区,并且追加到了 translog

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3IC8L223-1668857832007)(png/1622943190655.png)]

  1. 刷新(refresh)使分片每秒被刷新(refresh)一次:
    1、这些在内存缓冲区的文档被写入到一个新的段中,且没有进行 fsync 操作。

2、这个段被打开,使其可被搜索

3、内存缓冲区被清空

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ot2FpswA-1668857832007)(png/1622943228555.png)]

  1. 这个进程继续工作,更多的文档被添加到内存缓冲区和追加到事务日志

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n3oXLPRB-1668857832008)(png/1622943247180.png)]

  1. 每隔一段时间—例如 translog 变得越来越大—索引被刷新(flush);一个新的 translog 被创建,并且一个全量提交被执行 所有在内存缓冲区的文档都被写入一个新的段。 缓冲区被清空。 一个提交点被写入硬盘。 文件系统缓存通过 fsync 被刷新(flush)。 老的 translog 被删除。 translog 提供所有还没有被刷到磁盘的操作的一个持久化纪录。当 Elasticsearch 启动的时 候, 它会从磁盘中使用最后一个提交点去恢复已知的段,并且会重放 translog 中所有在最 后一次提交后发生的变更操作。 translog 也被用来提供实时 CRUD 。当你试着通过 ID 查询、更新、删除一个文档,它会在尝试从相应的段中检索之前, 首先检查 translog 任何最近的变更。这意味着它总是能够
    实时地获取到文档的最新版本。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eQOyVsky-1668857832008)(png/1622943288330.png)]

执行一个提交并且截断 translog 的行为在 Elasticsearch 被称作一次 flush
分片每 30 分钟被自动刷新(flush),或者在 translog 太大的时候也会刷新
很少需要自己手动执行 flush 操作;通常情况下,自动刷新就足够了。这就是说,在重启节点或关闭索引之前执行 flush 有益于你的索引。当Elasticsearch 尝试恢复或重新打开一个索引, 它需要重放 translog 中所有的操作,所以如果日志越短,恢复越快。translog 的目的是保证操作不会丢失,在文件被 fsync 到磁盘前,被写入的文件在重启之后就会丢失。默认 translog 是每 5 秒被 fsync 刷新到硬盘, 或者在每次写请求完成之 后执行(e.g. index, delete, update, bulk)。这个过程在主分片和复制分片都会发生。最终, 基本上,这意味着在整个请求被 fsync 到主分片和复制分片的 translog 之前,你的客户端不会 得到一个 200 OK 响应。 在每次请求后都执行一个 fsync 会带来一些性能损失,尽管实践表明这种损失相对较 小(特别是 bulk 导入,它在一次请求中平摊了大量文档的开销)。 但是对于一些大容量的偶尔丢失几秒数据问题也并不严重的集群,使用异步的 fsync 还是比较有益的。比如,写入的数据被缓存到内存中,再每 5 秒执行一次 fsync 。如果你 决定使用异步 translog 的话,你需要 保证 在发生 crash 时,丢失掉 sync_interval 时间段
的数据也无所谓。请在决定前知晓这个特性。如果你不确定这个行为的后果,最好是使用默认的参数( “index.translog.durability”: “request” )来避免数据丢失。

段合并

由于自动刷新流程每秒会创建一个新的段 ,这样会导致短时间内的段数量暴增。而段 数目太多会带来较大的麻烦。 每一个段都会消耗文件句柄、内存和 cpu 运行周期。更重要的是,每个搜索请求都必须轮流检查每个段;所以段越多,搜索也就越慢。 Elasticsearch 通过在后台进行段合并来解决这个问题。小的段被合并到大的段,然后这些大的段再被合并到更大的段。
段合并的时候会将那些旧的已删除文档从文件系统中清除。被删除的文档(或被更新文档的 旧版本)不会被拷贝到新的大段中。
启动段合并不需要你做任何事。进行索引和搜索时会自动进行。

  1. 当索引的时候,刷新(refresh)操作会创建新的段并将段打开以供搜索使用。

  2. 合并进程选择一小部分大小相似的段,并且在后台将它们合并到更大的段中。这并不会

中断索引和搜索。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AuqNRjx6-1668857832009)(png/1622943387971.png)]

  1. 一旦合并结束,老的段被删除

    新的段被刷新(flush)到了磁盘。 ** 写入一个包含新段且排除旧的和较小的段的新提交点。

​ 新的段被打开用来搜索。

​ 老的段被删除。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JDmBqhO9-1668857832009)(png/1622943412289.png)]

合并大的段需要消耗大量的 I/O 和 CPU 资源,如果任其发展会影响搜索性能。Elasticsearch 在默认情况下会对合并流程进行资源限制,所以搜索仍然 有足够的资源很好地执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值