私のユースケースでは、 2 つの 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 の再インデックスが試行されます
私は、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 グループにクロスポストされました(およびこの関連する質問)