官方文档-Flush和Refresh

2021-01-06  本文已影响0人  caster

对应7.2官方文档路径:Indices APIs » Flush & Indices APIs » Refresh
官方地址如下:
https://www.elastic.co/guide/en/elasticsearch/reference/7.2/indices-flush.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.2/indices-refresh.html

1.Flush

POST twitter/_flush
POST kimchy,elasticsearch/_flush
POST _flush

2.Synced Flush

es追踪每个分片的索引活跃度,如果分片5分钟内没有接收到任何索引请求就会被标记为不活跃。这为es减少分片资源提供了一次机会,es将进行一次特别的flush也就是synced flush。synced flush会执行普通的flush,并且添加一个唯一的标记(sync_id)到所有分片。

在没有索引操作进行的分片上添加了sync id进行标记,可以用其快速检查两个shard的lucene索引是否相同。快速的sync id比较(如果存在)在恢复或重新启动期间使用,可以跳过该过程的第一个也是最昂贵的阶段。在这种情况下,无需复制任何segment文件,并且恢复的translog日志重播阶段可以立即开始。请注意,由于sync id标记是与flush一起应用的,因此translog日志很可能为空,从而进一步加快了恢复速度。

这对于从未更新或很少更新的索引(例如基于时间的数据)特别有用。这种情况下通常会生成许多索引,如果没有synced flush,它们的恢复将花费很长时间。

要检查分片是否具有sync id,请查看indices stats API返回的分片统计信息commit部分:

GET twitter/_stats?filter_path=**.commit&level=shards 

注:filter_path 参数用于减少响应的详细程度,但完全是可选的。
返回内容如下类似:具有sync_id

{
   "indices": {
      "twitter": {
         "shards": {
            "0": [
               {
                 "commit" : {
                   "id" : "3M3zkw2GHMo2Y4h4/KFKCg==",
                   "generation" : 3,
                   "user_data" : {
                     "translog_uuid" : "hnOG3xFcTDeoI_kvvvOdNA",
                     "history_uuid" : "XP7KDJGiS1a2fHYiFL5TXQ",
                     "local_checkpoint" : "-1",
                     "translog_generation" : "2",
                     "max_seq_no" : "-1",
                     "sync_id" : "AVvFY-071siAOuFGEO9P", 
                     "max_unsafe_auto_id_timestamp" : "-1",
                     "min_retained_seq_no" : "0"
                   },
                   "num_docs" : 0
                 }
               }
            ]
         }
      }
   }
}

Synced Flush API

synced flush API允许管理员手动启动同步刷新。这对于计划中的(滚动)群集重启特别有用,你需要停止索引行为并且不想等待默认的5分钟空闲索引自动同步。

虽然方便,但此API有一些警告:
1.synced flush是一种尽力操作。任何正在进行的索引操作将导致该分片的synced flush失败。这意味着某些分片可能会synced flush成功,而其他分片则会失败。
2.只要shard再次flush就会移除sync_id标记。那是因为flush替换了存储标记的低级Lucene提交点。translog日志中未提交的操作不会删除标记。在实践中,我们应该将索引上的任何索引操作视为删除标记,因为Elasticsearch随时都可能触发flush操作。

注:在正在进行索引操作的同时进行synced flush是无害的。空闲的分片将成功,非空闲的分片将失败。成功的所有分片将具有更快的恢复时间。

POST twitter/_flush/synced

请求回复中包含多少个分片成功进行了sync-flushed和任何失败信息。
这是两分片和一副本索引中的所有分片都成功sync-flushed后的样子:

{
   "_shards": {
      "total": 2,
      "successful": 2,
      "failed": 0
   },
   "twitter": {
      "total": 2,
      "successful": 2,
      "failed": 0
   }
}

这是一个分片组由于挂起操作而失败时的情况:

{
   "_shards": {
      "total": 4,
      "successful": 2,
      "failed": 2
   },
   "twitter": {
      "total": 4,
      "successful": 2,
      "failed": 2,
      "failures": [
         {
            "shard": 1,
            "reason": "[2] ongoing operations on primary"
         }
      ]
   }
}

注:当synced flush由于索引操作而失败时,将显示以上错误。在这种情况下,HTTP状态代码为409 CONFLICT。
有时,故障是针对某个shard副本的。失败的副本将不具备快速恢复的资格,但成功的副本仍将具有资格。情况如下:

{
   "_shards": {
      "total": 4,
      "successful": 1,
      "failed": 1
   },
   "twitter": {
      "total": 4,
      "successful": 3,
      "failed": 1,
      "failures": [
         {
            "shard": 1,
            "reason": "unexpected error",
            "routing": {
               "state": "STARTED",
               "primary": false,
               "node": "SZNr2J_ORxKTLUCydGX4zA",
               "relocating_node": null,
               "shard": 1,
               "index": "twitter"
            }
         }
      ]
   }
}

注:当分片副本无法同步刷新时,返回的HTTP状态代码将为409 CONFLICT。
synced flush API可以通过一次调用应用于多个索引,甚至可以应用于_all索引。

POST kimchy,elasticsearch/_flush/synced
POST _flush/synced

3.Refresh

refresh api允许refresh一个或多个索引,使自上次refresh以来执行的所有操作都可用于搜索,近实时搜索依赖于此。例如,内部需要refresh才能调用,但默认情况下会定期执行一次refresh。

POST /twitter/_refresh

Multi Index

refresh API可以通过一次调用应用于多个索引,甚至可以应用于_all索引。

POST /kimchy,elasticsearch/_refresh
POST /_refresh
上一篇 下一篇

猜你喜欢

热点阅读