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

Диагностика поврежденных хранилищ

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

Для исправления поврежденного хранилища потребуется внести изменения в несколько развертываний, которые записывают данные в одно и то же хранилище снимков. Только одно развертывание должно записывать данные в хранилище. Развертывание, которое будет продолжать запись в хранилище, будет называться "первичным" развертыванием (текущий кластер), а другие развертывания, где мы отметим хранилище как только для чтения, будут называться "вторичными" развертываниями.

Сначала отметьте хранилище как только для чтения во вторичных развертываниях:

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

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

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

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

    Kibana Console
  4. Теперь должно быть видно таблицу хранилищ. Щелкните значок карандаша справа от хранилища, которое нужно отметить как только для чтения. На открывшейся странице "Редактирование" прокрутите вниз и установите флажок "Хранилище только для чтения". Нажмите "Сохранить". В качестве альтернативы, если предпочтительнее удалить хранилище, установите флажок слева от имени хранилища в таблице хранилищ и нажмите красную кнопку "Удалить хранилище" в левом верхнем углу таблицы.

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

Обратите внимание, что сейчас мы настраиваем первичное (текущее) развертывание.

  1. Откройте меню боковой навигации первичного развертывания (расположенное под логотипом Elastic в верхнем левом углу) и перейдите к Управление стеком > Снимок и восстановление > Хранилища.

    Kibana Console
  2. Нажмите значок карандаша справа от хранилища. На открывшейся странице "Редактирование" прокрутите вниз и нажмите "Сохранить", не внося никаких изменений в существующие настройки.

Для исправления поврежденного репозитория потребуется внести изменения в несколько кластеров, которые записывают в один и тот же репозиторий снимков. Только один кластер должен записывать в репозиторий. Назовем кластер, в который мы хотим продолжать запись в репозиторий, "главным" кластером (текущий кластер), а другие кластеры, где мы обозначим репозиторий как только для чтения, — "вспомогательными" кластерами.

Давайте сначала поработаем со вспомогательными кластерами:

  1. Получите конфигурацию репозитория:

    resp = client.snapshot.get_repository(
        name="my-repo",
    )
    print(resp)
    response = client.snapshot.get_repository(
      repository: 'my-repo'
    )
    puts response
    const response = await client.snapshot.getRepository({
      name: "my-repo",
    });
    console.log(response);
    GET _snapshot/my-repo

    Ответ будет выглядеть так:

    {
      "my-repo": { 
        "type": "s3",
        "settings": {
          "bucket": "repo-bucket",
          "client": "elastic-internal-71bcd3",
          "base_path": "myrepo"
        }
      }
    }

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

  2. Используя полученные выше настройки, добавьте опцию readonly: true, чтобы отметить его как только для чтения:

    resp = client.snapshot.create_repository(
        name="my-repo",
        repository={
            "type": "s3",
            "settings": {
                "bucket": "repo-bucket",
                "client": "elastic-internal-71bcd3",
                "base_path": "myrepo",
                "readonly": True
            }
        },
    )
    print(resp)
    const response = await client.snapshot.createRepository({
      name: "my-repo",
      repository: {
        type: "s3",
        settings: {
          bucket: "repo-bucket",
          client: "elastic-internal-71bcd3",
          base_path: "myrepo",
          readonly: true,
        },
      },
    });
    console.log(response);
    PUT _snapshot/my-repo
    {
        "type": "s3",
        "settings": {
          "bucket": "repo-bucket",
          "client": "elastic-internal-71bcd3",
          "base_path": "myrepo",
          "readonly": true 
        }
    }

    Отмечает репозиторий как только для чтения.

  3. В качестве альтернативы, можно удалить репозиторий, используя:

    resp = client.snapshot.delete_repository(
        name="my-repo",
    )
    print(resp)
    response = client.snapshot.delete_repository(
      repository: 'my-repo'
    )
    puts response
    const response = await client.snapshot.deleteRepository({
      name: "my-repo",
    });
    console.log(response);
    DELETE _snapshot/my-repo

    Ответ будет выглядеть так:

    {
      "acknowledged": true
    }

В этот момент только в главном (текущем) кластере репозиторий отмечен как доступный для записи. Однако Elasticsearch видит его как поврежденный, поэтому давайте пересоздадим его, чтобы Elasticsearch мог продолжить его использование. Обратите внимание, что теперь мы настраиваем главный (текущий) кластер:

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

    resp = client.snapshot.get_repository(
        name="my-repo",
    )
    print(resp)
    response = client.snapshot.get_repository(
      repository: 'my-repo'
    )
    puts response
    const response = await client.snapshot.getRepository({
      name: "my-repo",
    });
    console.log(response);
    GET _snapshot/my-repo
  2. Используя полученную выше конфигурацию, давайте пересоздадим репозиторий:

    resp = client.snapshot.create_repository(
        name="my-repo",
        repository={
            "type": "s3",
            "settings": {
                "bucket": "repo-bucket",
                "client": "elastic-internal-71bcd3",
                "base_path": "myrepo"
            }
        },
    )
    print(resp)
    const response = await client.snapshot.createRepository({
      name: "my-repo",
      repository: {
        type: "s3",
        settings: {
          bucket: "repo-bucket",
          client: "elastic-internal-71bcd3",
          base_path: "myrepo",
        },
      },
    });
    console.log(response);
    PUT _snapshot/my-repo
    {
      "type": "s3",
      "settings": {
        "bucket": "repo-bucket",
        "client": "elastic-internal-71bcd3",
        "base_path": "myrepo"
      }
    }

    Ответ будет выглядеть так:

    {
      "acknowledged": true
    }

© 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/diagnosing-corrupted-repositories.html

Spec-Zone.ru

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