Если мы говорим о репликации index, то конечно тут как такого бэкапа нет. Вы просто настраиваете репликацию index и храните копии index на нескольких узлах. Elasticsearch рекомендует строить кластера минимум с 3 узлами. Т.е в такой реализации вы можете иметь 2 копии index. Но если вы теряете все 3 узла кластера, то о данных конечно можно забыть.

Поэтому считать репликацию index за бэкапы не совсем правильно.

Snapshot и восстановление

API Snapshot and Restore обеспечивает механизм резервного копирования кластера. Он берет текущее состояние и данные в вашем кластере и сохраняет их в репозиторий. Вы должны сделать снимки своих данных, сохранить их в репозитории, а затем при необходимости восстановить эти данные.

Создание репозитория

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

Elasticsearch поддерживает следующие типы репозиториев:

  • Shared file system (fs) - обычная папка в файловой системе
  • Read-only URL
  • S3 - файловое хранилище поддерживающее S3 API (minio)
  • HDFS
  • Azure
  • Google Cloud Storage

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

PUT _snapshot/my_repo
{
  "type": "fs",
  "settings": {
    "location": "/mnt/backup"
  }
}

Если вы используете репозиторий типа FS, то его нужно будет также добавить в elasticsearch.yml используя path.repo.

sudo vim elasticsearch.yml
path:
  repo:
  - /mnt/backup

Shared file system

Сверху мы уже его коснулись, добавлю еще немного о его настройках:

  • max_restore_bytes_per_sec - скорость восстановления узла
  • max_snapshot_bytes_per_sec - частота моментальных snapshot узла. По умолчанию 40 МБ в секунду.
  • compress - включает сжатие

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

PUT _snapshot/my_repo
{
  "type": "fs",
  "settings": {
    "location": "/mnt/backup"б
    "compress": "true",
    "max_restore_bytes_per_sec": "10mb",
    "max_snapshot_bytes_per_sec": "10mb"
  }
}

Создание snapshot

После создания репозитория вы можете создать snapshot всех индексов с помощью _snapshot. Snapshot представляют собой копию данных на определенный момент времени и игнорируют любые изменения, которые происходят после создания snapshot. Snapshot являются инкрементными, и будут скопированы только данные, которые были добавлены / изменены после предыдущего snapshot. Рекомендуется делать частые снимки по нескольким причинам:

  • В случае аварии вы потеряете лишь небольшой объем данных.
  • Snapshot будет выполняться быстрее
PUT _snapshot/my_repo/my_snapshot_2021_06_19_01

Snapshot определённых index

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

PUT _snapshot/my_repo/my_snapshot_2021_06_19_02
{
  "indices": "my-index-*",
  "ignore_unavailable": true,
  "include_global_state": true
}

Проверка состояния Snapshot

Конечно же вы захотите знать в каком состоянии сейчас процесс Snapshot. Для этого можно воспользоваться _status.

PUT _snapshot/my_repo/my_snapshot_2021_06_19_02/_status

Также вы можете запустить процесс создания Snapshot в интерактивном режиме.

PUT _snapshot/my_repo/my_snapshot_2021_06_19_02?wait_for_completion=true

Управление Snapshot

Получить информацию обо всех Snapshot в репозитории можно используя следующий API:

GET _snapshot/my_repo/_all

Получить информацию об определенном Snapshot:

GET _snapshot/my_repo/my_snapshot_2021_06_19_02

Удалить Snapshot:

DELETE _snapshot/my_repo/my_snapshot_2021_06_19_02

Автоматический Snapshot

Конечно выполнять каждый раз Snapshot вручную это не дело. Если вы хотите автоматизировать этот процесс, вы можете использовать политики управления жизненным циклом снимков (SLM). Политики определяют, когда вы хотите сделать снимок и как долго вы его храните.

PUT /_slm/policy/everyday-snapshot
{
  "schedule": "0 55 1 * * ?",
  "name": "<everyday-{now/d}>",
  "repository": "my_repo",
  "config": {
    "indices": ["*"]
  },
  "retention" {
    "expire_after" "7d",
    "min_count": 5
    "max_count": 25
}

Также вы можете создать SLM используя GUI в Kibana в меню Stack Management.

Восстановление Shapshot

Ну и конечно куда же без восстановления. Для этого используется _restore.

PUT _snapshot/my_repo/my_snapshot_2021_06_19_02/_restore

Есть возможность восстановить только определённый index:

PUT _snapshot/my_repo/my_snapshot_2021_06_19_02/_restore 
{
  "indices": "my-index-*",
  "include_global_state": false
}

Если вам нужно восстановить в новый index:

PUT _snapshot/my_repo/my_snapshot_2021_06_19_02/_restore 
{
  "indices": "my-index-*",
  "include_global_state": false,
  "rename_pattern": "my-index-(.+)",
  "rename_replacement": "restored-my-index-$1"
}

Для того чтобы восстановить Shapshot в другом кластере просто зарегистрируйте тот же репозиторий в новом кластере и делайте восстановление.