Восстановление из снимка
Elasticsearch использует снимки для хранения копии ваших данных за пределами кластера. Вы можете восстановить снимок, чтобы восстановить индексы и потоки данных, для которых нет копий шардов в кластере. Это может произойти, если данные (индексы или потоки данных) были удалены или если изменился состав кластера, и текущие узлы в системе больше не содержат копию данных.
Для восстановления отсутствующих данных вам необходимо иметь резервную копию затронутых индексов и потоков данных, которая достаточно актуальна для вашего случая использования. Пожалуйста, не продолжайте, не подтвердив это.
Чтобы восстановить индексы и потоки данных, в которых отсутствуют данные:
Используйте Kibana
- Войдите в консоль Elastic Cloud.
-
На панели Elasticsearch Service щелкните имя вашего развертывания.
Если имя вашего развертывания отключено, ваши экземпляры Kibana могут быть неисправны, в этом случае, пожалуйста, свяжитесь с Elastic Support. Если ваше развертывание не включает Kibana, все, что вам нужно сделать, это сначала включить его.
-
Откройте боковое меню навигации вашего развертывания (расположенное под логотипом Elastic в левом верхнем углу) и перейдите к Dev Tools > Console.
-
Чтобы просмотреть затронутые индексы, используйте API cat indices.
resp = client.cat.indices( v=True, health="red", h="index,status,health", ) print(resp)response = client.cat.indices( v: true, health: 'red', h: 'index,status,health' ) puts response
const response = await client.cat.indices({ v: "true", health: "red", h: "index,status,health", }); console.log(response);GET _cat/indices?v&health=red&h=index,status,health
Ответ будет выглядеть следующим образом:
index status health .ds-my-data-stream-2022.06.17-000001 open red kibana_sample_data_flights open red
Состояние
redиндексов выше указывает на то, что в этих индексах отсутствуют основные шарды, что означает, что в них отсутствуют данные. -
Чтобы восстановить данные, нам нужно найти снимок, содержащий эти два индекса. Чтобы найти такой снимок, используйте API get snapshot.
resp = client.snapshot.get( repository="my_repository", snapshot="*", verbose=False, ) print(resp)response = client.snapshot.get( repository: 'my_repository', snapshot: '*', verbose: false ) puts response
const response = await client.snapshot.get({ repository: "my_repository", snapshot: "*", verbose: "false", }); console.log(response);GET _snapshot/my_repository/*?verbose=false
Ответ будет выглядеть следующим образом:
{ "snapshots" : [ { "snapshot" : "snapshot-20200617", "uuid" : "dZyPs1HyTwS-cnKdH08EPg", "repository" : "my_repository", "indices" : [ ".apm-agent-configuration", ".apm-custom-link", ".ds-ilm-history-5-2022.06.17-000001", ".ds-my-data-stream-2022.06.17-000001", ".geoip_databases", ".kibana-event-log-8.2.2-000001", ".kibana_8.2.2_001", ".kibana_task_manager_8.2.2_001", "kibana_sample_data_ecommerce", "kibana_sample_data_flights", "kibana_sample_data_logs" ], "data_streams" : [ ], "state" : "SUCCESS" } ], "total" : 1, "remaining" : 0 }Имя снимка.
Репозиторий снимка.
Индексы, зарезервированные в снимке.
Успешно ли выполнено создание снимка.
- Снимок
snapshot-20200617содержит два индекса, которые мы хотим восстановить. У вас может быть несколько снимков, из которых вы можете восстановить целевые индексы. Выберите последний снимок. -
Теперь, когда мы нашли снимок, мы перейдем к подготовке потока данных для восстановления потерянных данных. Мы проверим метаданные индекса, чтобы увидеть, является ли какой-либо индекс частью потока данных:
resp = client.indices.get( index="kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", features="settings", flat_settings=True, ) print(resp)response = client.indices.get( index: 'kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001', features: 'settings', flat_settings: true ) puts response
const response = await client.indices.get({ index: "kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", features: "settings", flat_settings: "true", }); console.log(response);GET kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001?features=settings&flat_settings
Ответ будет выглядеть следующим образом:
{ ".ds-my-data-stream-2022.06.17-000001" : { "aliases" : { }, "mappings" : { }, "settings" : { "index.creation_date" : "1658406121699", "index.hidden" : "true", "index.lifecycle.name" : "my-lifecycle-policy", "index.number_of_replicas" : "1", "index.number_of_shards" : "1", "index.provided_name" : ".ds-my-data-stream-2022.06.17-000001", "index.routing.allocation.include._tier_preference" : "data_hot", "index.uuid" : "HmlFXp6VSu2XbQ-O3hVrwQ", "index.version.created" : "8020299" }, "data_stream" : "my-data-stream" }, "kibana_sample_data_flights" : { "aliases" : { }, "mappings" : { }, "settings" : { "index.creation_date" : "1655121541454", "index.number_of_replicas" : "0", "index.number_of_shards" : "1", "index.provided_name" : "kibana_sample_data_flights", "index.routing.allocation.include._tier_preference" : "data_content", "index.uuid" : "jMOlwKPPSzSraeeBWyuoDA", "index.version.created" : "8020299" } } }Имя индекса.
Настройки этого индекса, содержащие искомые метаданные.
Это указывает на то, что этот индекс является частью потока данных и отображает имя потока данных.
Имя другого индекса, который мы запросили.
Ответ выше показывает, что
kibana_sample_data_flightsне является частью потока данных, поскольку в настройках отсутствует поле под названиемdata_stream.Напротив,
.ds-my-data-stream-2022.06.17-000001является частью потока данных под названиемmy-data-stream. Когда вы найдете такой индекс, который принадлежит потоку данных, вам необходимо проверить, индексируются ли данные. Вы можете увидеть это, проверивsettings, если вы можете найти это свойство:"index.lifecycle.indexing_complete" : "true", это означает, что индексирование завершено в этом индексе, и вы можете перейти к следующему шагу.Если
index.lifecycle.indexing_completeотсутствует или настроен наfalse, вам необходимо перекатить поток данных, чтобы вы могли восстановить отсутствующие данные, не блокируя добавление новых данных. Следующая команда позволит это сделать.resp = client.indices.rollover( alias="my-data-stream", ) print(resp)response = client.indices.rollover( alias: 'my-data-stream' ) puts response
const response = await client.indices.rollover({ alias: "my-data-stream", }); console.log(response);POST my-data-stream/_rollover
-
Теперь, когда подготовка потока данных завершена, мы закроем целевые индексы, используя API close indices.
resp = client.indices.close( index="kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", ) print(resp)response = client.indices.close( index: 'kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001' ) puts response
const response = await client.indices.close({ index: "kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", }); console.log(response);POST kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001/_close
Вы можете убедиться, что они закрыты, используя API cat indices.
resp = client.cat.indices( v=True, health="red", h="index,status,health", ) print(resp)response = client.cat.indices( v: true, health: 'red', h: 'index,status,health' ) puts response
const response = await client.cat.indices({ v: "true", health: "red", h: "index,status,health", }); console.log(response);GET _cat/indices?v&health=red&h=index,status,health
Ответ будет выглядеть следующим образом:
index status health .ds-my-data-stream-2022.06.17-000001 close red kibana_sample_data_flights close red
-
Индексы закрыты, теперь мы можем восстановить их из снимков, не вызывая никаких осложнений, используя API restore snapshot:
resp = client.snapshot.restore( repository="my_repository", snapshot="snapshot-20200617", indices="kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", include_aliases=True, ) print(resp)response = client.snapshot.restore( repository: 'my_repository', snapshot: 'snapshot-20200617', body: { indices: 'kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001', include_aliases: true } ) puts responseconst response = await client.snapshot.restore({ repository: "my_repository", snapshot: "snapshot-20200617", indices: "kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", include_aliases: true, }); console.log(response);POST _snapshot/my_repository/snapshot-20200617/_restore { "indices": "kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", "include_aliases": true }Индексы для восстановления.
Мы также хотим восстановить псевдонимы.
Если необходимо восстановить какие-либо состояния функций, нам нужно будет указать их с помощью поля
feature_states, а индексы, принадлежащие к восстанавливаемым состояниям функций, не должны указываться подindices. API Health возвращает какindices, так иfeature_states, которые необходимо восстановить для диагностики восстановления из снимка. например:resp = client.snapshot.restore( repository="my_repository", snapshot="snapshot-20200617", feature_states=[ "geoip" ], indices="kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", include_aliases=True, ) print(resp)response = client.snapshot.restore( repository: 'my_repository', snapshot: 'snapshot-20200617', body: { feature_states: [ 'geoip' ], indices: 'kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001', include_aliases: true } ) puts responseconst response = await client.snapshot.restore({ repository: "my_repository", snapshot: "snapshot-20200617", feature_states: ["geoip"], indices: "kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", include_aliases: true, }); console.log(response);POST _snapshot/my_repository/snapshot-20200617/_restore { "feature_states": [ "geoip" ], "indices": "kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", "include_aliases": true } -
Наконец, мы можем проверить, что состояние индексов теперь
green, используя API cat indices.resp = client.cat.indices( v=True, index=".ds-my-data-stream-2022.06.17-000001,kibana_sample_data_flightsh=index,status,health", ) print(resp)response = client.cat.indices( v: true, index: '.ds-my-data-stream-2022.06.17-000001,kibana_sample_data_flightsh=index,status,health' ) puts response
const response = await client.cat.indices({ v: "true", index: ".ds-my-data-stream-2022.06.17-000001,kibana_sample_data_flightsh=index,status,health", }); console.log(response);GET _cat/indices?v&index=.ds-my-data-stream-2022.06.17-000001,kibana_sample_data_flightsh=index,status,health
Ответ будет выглядеть следующим образом:
index status health .ds-my-data-stream-2022.06.17-000001 open green kibana_sample_data_flights open green
Как мы видим выше, индексы
greenи открыты. Проблема решена.
Для получения дополнительной информации о создании и восстановлении снимков см. это руководство.
Для восстановления индексов, у которых отсутствуют фрагменты:
-
Просмотрите затронутые индексы, используя API cat indices API.
resp = client.cat.indices( v=True, health="red", h="index,status,health", ) print(resp)response = client.cat.indices( v: true, health: 'red', h: 'index,status,health' ) puts response
const response = await client.cat.indices({ v: "true", health: "red", h: "index,status,health", }); console.log(response);GET _cat/indices?v&health=red&h=index,status,health
Ответ будет выглядеть следующим образом:
index status health .ds-my-data-stream-2022.06.17-000001 open red kibana_sample_data_flights open red
Состояние индексов выше указывает на то, что в этих индексах отсутствуют первичные фрагменты, что означает потерю данных.
-
Для восстановления данных нам необходимо найти снимок, который содержит эти два индекса. Для поиска такого снимка используйте API получения снимка.
resp = client.snapshot.get( repository="my_repository", snapshot="*", verbose=False, ) print(resp)response = client.snapshot.get( repository: 'my_repository', snapshot: '*', verbose: false ) puts response
const response = await client.snapshot.get({ repository: "my_repository", snapshot: "*", verbose: "false", }); console.log(response);GET _snapshot/my_repository/*?verbose=false
Ответ будет выглядеть следующим образом:
{ "snapshots" : [ { "snapshot" : "snapshot-20200617", "uuid" : "dZyPs1HyTwS-cnKdH08EPg", "repository" : "my_repository", "indices" : [ ".apm-agent-configuration", ".apm-custom-link", ".ds-ilm-history-5-2022.06.17-000001", ".ds-my-data-stream-2022.06.17-000001", ".geoip_databases", ".kibana-event-log-8.2.2-000001", ".kibana_8.2.2_001", ".kibana_task_manager_8.2.2_001", "kibana_sample_data_ecommerce", "kibana_sample_data_flights", "kibana_sample_data_logs" ], "data_streams" : [ ], "state" : "SUCCESS" } ], "total" : 1, "remaining" : 0 }Имя снимка.
Репозиторий снимка.
Индексы, резервные копии которых находятся в снимке.
Успешно ли был создан снимок.
- Снимок
snapshot-20200617содержит два индекса, которые мы хотим восстановить. У вас может быть несколько снимков, из которых можно восстановить целевые индексы. Выберите последний снимок. -
Теперь, когда мы нашли снимок, мы приступим к подготовке потока данных для восстановления потерянных данных. Мы проверим метаданные индекса, чтобы определить, является ли какой-либо индекс частью потока данных:
resp = client.indices.get( index="kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", features="settings", flat_settings=True, ) print(resp)response = client.indices.get( index: 'kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001', features: 'settings', flat_settings: true ) puts response
const response = await client.indices.get({ index: "kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", features: "settings", flat_settings: "true", }); console.log(response);GET kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001?features=settings&flat_settings
Ответ будет выглядеть следующим образом:
{ ".ds-my-data-stream-2022.06.17-000001" : { "aliases" : { }, "mappings" : { }, "settings" : { "index.creation_date" : "1658406121699", "index.hidden" : "true", "index.lifecycle.name" : "my-lifecycle-policy", "index.number_of_replicas" : "1", "index.number_of_shards" : "1", "index.provided_name" : ".ds-my-data-stream-2022.06.17-000001", "index.routing.allocation.include._tier_preference" : "data_hot", "index.uuid" : "HmlFXp6VSu2XbQ-O3hVrwQ", "index.version.created" : "8020299" }, "data_stream" : "my-data-stream" }, "kibana_sample_data_flights" : { "aliases" : { }, "mappings" : { }, "settings" : { "index.creation_date" : "1655121541454", "index.number_of_replicas" : "0", "index.number_of_shards" : "1", "index.provided_name" : "kibana_sample_data_flights", "index.routing.allocation.include._tier_preference" : "data_content", "index.uuid" : "jMOlwKPPSzSraeeBWyuoDA", "index.version.created" : "8020299" } } }Имя индекса.
Настройки этого индекса, содержащие искомые метаданные.
Указывает, что этот индекс является частью потока данных, и отображает имя потока данных.
Имя другого индекса, который мы запросили.
Ответ выше показывает, что
kibana_sample_data_flightsне является частью потока данных, поскольку в настройках нет поляdata_stream.Напротив,
.ds-my-data-stream-2022.06.17-000001является частью потока данных под названиемmy-data-stream. Когда вы обнаруживаете такой индекс, принадлежащий потоку данных, необходимо проверить, продолжается ли индексация данных. Вы можете это сделать, проверивsettings. Если вы найдете свойство"index.lifecycle.indexing_complete" : "true", это означает, что индексация в этом индексе завершена, и вы можете перейти к следующему шагу.Если
index.lifecycle.indexing_completeотсутствует или настроено наfalse, необходимо выполнить перенос потока данных, чтобы можно было восстановить недостающие данные, не блокируя загрузку новых данных. Следующая команда позволит это сделать.resp = client.indices.rollover( alias="my-data-stream", ) print(resp)response = client.indices.rollover( alias: 'my-data-stream' ) puts response
const response = await client.indices.rollover({ alias: "my-data-stream", }); console.log(response);POST my-data-stream/_rollover
-
После завершения подготовки потока данных мы закроем целевые индексы, используя API закрытия индексов.
resp = client.indices.close( index="kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", ) print(resp)response = client.indices.close( index: 'kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001' ) puts response
const response = await client.indices.close({ index: "kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", }); console.log(response);POST kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001/_close
Вы можете подтвердить их закрытие с помощью API cat indices API.
resp = client.cat.indices( v=True, health="red", h="index,status,health", ) print(resp)response = client.cat.indices( v: true, health: 'red', h: 'index,status,health' ) puts response
const response = await client.cat.indices({ v: "true", health: "red", h: "index,status,health", }); console.log(response);GET _cat/indices?v&health=red&h=index,status,health
Ответ будет выглядеть следующим образом:
index status health .ds-my-data-stream-2022.06.17-000001 close red kibana_sample_data_flights close red
-
Индексы закрыты, теперь мы можем восстановить их из снимков без проблем, используя API восстановления снимка:
resp = client.snapshot.restore( repository="my_repository", snapshot="snapshot-20200617", indices="kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", include_aliases=True, ) print(resp)response = client.snapshot.restore( repository: 'my_repository', snapshot: 'snapshot-20200617', body: { indices: 'kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001', include_aliases: true } ) puts responseconst response = await client.snapshot.restore({ repository: "my_repository", snapshot: "snapshot-20200617", indices: "kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", include_aliases: true, }); console.log(response);POST _snapshot/my_repository/snapshot-20200617/_restore { "indices": "kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", "include_aliases": true }Индексы для восстановления.
Мы также хотим восстановить алиасы.
Если необходимо восстановить какие-либо состояния состояний функций, нам нужно указать их с помощью поля
feature_states, и индексы, принадлежащие состояниям функций, которые мы восстанавливаем, не должны быть указаны вindices. API здоровья возвращает состоянияindicesиfeature_states, которые необходимо восстановить для диагностики восстановления из снимка. Например:resp = client.snapshot.restore( repository="my_repository", snapshot="snapshot-20200617", feature_states=[ "geoip" ], indices="kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", include_aliases=True, ) print(resp)response = client.snapshot.restore( repository: 'my_repository', snapshot: 'snapshot-20200617', body: { feature_states: [ 'geoip' ], indices: 'kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001', include_aliases: true } ) puts responseconst response = await client.snapshot.restore({ repository: "my_repository", snapshot: "snapshot-20200617", feature_states: ["geoip"], indices: "kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", include_aliases: true, }); console.log(response);POST _snapshot/my_repository/snapshot-20200617/_restore { "feature_states": [ "geoip" ], "indices": "kibana_sample_data_flights,.ds-my-data-stream-2022.06.17-000001", "include_aliases": true } -
Наконец, мы можем проверить, что состояние здоровья индексов теперь
green, используя API cat indices API.resp = client.cat.indices( v=True, index=".ds-my-data-stream-2022.06.17-000001,kibana_sample_data_flightsh=index,status,health", ) print(resp)response = client.cat.indices( v: true, index: '.ds-my-data-stream-2022.06.17-000001,kibana_sample_data_flightsh=index,status,health' ) puts response
const response = await client.cat.indices({ v: "true", index: ".ds-my-data-stream-2022.06.17-000001,kibana_sample_data_flightsh=index,status,health", }); console.log(response);GET _cat/indices?v&index=.ds-my-data-stream-2022.06.17-000001,kibana_sample_data_flightsh=index,status,health
Из ответа выше видно, что индексы
greenи открыты. Проблема решена.
Дополнительные рекомендации по созданию и восстановлению снимков см. в этом руководстве.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/restore-from-snapshot.html