Spec-Zone.ru › Elasticsearch 8
›Руководство по Elasticsearch [8.17] ›Устранение неполадок

Восстановление из снимка

Elasticsearch использует снимки для хранения копии ваших данных за пределами кластера. Вы можете восстановить снимок, чтобы восстановить индексы и потоки данных, для которых нет копий шардов в кластере. Это может произойти, если данные (индексы или потоки данных) были удалены или если изменился состав кластера, и текущие узлы в системе больше не содержат копию данных.

Для восстановления отсутствующих данных вам необходимо иметь резервную копию затронутых индексов и потоков данных, которая достаточно актуальна для вашего случая использования. Пожалуйста, не продолжайте, не подтвердив это.

Чтобы восстановить индексы и потоки данных, в которых отсутствуют данные:

Используйте Kibana

  1. Войдите в консоль Elastic Cloud.
  2. На панели Elasticsearch Service щелкните имя вашего развертывания.

    Если имя вашего развертывания отключено, ваши экземпляры Kibana могут быть неисправны, в этом случае, пожалуйста, свяжитесь с Elastic Support. Если ваше развертывание не включает Kibana, все, что вам нужно сделать, это сначала включить его.

  3. Откройте боковое меню навигации вашего развертывания (расположенное под логотипом Elastic в левом верхнем углу) и перейдите к Dev Tools > Console.

    Kibana Console
  4. Чтобы просмотреть затронутые индексы, используйте 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 индексов выше указывает на то, что в этих индексах отсутствуют основные шарды, что означает, что в них отсутствуют данные.

  5. Чтобы восстановить данные, нам нужно найти снимок, содержащий эти два индекса. Чтобы найти такой снимок, используйте 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
    }

    Имя снимка.

    Репозиторий снимка.

    Индексы, зарезервированные в снимке.

    Успешно ли выполнено создание снимка.

  6. Снимок snapshot-20200617 содержит два индекса, которые мы хотим восстановить. У вас может быть несколько снимков, из которых вы можете восстановить целевые индексы. Выберите последний снимок.
  7. Теперь, когда мы нашли снимок, мы перейдем к подготовке потока данных для восстановления потерянных данных. Мы проверим метаданные индекса, чтобы увидеть, является ли какой-либо индекс частью потока данных:

    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
  8. Теперь, когда подготовка потока данных завершена, мы закроем целевые индексы, используя 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
  9. Индексы закрыты, теперь мы можем восстановить их из снимков, не вызывая никаких осложнений, используя 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 response
    const 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 response
    const 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
    }
  10. Наконец, мы можем проверить, что состояние индексов теперь 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 и открыты. Проблема решена.

Для получения дополнительной информации о создании и восстановлении снимков см. это руководство.

Для восстановления индексов, у которых отсутствуют фрагменты:

  1. Просмотрите затронутые индексы, используя 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

    Состояние индексов выше указывает на то, что в этих индексах отсутствуют первичные фрагменты, что означает потерю данных.

  2. Для восстановления данных нам необходимо найти снимок, который содержит эти два индекса. Для поиска такого снимка используйте 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
    }

    Имя снимка.

    Репозиторий снимка.

    Индексы, резервные копии которых находятся в снимке.

    Успешно ли был создан снимок.

  3. Снимок snapshot-20200617 содержит два индекса, которые мы хотим восстановить. У вас может быть несколько снимков, из которых можно восстановить целевые индексы. Выберите последний снимок.
  4. Теперь, когда мы нашли снимок, мы приступим к подготовке потока данных для восстановления потерянных данных. Мы проверим метаданные индекса, чтобы определить, является ли какой-либо индекс частью потока данных:

    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
  5. После завершения подготовки потока данных мы закроем целевые индексы, используя 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
  6. Индексы закрыты, теперь мы можем восстановить их из снимков без проблем, используя 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 response
    const 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 response
    const 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
    }
  7. Наконец, мы можем проверить, что состояние здоровья индексов теперь 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API