如何(暂时)阻止Elasticsearch删除已删除的文件?

时间:2013-07-25 14:43:26

标签: elasticsearch

my usecase我尝试同步两个Elasticsearch索引。由于版本控制,这实际上是quite simple。但是,我想在我这样做的时候随时继续写作。

好的,所以我想按时间顺序执行的步骤:

  1. 客户端将(索引,删除,更新)写入群集c1
  2. 创建新索引c2(客户端继续写入c1)
  3. 将数据从集群c1复制到c2(客户端继续写入c1)
  4. 将客户端切换为c2
  5. 将更改从c1同步到c2(客户端继续写入c2)
  6. 关闭c1
  7. 步骤#5是我目前正在考虑的步骤。我必须确保写入c2的更改不会被来自c1的数据覆盖。使用版本控制它很容易写入,因为索引操作将失败(VersionConflictEngineException)。假设有以下情况:

    1. 文档在#3之后立即在c1上更新(c1上的v2,c2上的v1)
    2. 在#4之后删除相同的文档(c1上的v2,c2上的删除)
    3. 同步将尝试在c2上重新索引v2
    4. 我知道elasticsearch会将已删除的文档保留一段时间:

      # index document 1:4
      $ curl -XPUT 'http://localhost:9200/test/test/1?version=4&version_type=external' -d '{"message": "test"}'
      {"ok":true,"_index":"test","_type":"test","_id":"1","_version":4}
      
      # delete document 1:6
      $ curl -XDELETE 'http://localhost:9200/test/test/1?version=6&version_type=external'
      {"ok":true,"found":true,"_index":"test","_type":"test","_id":"1","_version":6}
      
      # index document 1:4 (ERROR!)
      $ curl -XPUT 'http://localhost:9200/test/test/1?version=4&version_type=external' -d '{"message": "test"}'
      {"error":"VersionConflictEngineException[[test][2] [test][1]: version conflict, current [6], provided [4]]","status":409}
      
      # wait some time
      
      # index document 1:4 (SUCCESS!)
      $ curl -XPUT 'http://localhost:9200/test/test/1?version=4&version_type=external' -d '{"message": "test"}'
      {"ok":true,"_index":"test","_type":"test","_id":"1","_version":4}
      

      问题显然是等待一段时间"部分。我将不得不依赖已删除的文件一段时间。因此,我需要通过在运行#5时禁止删除任何已删除文档来控制此时间。你会怎么做?

      已转发至Elasticsearch group(及此related question

1 个答案:

答案 0 :(得分:5)

“等待一段时间”部分由每个索引的index.gc_deletes设置定义,默认设置为“60s”。它可以使用Update Index Settings命令动态更改。