Elasticsearch «snapshot_restore_exception» «причина»: моментальный снимок не существует, когда состояние моментального снимка — УСПЕШНО
Я использую клиент Java/Groovy для ElasticSearch и пытаюсь восстановить моментальный снимок ES во время обновления. Я использую код Groovy, который у меня есть до сих пор, для настройки моих старых и новых клиентов и создания и восстановления моментальных снимков:
def oldElasticClient = new ElasticClient("old", oldElasticPort)
oldElasticClient.cleanIndicesAndTemplates()
def newElasticClient = new ElasticClient("new", newElasticPort)
newElasticClient.cleanIndicesAndTemplates()
try {
oldElasticClient.refreshAll()
oldElasticClient.createSnapshotRepository()
newElasticClient.createSnapshotRepository()
oldElasticClient.createSnapshot()
newElasticClient.restoreSnapshot()
oldElasticClient.deleteSnapshot()
....
finally {
oldElasticClient.close()
newElasticClient.close()
....
}
и это методы, которые выполняют фактическое создание и восстановление моментальных снимков:
def createSnapshotRepository() {
log.info("Creating snapshot repository on ${name} Elasticsearch...");
def settings = Settings.builder()
.put(FsRepository.LOCATION_SETTING.getKey(), "/var/tmp")
.put(FsRepository.COMPRESS_SETTING.getKey(), true)
.build()
client.snapshot().createRepository(
new PutRepositoryRequest("myrepository").settings(settings).type(FsRepository.TYPE),
RequestOptions.DEFAULT
)
log.info("Done creating snapshot repository on ${name} Elasticsearch!");
}
def createSnapshot(Boolean waitForCompletion = true) {
log.info("Creating snapshot on ${name} Elasticsearch...");
CreateSnapshotRequest createSnapshotRequest1 = new CreateSnapshotRequest("myrepository", "mysnapshot_1")
createSnapshotRequest1.waitForCompletion(true)
createSnapshotRequest1.includeGlobalState(true)
CreateSnapshotResponse createSnapshotResponse = client.snapshot().create(createSnapshotRequest1, RequestOptions.DEFAULT)
log.info("All Snapshots")
GetSnapshotsRequest getSnapshotsRequest = new GetSnapshotsRequest("myrepository");
GetSnapshotsResponse getSnapshotsResponse = client.snapshot().get(getSnapshotsRequest, RequestOptions.DEFAULT)
log.info(getSnapshotsResponse.getProperties().toString())
}
def restoreSnapshot() {
log.info("Restoring snapshot on ${name} Elasticsearch...");
client.snapshot().restore(
new RestoreSnapshotRequest("myrepository", "mysnapshot_1")
.includeGlobalState(true)
.waitForCompletion(true),
RequestOptions.DEFAULT
)
log.info("Done restoring snapshot on ${name} Elasticsearch!");
}
После проверки журналов я увидел, что мой снимок был успешно создан следующим образом:
snapshots:[SnapshotInfo{snapshot=_na_: mysnapshot_1/niEyiuCtRny_fON1aXTMLQ, state=SUCCESS .... ]
Однако мой метод восстановления завершается с сообщением об ошибке, указывающим, что моментальный снимок не существует, что меня действительно сбивает с толку. Это точная ошибка:
"error":{"root_cause":[{"type":"snapshot_restore_exception","reason":"[myrepository:mysnapshot_1] snapshot does not exist"}],"type":"snapshot_restore_exception","reason":"[myrepository:mysnapshot_1] snapshot does not exist"},"status":500}
Кто-нибудь знает, как я могу отладить это дальше, чтобы увидеть, что может быть не так? Я не знаю, в чем может быть ошибка, поскольку мне все кажется правильным. Любая помощь приветствуется.