2
在my usecase我試圖同步兩個Elasticsearch索引。由於版本控制,這是非常實用的quite simple。不過,我想在我這樣做的時候隨時寫作。如何(暫時)阻止Elasticsearch刪除已刪除的文檔?
好了,所以我想按時間順序執行的步驟:
- 客戶寫(索引,刪除,更新),以簇羣C1
- 創建新的索引C2(客戶不斷寫信給C1)從簇羣C1
- 將數據複製到C2(客戶不斷寫信給C1)
- 開關客戶C2
- 從C1到C2的變化同步(客戶端保持寫入C2)
- 關機c1
步驟#5是我目前正在查看的步驟。我必須確保寫入c2的更改不會被來自c1的數據覆蓋。使用版本控制對於寫入來說非常簡單,因爲索引操作將失敗(VersionConflictEngineException)。假設以下情況:
- 文檔被後#3(在C1 V2,C2上V1)
- 同一文檔後右#4(在C1 V2刪除,C2上刪除更新於C1右)
- 同步將嘗試重新索引上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時刪除任何已刪除的文檔來控制這一時間。你會如何做到這一點?
Crossposted到Elasticsearch group(這related question)
感謝您的回答。但似乎動態地改變這個設置是被打破的。代碼中的相應字段是'org.elasticsearch.index.engine.robin.RobinEngine.gcDeletesInMillis',它只在之前的信息日誌'「將index.gc_deletes從[{}]更新爲[{}]]''後修改。這條線永遠不會被記錄。 – sfussenegger
重新開放索引按預期工作 – sfussenegger
我已經打開[#3396](https://github.com/elasticsearch/elasticsearch/issues/3396) – sfussenegger