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

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

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

В этом руководстве вы узнаете, как:

  • Получить список доступных моментальных снимков
  • Восстановить индекс или поток данных из моментального снимка
  • Восстановить состояние функции
  • Восстановить весь кластер
  • Отслеживать операцию восстановления
  • Отменить текущую операцию восстановления

Это руководство также содержит советы по восстановлению в другом кластере и отладке распространенных ошибок восстановления.

Предварительные условия

  • Для использования функции Моментальные снимки и восстановление Kibana вам необходимо иметь следующие разрешения:

    • Разрешения на кластер: monitor, manage_slm, cluster:admin/snapshot и cluster:admin/repository
    • Разрешения на индексы: all для индекса monitor
  • Вы можете восстановить моментальный снимок только в работающий кластер с выбранным узлом-мастером. Репозиторий моментального снимка должен быть зарегистрирован и доступен для кластера.
  • Версии моментального снимка и кластера должны быть совместимы. См. совместимость моментальных снимков.
  • Для восстановления моментального снимка метаданные кластера должны быть доступны для записи. Убедитесь, что в кластере нет блокировок доступа к метаданным, которые запрещают запись. Операция восстановления игнорирует блокировки индексов.
  • Перед восстановлением потока данных убедитесь, что кластер содержит соответствующую шаблон индекса с включенным потоком данных. Для проверки используйте функцию Управление индексами Kibana или API получения шаблона индекса:

    resp = client.indices.get_index_template(
        name="*",
        filter_path="index_templates.name,index_templates.index_template.index_patterns,index_templates.index_template.data_stream",
    )
    print(resp)
    response = client.indices.get_index_template(
      name: '*',
      filter_path: 'index_templates.name,index_templates.index_template.index_patterns,index_templates.index_template.data_stream'
    )
    puts response
    const response = await client.indices.getIndexTemplate({
      name: "*",
      filter_path:
        "index_templates.name,index_templates.index_template.index_patterns,index_templates.index_template.data_stream",
    });
    console.log(response);
    GET _index_template/*?filter_path=index_templates.name,index_templates.index_template.index_patterns,index_templates.index_template.data_stream

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

  • Если ваш моментальный снимок содержит данные из App Search или Workplace Search, убедитесь, что вы восстановили ключ шифрования Enterprise Search перед восстановлением моментального снимка.

Рекомендации

При восстановлении данных из моментального снимка имейте в виду следующее:

  • При восстановлении потока данных вы также восстанавливаете его базовые индексы.
  • Вы можете восстановить существующий индекс только если он закрыт и индекс в моментальном снимке имеет то же количество первичных фрагментов.
  • Вы не можете восстановить существующий открытый индекс. Это включает базовые индексы для потока данных.
  • Операция восстановления автоматически открывает восстановленные индексы, включая базовые индексы.
  • Вы можете восстановить только определенный базовый индекс из потока данных. Однако операция восстановления не добавляет восстановленный базовый индекс к любому существующему потоку данных.

Получение списка доступных моментальных снимков

Чтобы просмотреть список доступных моментальных снимков в Kibana, перейдите в главное меню и нажмите Управление стеком > Моментальные снимки и восстановление.

Вы также можете использовать API получения репозитория моментальных снимков и API получения моментального снимка, чтобы найти доступные для восстановления моментальные снимки. Сначала используйте API получения репозитория, чтобы получить список зарегистрированных репозиториев моментальных снимков.

resp = client.snapshot.get_repository()
print(resp)
response = client.snapshot.get_repository
puts response
const response = await client.snapshot.getRepository();
console.log(response);
GET _snapshot

Затем используйте 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

Восстановление индекса или потока данных

Вы можете восстановить моментальный снимок, используя функцию Моментальные снимки и восстановление Kibana или API восстановления моментального снимка.

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

Если вы восстанавливаете данные в существующий кластер, используйте один из следующих методов, чтобы избежать конфликтов с существующими индексами и потоками данных:

  • Удалить и восстановить
  • Переименовать при восстановлении

Удалить и восстановить

Самый простой способ избежать конфликтов — удалить существующий индекс или поток данных перед его восстановлением. Чтобы предотвратить случайное повторное создание индекса или потока данных, рекомендуется временно остановить всю индексацию до завершения операции восстановления.

Если значение параметра action.destructive_requires_name кластера установлено в false, не используйте API удаления индекса для указания шаблонов * или .*. Если у вас включены средства безопасности Elasticsearch, это приведет к удалению системных индексов, необходимых для аутентификации. Вместо этого укажите шаблон *,-.*, чтобы исключить эти системные индексы и другие имена индексов, начинающиеся с точки (.).

resp = client.indices.delete(
    index="my-index",
)
print(resp)

resp1 = client.indices.delete_data_stream(
    name="logs-my_app-default",
)
print(resp1)
response = client.indices.delete(
  index: 'my-index'
)
puts response

response = client.indices.delete_data_stream(
  name: 'logs-my_app-default'
)
puts response
const response = await client.indices.delete({
  index: "my-index",
});
console.log(response);

const response1 = await client.indices.deleteDataStream({
  name: "logs-my_app-default",
});
console.log(response1);
# Delete an index
DELETE my-index

# Delete a data stream
DELETE _data_stream/logs-my_app-default

В запросе на восстановление явно укажите индексы и потоки данных, которые нужно восстановить.

resp = client.snapshot.restore(
    repository="my_repository",
    snapshot="my_snapshot_2099.05.06",
    indices="my-index,logs-my_app-default",
)
print(resp)
response = client.snapshot.restore(
  repository: 'my_repository',
  snapshot: 'my_snapshot_2099.05.06',
  body: {
    indices: 'my-index,logs-my_app-default'
  }
)
puts response
const response = await client.snapshot.restore({
  repository: "my_repository",
  snapshot: "my_snapshot_2099.05.06",
  indices: "my-index,logs-my_app-default",
});
console.log(response);
POST _snapshot/my_repository/my_snapshot_2099.05.06/_restore
{
  "indices": "my-index,logs-my_app-default"
}

Переименование при восстановлении

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

Перед началом убедитесь, что в кластере достаточно места для существующих и восстановленных данных.

Следующий запрос API восстановления моментального снимка добавляет префикс restored- к имени любого восстановленного индекса или потока данных.

resp = client.snapshot.restore(
    repository="my_repository",
    snapshot="my_snapshot_2099.05.06",
    indices="my-index,logs-my_app-default",
    rename_pattern="(.+)",
    rename_replacement="restored-$1",
)
print(resp)
response = client.snapshot.restore(
  repository: 'my_repository',
  snapshot: 'my_snapshot_2099.05.06',
  body: {
    indices: 'my-index,logs-my_app-default',
    rename_pattern: '(.+)',
    rename_replacement: 'restored-$1'
  }
)
puts response
const response = await client.snapshot.restore({
  repository: "my_repository",
  snapshot: "my_snapshot_2099.05.06",
  indices: "my-index,logs-my_app-default",
  rename_pattern: "(.+)",
  rename_replacement: "restored-$1",
});
console.log(response);
POST _snapshot/my_repository/my_snapshot_2099.05.06/_restore
{
  "indices": "my-index,logs-my_app-default",
  "rename_pattern": "(.+)",
  "rename_replacement": "restored-$1"
}

Если переименование приводит к тому, что два или более индексов или потоков данных имеют одинаковое имя, операция восстановления завершается с ошибкой.

Если вы переименовываете поток данных, его базовые индексы также переименовываются. Например, если вы переименовали поток данных logs-my_app-default в restored-logs-my_app-default, базовый индекс .ds-logs-my_app-default-2099.03.09-000005 переименовывается в .ds-restored-logs-my_app-default-2099.03.09-000005.

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

resp = client.indices.delete(
    index="my-index",
)
print(resp)

resp1 = client.reindex(
    source={
        "index": "restored-my-index"
    },
    dest={
        "index": "my-index"
    },
)
print(resp1)

resp2 = client.indices.delete_data_stream(
    name="logs-my_app-default",
)
print(resp2)

resp3 = client.reindex(
    source={
        "index": "restored-logs-my_app-default"
    },
    dest={
        "index": "logs-my_app-default",
        "op_type": "create"
    },
)
print(resp3)
response = client.indices.delete(
  index: 'my-index'
)
puts response

response = client.reindex(
  body: {
    source: {
      index: 'restored-my-index'
    },
    dest: {
      index: 'my-index'
    }
  }
)
puts response

response = client.indices.delete_data_stream(
  name: 'logs-my_app-default'
)
puts response

response = client.reindex(
  body: {
    source: {
      index: 'restored-logs-my_app-default'
    },
    dest: {
      index: 'logs-my_app-default',
      op_type: 'create'
    }
  }
)
puts response
const response = await client.indices.delete({
  index: "my-index",
});
console.log(response);

const response1 = await client.reindex({
  source: {
    index: "restored-my-index",
  },
  dest: {
    index: "my-index",
  },
});
console.log(response1);

const response2 = await client.indices.deleteDataStream({
  name: "logs-my_app-default",
});
console.log(response2);

const response3 = await client.reindex({
  source: {
    index: "restored-logs-my_app-default",
  },
  dest: {
    index: "logs-my_app-default",
    op_type: "create",
  },
});
console.log(response3);
# Delete the original index
DELETE my-index

# Reindex the restored index to rename it
POST _reindex
{
  "source": {
    "index": "restored-my-index"
  },
  "dest": {
    "index": "my-index"
  }
}

# Delete the original data stream
DELETE _data_stream/logs-my_app-default

# Reindex the restored data stream to rename it
POST _reindex
{
  "source": {
    "index": "restored-logs-my_app-default"
  },
  "dest": {
    "index": "logs-my_app-default",
    "op_type": "create"
  }
}

Восстановление состояния функции

Вы можете восстановить состояние функции для восстановления системных индексов, системных потоков данных и других конфигурационных данных функции из снимка.

Если вы восстанавливаете состояние кластера снимка, операция по умолчанию восстанавливает все состояния функций в снимке. Аналогично, если вы не восстанавливаете состояние кластера снимка, операция по умолчанию не восстанавливает какие-либо состояния функций. Вы также можете выбрать восстановление только определенных состояний функций из снимка, независимо от состояния кластера.

Чтобы просмотреть состояния функций снимка, используйте API получения снимка.

resp = client.snapshot.get(
    repository="my_repository",
    snapshot="my_snapshot_2099.05.06",
)
print(resp)
response = client.snapshot.get(
  repository: 'my_repository',
  snapshot: 'my_snapshot_2099.05.06'
)
puts response
const response = await client.snapshot.get({
  repository: "my_repository",
  snapshot: "my_snapshot_2099.05.06",
});
console.log(response);
GET _snapshot/my_repository/my_snapshot_2099.05.06

Свойство feature_states ответа содержит список функций в снимке, а также индексы каждой функции.

Чтобы восстановить определённое состояние функции из снимка, укажите feature_name из ответа в параметре feature_states API восстановления снимка.

При восстановлении состояния функции Elasticsearch закрывает и перезаписывает существующие индексы функции.

Восстановление состояния функции security перезаписывает системные индексы, используемые для аутентификации. Если вы используете Elasticsearch Service, убедитесь, что у вас есть доступ к консоли Elasticsearch Service перед восстановлением состояния функции security. Если вы запускаете Elasticsearch на собственном оборудовании, создайте суперпользователя в файловом домене, чтобы убедиться, что у вас по-прежнему будет доступ к вашему кластеру.

resp = client.snapshot.restore(
    repository="my_repository",
    snapshot="my_snapshot_2099.05.06",
    feature_states=[
        "geoip"
    ],
    include_global_state=False,
    indices="-*",
)
print(resp)
response = client.snapshot.restore(
  repository: 'my_repository',
  snapshot: 'my_snapshot_2099.05.06',
  body: {
    feature_states: [
      'geoip'
    ],
    include_global_state: false,
    indices: '-*'
  }
)
puts response
const response = await client.snapshot.restore({
  repository: "my_repository",
  snapshot: "my_snapshot_2099.05.06",
  feature_states: ["geoip"],
  include_global_state: false,
  indices: "-*",
});
console.log(response);
POST _snapshot/my_repository/my_snapshot_2099.05.06/_restore
{
  "feature_states": [ "geoip" ],
  "include_global_state": false,    
  "indices": "-*"                   
}

Исключить состояние кластера из операции восстановления.

Исключить другие индексы и потоки данных в снимке из операции восстановления.

Восстановление всего кластера

В некоторых случаях вам необходимо восстановить весь кластер из снимка, включая состояние кластера и все состояния функций. Такие случаи должны быть редкими, например, в случае катастрофического сбоя.

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

Если вы восстанавливаете в другой кластер, см. Восстановление в другой кластер перед началом.

  1. Если вы сохранили конфигурационные файлы кластера, вы можете восстановить их на каждом узле. Этот шаг необязателен и требует полной перезагрузки кластера.

    После остановки узла скопируйте сохраненные конфигурационные файлы в директорию $ES_PATH_CONF узла. Перед перезапуском узла убедитесь, что elasticsearch.yml содержит соответствующие роли узла, имя узла и другие настройки, специфичные для узла.

    Если вы выбрали выполнение этого шага, вы должны повторить этот процесс на каждом узле в кластере.

  2. Временно остановите индексирование и отключите следующие функции:

    • Загрузчик базы данных GeoIP и хранилище истории ILM

      resp = client.cluster.put_settings(
          persistent={
              "ingest.geoip.downloader.enabled": False,
              "indices.lifecycle.history_index_enabled": False
          },
      )
      print(resp)
      response = client.cluster.put_settings(
        body: {
          persistent: {
            'ingest.geoip.downloader.enabled' => false,
            'indices.lifecycle.history_index_enabled' => false
          }
        }
      )
      puts response
      const response = await client.cluster.putSettings({
        persistent: {
          "ingest.geoip.downloader.enabled": false,
          "indices.lifecycle.history_index_enabled": false,
        },
      });
      console.log(response);
      PUT _cluster/settings
      {
        "persistent": {
          "ingest.geoip.downloader.enabled": false,
          "indices.lifecycle.history_index_enabled": false
        }
      }
    • ILM

      resp = client.ilm.stop()
      print(resp)
      response = client.ilm.stop
      puts response
      const response = await client.ilm.stop();
      console.log(response);
      POST _ilm/stop
    • Машинное обучение

      resp = client.ml.set_upgrade_mode(
          enabled=True,
      )
      print(resp)
      response = client.ml.set_upgrade_mode(
        enabled: true
      )
      puts response
      const response = await client.ml.setUpgradeMode({
        enabled: "true",
      });
      console.log(response);
      POST _ml/set_upgrade_mode?enabled=true
    • Мониторинг

      resp = client.cluster.put_settings(
          persistent={
              "xpack.monitoring.collection.enabled": False
          },
      )
      print(resp)
      response = client.cluster.put_settings(
        body: {
          persistent: {
            'xpack.monitoring.collection.enabled' => false
          }
        }
      )
      puts response
      const response = await client.cluster.putSettings({
        persistent: {
          "xpack.monitoring.collection.enabled": false,
        },
      });
      console.log(response);
      PUT _cluster/settings
      {
        "persistent": {
          "xpack.monitoring.collection.enabled": false
        }
      }
    • Watcher

      resp = client.watcher.stop()
      print(resp)
      response = client.watcher.stop
      puts response
      const response = await client.watcher.stop();
      console.log(response);
      POST _watcher/_stop
    • Универсальное профилирование

      Проверьте, включено ли управление шаблонами индексов Universal Profiling:

      resp = client.cluster.get_settings(
          filter_path="**.xpack.profiling.templates.enabled",
          include_defaults=True,
      )
      print(resp)
      response = client.cluster.get_settings(
        filter_path: '**.xpack.profiling.templates.enabled',
        include_defaults: true
      )
      puts response
      const response = await client.cluster.getSettings({
        filter_path: "**.xpack.profiling.templates.enabled",
        include_defaults: "true",
      });
      console.log(response);
      GET /_cluster/settings?filter_path=**.xpack.profiling.templates.enabled&include_defaults=true

      Если значение равно true, отключите управление шаблонами индексов Universal Profiling:

      resp = client.cluster.put_settings(
          persistent={
              "xpack.profiling.templates.enabled": False
          },
      )
      print(resp)
      response = client.cluster.put_settings(
        body: {
          persistent: {
            'xpack.profiling.templates.enabled' => false
          }
        }
      )
      puts response
      const response = await client.cluster.putSettings({
        persistent: {
          "xpack.profiling.templates.enabled": false,
        },
      });
      console.log(response);
      PUT _cluster/settings
      {
        "persistent": {
          "xpack.profiling.templates.enabled": false
        }
      }
  3. Если вы используете функции безопасности Elasticsearch, войдите в систему на хост узла, перейдите в каталог установки Elasticsearch и добавьте пользователя с ролью superuser в область файлов с помощью инструмента elasticsearch-users.

    Например, следующая команда создает пользователя с именем restore_user.

    ./bin/elasticsearch-users useradd restore_user -p my_password -r superuser

    Используйте этого пользователя для аутентификации запросов до завершения операции восстановления.

  4. Используйте API обновления настроек кластера, чтобы установить action.destructive_requires_name на false. Это позволит вам удалять потоки данных и индексы с использованием подстановочных символов.

    resp = client.cluster.put_settings(
        persistent={
            "action.destructive_requires_name": False
        },
    )
    print(resp)
    response = client.cluster.put_settings(
      body: {
        persistent: {
          'action.destructive_requires_name' => false
        }
      }
    )
    puts response
    const response = await client.cluster.putSettings({
      persistent: {
        "action.destructive_requires_name": false,
      },
    });
    console.log(response);
    PUT _cluster/settings
    {
      "persistent": {
        "action.destructive_requires_name": false
      }
    }
  5. Удалите все существующие потоки данных в кластере.

    resp = client.indices.delete_data_stream(
        name="*",
        expand_wildcards="all",
    )
    print(resp)
    response = client.indices.delete_data_stream(
      name: '*',
      expand_wildcards: 'all'
    )
    puts response
    const response = await client.indices.deleteDataStream({
      name: "*",
      expand_wildcards: "all",
    });
    console.log(response);
    DELETE _data_stream/*?expand_wildcards=all
  6. Удалите все существующие индексы в кластере.

    resp = client.indices.delete(
        index="*",
        expand_wildcards="all",
    )
    print(resp)
    response = client.indices.delete(
      index: '*',
      expand_wildcards: 'all'
    )
    puts response
    const response = await client.indices.delete({
      index: "*",
      expand_wildcards: "all",
    });
    console.log(response);
    DELETE *?expand_wildcards=all
  7. Восстановите весь снимок, включая состояние кластера. По умолчанию восстановление состояния кластера также восстанавливает любые состояния функций в снимке.

    resp = client.snapshot.restore(
        repository="my_repository",
        snapshot="my_snapshot_2099.05.06",
        indices="*",
        include_global_state=True,
    )
    print(resp)
    response = client.snapshot.restore(
      repository: 'my_repository',
      snapshot: 'my_snapshot_2099.05.06',
      body: {
        indices: '*',
        include_global_state: true
      }
    )
    puts response
    const response = await client.snapshot.restore({
      repository: "my_repository",
      snapshot: "my_snapshot_2099.05.06",
      indices: "*",
      include_global_state: true,
    });
    console.log(response);
    POST _snapshot/my_repository/my_snapshot_2099.05.06/_restore
    {
      "indices": "*",
      "include_global_state": true
    }
  8. По завершении операции восстановления возобновите индексирование и перезапустите любые остановленные функции:

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

    • Загрузчик базы данных GeoIP и хранилище истории ILM

      resp = client.cluster.put_settings(
          persistent={
              "ingest.geoip.downloader.enabled": True,
              "indices.lifecycle.history_index_enabled": True
          },
      )
      print(resp)
      response = client.cluster.put_settings(
        body: {
          persistent: {
            'ingest.geoip.downloader.enabled' => true,
            'indices.lifecycle.history_index_enabled' => true
          }
        }
      )
      puts response
      const response = await client.cluster.putSettings({
        persistent: {
          "ingest.geoip.downloader.enabled": true,
          "indices.lifecycle.history_index_enabled": true,
        },
      });
      console.log(response);
      PUT _cluster/settings
      {
        "persistent": {
          "ingest.geoip.downloader.enabled": true,
          "indices.lifecycle.history_index_enabled": true
        }
      }
    • ILM

      resp = client.ilm.start()
      print(resp)
      response = client.ilm.start
      puts response
      const response = await client.ilm.start();
      console.log(response);
      POST _ilm/start
    • Машинное обучение

      resp = client.ml.set_upgrade_mode(
          enabled=False,
      )
      print(resp)
      response = client.ml.set_upgrade_mode(
        enabled: false
      )
      puts response
      const response = await client.ml.setUpgradeMode({
        enabled: "false",
      });
      console.log(response);
      POST _ml/set_upgrade_mode?enabled=false
    • Мониторинг

      resp = client.cluster.put_settings(
          persistent={
              "xpack.monitoring.collection.enabled": True
          },
      )
      print(resp)
      response = client.cluster.put_settings(
        body: {
          persistent: {
            'xpack.monitoring.collection.enabled' => true
          }
        }
      )
      puts response
      const response = await client.cluster.putSettings({
        persistent: {
          "xpack.monitoring.collection.enabled": true,
        },
      });
      console.log(response);
      PUT _cluster/settings
      {
        "persistent": {
          "xpack.monitoring.collection.enabled": true
        }
      }
    • Watcher

      resp = client.watcher.start()
      print(resp)
      response = client.watcher.start
      puts response
      const response = await client.watcher.start();
      console.log(response);
      POST _watcher/_start
    • Универсальное профилирование

      Если значение было true изначально, снова включите управление шаблонами индексов Universal Profiling, иначе пропустите этот шаг:

      resp = client.cluster.put_settings(
          persistent={
              "xpack.profiling.templates.enabled": True
          },
      )
      print(resp)
      response = client.cluster.put_settings(
        body: {
          persistent: {
            'xpack.profiling.templates.enabled' => true
          }
        }
      )
      puts response
      const response = await client.cluster.putSettings({
        persistent: {
          "xpack.profiling.templates.enabled": true,
        },
      });
      console.log(response);
      PUT _cluster/settings
      {
        "persistent": {
          "xpack.profiling.templates.enabled": true
        }
      }
  9. При необходимости, сбросьте настройку кластера action.destructive_requires_name.

    resp = client.cluster.put_settings(
        persistent={
            "action.destructive_requires_name": None
        },
    )
    print(resp)
    response = client.cluster.put_settings(
      body: {
        persistent: {
          'action.destructive_requires_name' => nil
        }
      }
    )
    puts response
    const response = await client.cluster.putSettings({
      persistent: {
        "action.destructive_requires_name": null,
      },
    });
    console.log(response);
    PUT _cluster/settings
    {
      "persistent": {
        "action.destructive_requires_name": null
      }
    }

Отслеживание восстановления

Операция восстановления использует процесс восстановления фрагментов yellow для восстановления основных фрагментов индекса из снимка. В то время как операция восстановления восстанавливает основные фрагменты, у кластера будет green статус здоровья.

После восстановления всех основных фрагментов процесс репликации создаёт и распределяет реплики по соответствующим узлам данных. По завершении репликации статус здоровья кластера обычно становится green.

После запуска восстановления в Kibana вы перейдете на страницу Статус восстановления. На этой странице вы можете отслеживать текущее состояние каждого фрагмента в снимке.

Вы также можете отслеживать восстановление снимка с помощью API Elasticsearch. Для мониторинга статуса здоровья кластера используйте API статуса здоровья кластера.

$response = $client->cluster()->health();
resp = client.cluster.health()
print(resp)
response = client.cluster.health
puts response
res, err := es.Cluster.Health()
fmt.Println(res, err)
const response = await client.cluster.health();
console.log(response);
GET _cluster/health

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

resp = client.indices.recovery(
    index="my-index",
)
print(resp)
response = client.indices.recovery(
  index: 'my-index'
)
puts response
const response = await client.indices.recovery({
  index: "my-index",
});
console.log(response);
GET my-index/_recovery

Для просмотра неназначенных фрагментов используйте API cat shards.

resp = client.cat.shards(
    v=True,
    h="index,shard,prirep,state,node,unassigned.reason",
    s="state",
)
print(resp)
response = client.cat.shards(
  v: true,
  h: 'index,shard,prirep,state,node,unassigned.reason',
  s: 'state'
)
puts response
const response = await client.cat.shards({
  v: "true",
  h: "index,shard,prirep,state,node,unassigned.reason",
  s: "state",
});
console.log(response);
GET _cat/shards?v=true&h=index,shard,prirep,state,node,unassigned.reason&s=state

Неназначенные фрагменты имеют состояние state UNASSIGNED. Значение prirep равно p для первичных фрагментов и r для реплик. unassigned.reason описывает причину, по которой фрагмент остаётся неназначенным.

Для получения более подробного объяснения статуса распределения неназначенного фрагмента используйте API cluster allocation explain.

resp = client.cluster.allocation_explain(
    index="my-index",
    shard=0,
    primary=False,
    current_node="my-node",
)
print(resp)
response = client.cluster.allocation_explain(
  body: {
    index: 'my-index',
    shard: 0,
    primary: false,
    current_node: 'my-node'
  }
)
puts response
const response = await client.cluster.allocationExplain({
  index: "my-index",
  shard: 0,
  primary: false,
  current_node: "my-node",
});
console.log(response);
GET _cluster/allocation/explain
{
  "index": "my-index",
  "shard": 0,
  "primary": false,
  "current_node": "my-node"
}

Отмена восстановления

Вы можете удалить индекс или поток данных, чтобы отменить текущее восстановление. Это также удалит все существующие данные в кластере для индекса или потока данных. Удаление индекса или потока данных не повлияет на снимок или его данные.

resp = client.indices.delete(
    index="my-index",
)
print(resp)

resp1 = client.indices.delete_data_stream(
    name="logs-my_app-default",
)
print(resp1)
response = client.indices.delete(
  index: 'my-index'
)
puts response

response = client.indices.delete_data_stream(
  name: 'logs-my_app-default'
)
puts response
const response = await client.indices.delete({
  index: "my-index",
});
console.log(response);

const response1 = await client.indices.deleteDataStream({
  name: "logs-my_app-default",
});
console.log(response1);
# Delete an index
DELETE my-index

# Delete a data stream
DELETE _data_stream/logs-my_app-default

Восстановление в другой кластер

Elasticsearch Service может помочь вам восстановить снимки из других развертываний. Смотрите Работа со снимками.

Снимки не привязаны к определенному кластеру или имени кластера. Вы можете создать снимок в одном кластере и восстановить его в другом совместимом кластере. Любой поток данных или индекс, который вы восстанавливаете из снимка, также должен быть совместим с версией текущего кластера. Топология кластеров не должна совпадать.

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

Перед началом операции восстановления убедитесь, что новый кластер имеет достаточную ёмкость для всех потоков данных или индексов, которые вы хотите восстановить. Если новый кластер имеет меньшую ёмкость, вы можете:

  • Добавить узлы или обновить оборудование для увеличения ёмкости.
  • Восстановить меньше индексов и потоков данных.
  • Уменьшить количество реплик для восстановленных индексов.

    Например, следующий запрос API восстановления снимка использует опцию index_settings для установки index.number_of_replicas в 1.

    resp = client.snapshot.restore(
        repository="my_repository",
        snapshot="my_snapshot_2099.05.06",
        indices="my-index,logs-my_app-default",
        index_settings={
            "index.number_of_replicas": 1
        },
    )
    print(resp)
    response = client.snapshot.restore(
      repository: 'my_repository',
      snapshot: 'my_snapshot_2099.05.06',
      body: {
        indices: 'my-index,logs-my_app-default',
        index_settings: {
          'index.number_of_replicas' => 1
        }
      }
    )
    puts response
    const response = await client.snapshot.restore({
      repository: "my_repository",
      snapshot: "my_snapshot_2099.05.06",
      indices: "my-index,logs-my_app-default",
      index_settings: {
        "index.number_of_replicas": 1,
      },
    });
    console.log(response);
    POST _snapshot/my_repository/my_snapshot_2099.05.06/_restore
    {
      "indices": "my-index,logs-my_app-default",
      "index_settings": {
        "index.number_of_replicas": 1
      }
    }

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

Операция восстановления также проверяет совместимость восстановленных постоянных настроек с текущим кластером, чтобы избежать случайного восстановления несовместимых настроек. Если вам необходимо восстановить снимок с несовместимыми постоянными настройками, попробуйте восстановить его без глобального состояния кластера.

Устранение неполадок при восстановлении

Вот как устранить распространённые ошибки, возвращаемые запросами восстановления.

Невозможно восстановить индекс [<индекс>], потому что открытый индекс с тем же именем уже существует в кластере

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

Невозможно восстановить индекс [<индекс>] с [x] фрагментами из снимка индекса [<индекс-снимка>] с [y] фрагментами

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

Для решения этой ошибки попробуйте один из методов в Восстановление индекса или потока данных.

© 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/snapshots-restore-snapshot.html

Spec-Zone.ru

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