在我的用例中,我试图同步两个 Elasticsearch 索引。由于版本控制,这实际上非常简单。但是,我想在这样做的任何时候继续写作。
好的,所以我要按时间顺序执行的步骤:
- 客户端写入(索引、删除、更新)到集群 c1
- 创建一个新的索引 c2(客户端不断写入 c1)
- 将数据从集群 c1 复制到 c2(客户端不断写入 c1)
- 将客户端切换到 c2
- 同步从 c1 到 c2 的更改(客户端不断写入 c2)
- 关机 c1
步骤#5 是我目前正在查看的步骤。我必须确保写入 c2 的更改不会被来自 c1 的数据覆盖。使用版本控制对于写入来说相当简单,因为索引操作将失败(VersionConflictEngineException)。假设以下情况:
- 在 #3 之后立即在 c1 上更新文档(c1 上的 v2,c2 上的 v1)
- 相同的文档在 #4 之后立即被删除(c1 上的 v2,c2 上的删除)
- 同步将尝试在 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 组(以及这个相关问题)