Как востановить данные индекса из каталога, который не видит Эластик?

Добрый день!

Есть ли возможность достать данные после подобной ситуации:

Данные записывались в index1
Был тестовый index2
В один момент был удален index2, и создан заново с новым mapping и в него закачали данные из index1 и все новые данные стали писаться в index2
В какой-то момент потребовалась перезагрузка машины, в момент перезагрузки вторая машина из кластера стала мастером и после перезагрузки машины вдруг index2 стал старым (до того как его удалили и создали заново и залили новые данные).

Можно как-то откатить изменения которые сделал кластер когда одна машина была выключена и потом включилась?

Или восстановить данные из каталога индекса?
На диске в каталоге /var/lib/elasticsearch/nodes/0/indices/ есть каталог с данными, который эластик не видит.
Видит все остальные индексы, а вот нужный не видит.
Что нужно сделать чтобы этот каталог Эластик увидел как индекс?

Я не понимаю, что у Вас произошло. Что в логах на мастере и на другой ноде? По идеи, когда elasticsearch находит индекс на диске, то он его автоматически подцепляет. Как установка path.data настроена на этих нодах?

Было два сервера в кластере.
На мастере удалили index2 (uuid: AAAA) и создали его заново (uuid BBBB) с новым маппингом и загрузили в него данные.
(была странность с местом: сначала оставалось 7% свободного места, а потом раз и 30% стало)
И эти данные видать не синхронизировались со вторым сервером (на нем остался старый вариант index2 (uuid AAAA).
Мастер выключили. Второй сервер стал мастером. Первый сервер включили, он подключился к кластеру и со второго сервера закачал index2 (uuid AAAA)

В каталоге с данными оказалось два каталога (с разными UUID: AAAA и BBBB, у которых одинаковое название индекса index2). Эластик видит "старый" index2 (uuid AAAA)
Ошибка писалась вот такая:
can not be imported as a dangling index, as index with same name already exists in cluster metadata

Пробовал удалить index2 (uuid AAAA)
Папка (uuid BBBB) не подцепилась

Единственно, что еще не пробовал - это перегрузить еще раз эластик.

На данный момент каталог с нужными данными убрали из каталога с данными (/var/lib/elasticsearch/nodes/0/inidices/)

Вопрос: если я скопирую папку в обособленный эластик. Запущу его - он подцепит эту папку?

Да, это должно сработать. После того, как индекс подцепиться, его данный можно будет переиндексировать в старый кластер.

Спасибо.
Попробую.
О результате расскажу.

Не помогло
В папке _state не оказалось файла state*.st и при запуске Эластик выдает вот такую ошибку
no index state found
и игнорирует папку с данными

Если другой индекс имеет такой-же меппинг и установки, то можно скопировать этот файл из другого индекса.

Попробовал скопировать только каталоги _state
ругался на отсутствие traslog/...ckp

Скопировал этот файл с индекса с таким же маппингом и стало ругаться вот так:
[2017-12-05T13:17:38,463][WARN ][o.e.c.a.s.ShardStateAction] [ZKcktVG] [testindex][0] received shard failed for shard id [[testindex][0]], allocation id [NMty1uqXSTu4_E-YfYfIrA], primary term [0], message [failed recovery], failure [RecoveryFailedException[[testindex][0]: Recovery failed on {ZKcktVG}{ZKcktVGAS2qLeSS_V5dNNA}{RcxrzUiHS_yZPijMc0M-Fg}{127.0.0.1}{127.0.0.1:9300}]; nested: IndexShardRecoveryException[failed to recover from gateway]; nested: EngineCreationFailureException[failed to create engine]; nested: TranslogCorruptedException[expected shard UUID [78 76 45 45 6d 58 36 6e 52 41 79 6e 4c 55 36 76 43 4d 71 48 59 51] but got: [45 34 35 64 76 4a 42 31 53 34 47 6b 47 77 43 65 66 78 5f 61 32 77] this translog file belongs to a different translog. path:/var/lib/elasticsearch/nodes/0/indices/ujx_TJvxTteiCIjIiP1yKg/0/translog/translog-1.tlog]; ]
org.elasticsearch.indices.recovery.RecoveryFailedException: [testindex][0]: Recovery failed on {ZKcktVG}{ZKcktVGAS2qLeSS_V5dNNA}{RcxrzUiHS_yZPijMc0M-Fg}{127.0.0.1}{127.0.0.1:9300}
at org.elasticsearch.index.shard.IndexShard.lambda$startRecovery$5(IndexShard.java:2004) ~[elasticsearch-6.0.0.jar:6.0.0]
at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:569) [elasticsearch-6.0.0.jar:6.0.0]
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [?:1.8.0_151]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [?:1.8.0_151]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_151]
Caused by: org.elasticsearch.index.shard.IndexShardRecoveryException: failed to recover from gateway
at org.elasticsearch.index.shard.StoreRecovery.internalRecoverFromStore(StoreRecovery.java:396) ~[elasticsearch-6.0.0.jar:6.0.0]
at org.elasticsearch.index.shard.StoreRecovery.lambda$recoverFromStore$0(StoreRecovery.java:93) ~[elasticsearch-6.0.0.jar:6.0.0]
at org.elasticsearch.index.shard.StoreRecovery.executeRecovery(StoreRecovery.java:286) ~[elasticsearch-6.0.0.jar:6.0.0]
at org.elasticsearch.index.shard.StoreRecovery.recoverFromStore(StoreRecovery.java:91) ~[elasticsearch-6.0.0.jar:6.0.0]
at org.elasticsearch.index.shard.IndexShard.recoverFromStore(IndexShard.java:1542) ~[elasticsearch-6.0.0.jar:6.0.0]
at org.elasticsearch.index.shard.IndexShard.lambda$startRecovery$5(IndexShard.java:2000) ~[elasticsearch-6.0.0.jar:6.0.0]

Можно попробовать почистить translog с помощью elasticsearch-translog.

1 Like

Иван, спасибо огромное!
Чистка транслога помогла. Не весь индекс восстановился, но нужные данные восстановились.
Спасибо!

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.