2

我的用例中,我试图同步两个 Elasticsearch 索引。由于版本控制,这实际上非常简单。但是,我想在这样做的任何时候继续写作。

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

  1. 客户端写入(索引、删除、更新)到集群 c1
  2. 创建一个新的索引 c2(客户端不断写入 c1)
  3. 将数据从集群 c1 复制到 c2(客户端不断写入 c1)
  4. 将客户端切换到 c2
  5. 同步从 c1 到 c2 的更改(客户端不断写入 c2)
  6. 关机 c1

步骤#5 是我目前正在查看的步骤。我必须确保写入 c2 的更改不会被来自 c1 的数据覆盖。使用版本控制对于写入来说相当简单,因为索引操作将失败(VersionConflictEngineException)。假设以下情况:

  1. 在 #3 之后立即在 c1 上更新文档(c1 上的 v2,c2 上的 v1)
  2. 相同的文档在 #4 之后立即被删除(c1 上的 v2,c2 上的删除)
  3. 同步将尝试在 c2 上重新索引 v2

我知道弹性搜索会保留已删除的文档一段时间:

# 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 组(以及这个相关问题

4

1 回答 1

5

“等待一段时间”部分是通过index.gc_deletes基于每个索引的设置来定义的,默认设置为“60s”。它可以使用更新索引设置命令动态更改。

于 2013-07-25T20:50:09.520 回答