- 我不懂运营
-
先说结论:
Refresh用于把内存中的数据写入translog 和 in-memory buffer (内存缓存区),会在内存中产生一个segment提供新增文档的搜索功能,不会删除tanslog。
flush:translog达到一定数据上限后会执行flush操作,将内存中的segment合并为一个segment将数据持久化到磁盘,同时清除tanslog中的数据, 用于将内存中的段保留在硬盘上 。
Refresh 和 Flush 都用于使文档在索引操作后立即可供搜索。 在 Elasticsearch 中添加新文档时,我们可以对索引调用 _refresh 或 _flush 操作,以使新文档可用于搜索。
当我们把一条数据写入到 Elasticsearch 中后,它并不能马上被用于搜索。 新增的索引必须写入到 Segment 后才能被搜索到 , 因此我们把数据写入到内存缓冲区之后并不能被搜索到 。新增了一条记录时,Elasticsearch 会把数据写到 translog 和 in-memory buffer (内存缓存区) 中。
在此期间,该文档不能被搜索,但是我们还是可以通过 ID 使用 GET 来获得该文档。 如果希望该文档能立刻被搜索,需要手动调用 refresh 操作 。在 Elasticsearch 中, 默认情况下 _refresh 操作设置为每秒执行一次 。
在此操作期间,内存中缓冲区的内容将复制到内存中新创建的 Segment 中,新数据可用于搜索。
这个 refresh 的时间间隔可以由 index 设置中 index.refresh_interval 来定义。只有在 buffer 的内容写入到 Segement 后,这个被写入的文档才变为可以搜索的文档。 通常 buffer 里的内容被写入到 Segment 里去,有三个条件 :
由索引中的设置所指定的 refresh_interval 启动的周期性的 refresh 。在默认的情况下为 1s。这使对索引的最近更改可见以进行搜索。 默认为 1s。 可以设置为 -1 以禁用刷新。 在 Elasticsearch 7.0 发布之后,如果未明确设置此设置,则至少在 index.search.idle.after 秒之后仍未看到搜索流量的分片在收到搜索请求之前将不会接收后台刷新。 命中空闲分片的搜索将等待下一次后台刷新(在1秒内)。 此行为旨在在不执行搜索时在默认情况下自动优化批量索引。 为了退出此行为,应将显式值 1s 设置为刷新间隔。
在导入文档时强制 refresh:PUT twitter/_doc/1?refresh=true
当 In Memory Buffer 满了,在默认的情况下为 node Heap 的 10%
但是,translog 如何解决持久性问题? 每个 Shard 中都存在一个 translog,这意味着它与物理磁盘内存有关。 它是同步且安全的,因此即使对于尚未提交的文档,您也可以获得持久性和持久性。 如果发生问题,可以还原事务日志。
Flush 实质上意味着将内存缓冲区中的所有文档都写入新的 Lucene Segment ,连同所有现有的内存段一起被提交到磁盘,该磁盘清除事务日志。