Настройка снапшотирования кластера Smart Monitor
Снапшоты используются для резервного копирования индексов и восстановления данных в случае сбоев.
Информация
Условные обозначения:
OS_HOME- домашняя директория Smart Monitor Data Storage, обычно это/app/opensearch/OS_IP- IP-адрес одного из серверов кластера OpenSearchBACKUP_DIR- директория для хранения снапшотовREPO_NAME- именование репозитория снапшотовSNAPSHOT_POLICY_NAME- именование политики снапшотированияSNAPSHOT_NAME- имя снапшотаHADOOP_HOME- домашняя директория Apache HadoopHADOOP_DATA- директория хранения данных HadoopHADOOP_HOST- адрес узла HDFSHADOOP_USER- пользователь Hadoop
Подготовка узлов кластера
Подготовка должна производиться на всех узлах с ролью data.
Для кластеров состоящих из нескольких узлов рекомендуется отключать аллокацию перед подготовкой узлов через консоль разработчика (Навигационное меню - Параметры системы - Консоль разработчика) выполнив команду:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "none"
}
}
Сделать тоже самое можно из терминала следующей командой:
curl -XPUT -k -u admin "https://$OS_IP:9200/_cluster/settings?pretty" -H "Content-Type: application/json" -d '{"persistent":{"cluster.routing.allocation.enable": "none"}}'
После завершения подготовки всех узлов кластера включите аллокацию:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "all"
}
}
Сделать тоже самое можно из терминала следующей командой:
curl -XPUT -k -u admin "https://$OS_IP:9200/_cluster/settings?pretty" -H "Content-Type: application/json" -d '{"persistent":{"cluster.routing.allocation.enable": "all"}}'
Тип хранилища FS
Перед настройкой снапшотирования необходимо создать директорию, в которую Smart Monitor будет сохранять резервные копии. Для этого следует открыть терминал под пользователем root для выполнения команд. Необходимо создать директорию и настроить ее права:
- Создайте каталог для хранения снапшотов и выдайте права на чтение и запись пользователю
opensearch:
mkdir -p $BACKUP_DIR
chown -R opensearch:opensearch $BACKUP_DIR
- Настройте конфигурацию узла
$OS_HOME/opensearch.ymlлюбым удобным редактором добавив параметрpath.repoс путем до созданной директории:
path.repo: ["{BACKUP_DIR}"]
Не рекомендуется размещать path.repo на том же диске, где хранятся данные узла.
Указанный путь должен быть одинаковым на всех узлах, участвующих в создании снапшотов. Если хотя бы один узел не имеет доступа — операция сохранения может завершиться с ошибкой.
- Перезапустите узел, чтобы изменения вступили в силу:
systemctl restart opensearch
Тип хранилища HDFS
Для использования кластера HDFS в качестве репозитория снапшотов, необходимо установить плагин repository-hdfs в opensearch и перезагрузить сервис:
$OS_HOME/bin/opensearch-plugin install repository-hdfs
systemctl restart opensearch
Разверните на узле, выбранном в качестве хранилища Apache Hadoop:
- Скачать архив Apache Hadoop с помощью команды
wget:
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.4.2/hadoop-3.4.2.tar.gz
- Создать папку
$HADOOP_HOMEи$HADOOP_DATA, распаковать архив и выдать права пользователю$HADOOP_USER:
mkdir -p $HADOOP_HOME
mkdir -p $HADOOP_DATA
tar -xzf hadoop-3.4.2.tar.gz -C $HADOOP_HOME --strip-components 1
chown -R $HADOOP_USER:$HADOOP_USER $HADOOP_HOME
chown -R $HADOOP_USER:$HADOOP_USER $HADOOP_DATA
- Для компиляции Hadoop Apache рекомендуется использовать java 8
Установить openjdk-8-jdk:
apt update
apt install openjdk-8-jdk
Настройка HDFS
Все последующие операции необходимо выполнять из под УЗ $HADOOP_USER.
- Настроить файл среды
$HADOOP_HOME/etc/hadoop/hadoop-env.shлюбым удобным редактором, раскомментировав строку# export JAVA_HOME=и добавив путь до java 8
export JAVA_HOME={JAVA_HOME}
- Отредактировать файл
$HADOOP_HOME/etc/hadoop/core-site.xml, добавив следующую настройку:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://<HADOOP_HOST>:<PORT></value>
</property>
</configuration>
Порт необходимо задать либо 9000, либо 8020. С другими портами работа Hadoop не гарантирована.
- Далее открыть файл
$HADOOP_HOME/etc/hadoop/core-site.xmlи добавить в него пути для хранения данных:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>{HADOOP_DATA}/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>{HADOOP_DATA}/datanode</value>
</property>
</configuration>
- Для работы hadoop необходима возможность ssh подключения к localhost без ключа доступа. Проверьте подключение следующей командой:
ssh localhost
Если при подключении запрашивается пароль, используйте следующие команды:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
- Отформатируйте хранилище перед началом работы:
$HADOOP_HOME/bin/hdfs namenode -format
- Настройте переменные для
$HADOOP_USERв файле/etc/profile.d/hadoop.sh:
export HADOOP_HOME={HADOOP_HOME}
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HDFS_NAMENODE_USER=$HADOOP_USER
export HDFS_DATANODE_USER=$HADOOP_USER
export HDFS_SECONDARYNAMENODE_USER=$HADOOP_USER
- Запустите DFS файлом
start-dfs.sh:
$HADOOP_HOME/sbin/start-dfs.sh
Проверить запуск можно командой jps. Если в выводе присутствуют NameNode, DataNode и SecondaryNameNode - запуск выполнен успешно. Менеджер доступен по адресу http://<HADOOP_HOST>:9870, файловую систему можно просмотреть по пути Utilities->Browse the file system.
- Настройте папку для хранения снапшотов в HDFS (путь
/{REPO_NAME}/{CLUSTER_NAME}выбран в качестве примера) и выдайте права доступа дляopensearch:
hdfs dfs -mkdir -p /{REPO_NAME}/{CLUSTER_NAME}
hdfs dfs -chown -R opensearch:supergroup /{REPO_NAME}
Подготовка репозитория снапшотов
Необходимо создать репозиторий снапшотов с указанием необходимых параметров. Поддерживаются FS, S3, HDFS и прочие типы хранилищ.
Репозиторий FS
PUT /_snapshot/{REPO_NAME}
{
"type": "fs",
"settings": {
"location": "{BACKUP_DIR}"
}
}
Таблица всех параметров FS репозитория снапшотов:
| Параметр | Назначение |
|---|---|
location | Директория для хранения снапшотов. |
chunk_size | Разбивает большие файлы на фрагменты при создании снапшотов (64 МБ, 1 ГБ и др.). По умолчанию - 1gb. Необязательный параметр. |
compress | Boolean Следует ли сжимать файлы метаданных. По умолчанию - false. Необязательный параметр. |
max_restore_bytes_per_sec | Максимальная скорость восстановления снапшотов. По умолчанию - 40 МБ/с. Необязательный параметр. |
max_snapshot_bytes_per_sec | Максимальная скорость создания снапшотов. По умолчанию - 40 МБ/с. Необязательный параметр. |
remote_store_index_shallow_copy | Boolean. Определяет, будут ли снапшоты индексов записываться как поверхностная копия. По умолчанию - false. Необязательный параметр. |
shallow_snapshot_v2 | Boolean. Определяет, будут ли снапшоты индексов записываться как поверхностная копия 2ой версии. По умолчанию - false. Необязательный параметр. |
readonly | Boolean. Доступен ли репозиторий только для чтения. По умолчанию - false. Необязательный параметр. |
Репозиторий HDFS
PUT _snapshot/{REPO_NAME}
{
"type": "hdfs",
"settings": {
"uri": "hdfs://<HADOOP_HOST>:<PORT>/",
"path": "/{REPO_NAME}/{CLUSTER_NAME}"
}
}
Таблица параметров HDFS репозитория снапшотов:
| Параметр | Назначение |
|---|---|
uri | Директория для хранения снапшотов. Обязательный параметр |
path | Путь в файловой системе HDFS, где будут храниться снимки. Обязательный параметр |
load_defaults | Загружать ли конфигурации Hadoop по умолчанию из classpath. По умолчанию - true Необязательный параметр |
conf.<key> | Позволяет передавать любые специфические настройки Hadoop. Полный список находится в core и hdfs списках параметров. Необязательный параметр |
compress | Сжимать файлы метаданных. По умолчанию - true. Необязательный параметр |
readonly | Сделать репозиторий доступным только для чтения. Необязательный параметр |
Использование HDFS в качестве хранилища снапшотов позволяет использовать любые снапшоты в качестве точки восстановления для любого кластера. Для этого необходимо добавить репозиторий с любым названием, отличным от $REPO_NAME, с параметром readonly во избежание случайной записи:
PUT _snapshot/{SEARCHABLE_REPO_NAME}
{
"type": "hdfs",
"settings": {
"uri": "hdfs://<HADOOP_HOST>:<PORT>/",
"path": "/{REPO_NAME}/{SEARCHABLE_CLUSTER_NAME}",
"readonly": true
}
}
Настройка автоматического снапшотирования
Для автоматизации сохранения снапшотов кластера необходимо создать политику снапшотирования через консоль разработчика (Навигационное меню - Параметры системы - Консоль разработчика) выполнив команду с необходимыми параметрами:
POST _plugins/_sm/policies/{SNAPSHOT_POLICY_NAME}
{
"name": "snapshot-daily-{{date}}",
"description": "Daily snapshot policy",
"creation": {
"schedule": {
"cron": {
"expression": "0 8 * * *",
"timezone": "UTC"
}
},
"time_limit": "1h"
},
"deletion": {
"schedule": {
"cron": {
"expression": "0 8 * * *",
"timezone": "UTC"
}
},
"condition": {
"max_age": "7d",
"max_count": 50,
"min_count": 30
},
"time_limit": "1h"
},
"snapshot_config": {
"date_format": "yyyy-MM-dd-HH:mm",
"timezone": "UTC",
"indices": [".*"],
"repository": "{REPO_NAME}",
"ignore_unavailable": "true",
"include_global_state": "false",
"partial": "true",
"metadata": {
"any_key": "any_value"
}
}
}
Таблица параметров политики снапшотирования:
| Параметр | Тип | Описание |
|---|---|---|
description | String | Описание политики снапшотирования. Необязательный параметр. |
enabled | Boolean | Должна ли политика быть включена при создании? Необязательный параметр. |
snapshot_config | Object | Настройки создания политики. Обязательный параметр. |
snapshot_config.date_format | String | Имена снапшотов имеют формат {SNAPSHOT_POLICY_NAME}-<дата>-<случайное число>. date_format Определяет формат даты в именах снапшотов. Необязательный параметр. По умолчанию - yyyy-MM-dd’T’HH:mm:ss. |
snapshot_config.date_format_timezone | String | Имена снапшотов имеют формат {SNAPSHOT_POLICY_NAME}-<дата>-<случайное число>. date_format_timezone определяет часовой пояс для даты в именах снапшотов. Необязательный параметр. По умолчанию - UTC. |
snapshot_config.indices | String | Шаблон сохраняемых в снапшотах индексов. По умолчанию - * (все индексы). |
snapshot_config.repository | String | Репозиторий, в который будут сохраняться снапшоты. Обязательный параметр. |
snapshot_config.ignore_unavailable | Boolean | Определяет нужно ли игнорировать недоступные индексы. Необязательный параметр. По умолчанию - false. |
snapshot_config.include_global_state | Boolean | Определяет нужно ли включать состояние кластера в снапшот. Необязательный параметр. По умолчанию - true. |
snapshot_config.partial | Boolean | Определяет возможность создания неполного снапшота. Необязательный параметр. По умолчанию - false. |
snapshot_config.metadata | Object | Метадата в формате пар ключ/значение. Необязательный параметр. |
creation | Object | Настройки создания снапшотов. Обязательный параметр. |
creation.schedule | String | Расписание создания снапшотов в формате cron. Обязательный параметр. |
creation.time_limit | String | Определяет максимальное время ожидания завершения создания снапшота. Если time_limit дольше интервала расписания создания, то снапшот по не не будет создан до тех пор, пока time_limit не закончится. Необязательный параметр. |
deletion | Object | Настройки удаления снапшотов. Необязательный параметр. По умолчанию хранит все снапшоты. |
deletion.schedule | String | Расписание удаления снапшотов в формате cron. Необязательный параметр. По умолчанию использует настройки параметра creation.schedule. |
deletion.time_limit | String | Определяет максимальное время ожидания окончания удаления снапшота. Необязательный параметр. |
deletion.delete_condition | Object | Условия удаления снапшота. Необязательный параметр. |
deletion.delete_condition.max_count | Integer | Максимальное количество хранимых снапшотов. Необязательный параметр. |
deletion.delete_condition.max_age | String | Максимальное время, которое хранятся снапшоты. Необязательный параметр. |
deletion.delete_condition.min_count | Integer | Минимальное количество хранимых снапшотов. Необязательный параметр. По умолчанию - 1. |
notification | Object | Содержит настройки уведомлений по событиям политики снапшотирования (для использования требуется настроенный канал уведомлений OpenSearch). Необязательный параметр. |
notification.channel | Object | Определяет канал для уведомлений. Обязательный параметр. |
notification.channel.id | String | ID канала уведомлений. Обязательный параметр. |
notification.conditions | Object | События политики снапшотирования, по которым необходимы уведомления - для этого необходимо установить значение true. |
notification.conditions.creation | Boolean | Определяет необходимость создания уведомлений о создании снапшота. Необязательный параметр. По умолчанию - true. |
notification.conditions.deletion | Boolean | Определяет необходимость создания уведомлений об удалении снапшота. Необязательный параметр. По умолчанию - false. |
notification.conditions.failure | Boolean | Определяет необходимость создания уведомлений об ошибке создания или удаления снапшота. Необязательный параметр. По умолчанию - false. |
notification.conditions.time_limit_exceeded | Boolean | Определяет необходимость создания уведомлений о факте превышения time_limit у операций, связанных со снапшотами. Необязательный параметр. По умолчанию - false. |
Снапшоты инкрементальные — уже сохраненные сегменты повторно не сохраняются.
Создание снапшота вручную
Для разового создания снапшота выполните команду через консоль разработчика:
PUT _snapshot/{REPO_NAME}/{SNAPSHOT_NAME}
{
"indices": "*",
"ignore_unavailable": true,
"include_global_state": false
}
Восстановление из снапшота
Если планируется восстановление данных на целевом кластере из снапшота другого кластера, необходимо убедиться, что версии OpenSearch на кластерах совпадают.
- Просмотрите доступные снапшоты через консоль разработчика командой:
GET _snapshot/{REPO_NAME}/_all
В результате выполнения команды выведется список всех созданных снапшотов в следующем формате, где поле snapshot - имя снапшота (SNAPSHOT_NAME):
{
"snapshots": [
{
"snapshot": "daily-snapshot-sm-policy-2025-04-21-14:30-bu2lfnek",
"uuid": "iqHGMwR5T6yV-tInX3a5KQ",
"version_id": 136397827,
"version": "2.18.0",
"remote_store_index_shallow_copy": false,
"indices": [
"index1",
"index2"
],
"data_streams": [],
"include_global_state": true,
"metadata": {
"sm_policy": "daily-snapshot-sm-policy"
},
"state": "SUCCESS",
"start_time": "2025-04-21T14:30:02.327Z",
"start_time_in_millis": 1745245802327,
"end_time": "2025-04-21T14:31:09.966Z",
"end_time_in_millis": 1745245869966,
"duration_in_millis": 67639,
"failures": [],
"shards": {
"total": 2,
"failed": 0,
"successful": 2
}
}
]
}
- Восстановите нужный снапшот через консоль разработчика командой:
POST _snapshot/{REPO_NAME}/{SNAPSHOT_NAME}/_restore
Удаление снапшота
- Просмотрите доступные снапшоты через консоль разработчика командой:
GET _snapshot/{REPO_NAME}/_all
В результате выполнения команды выведется список всех созданных снапшотов в формате, указанном в пункте Восстановление из снапшота.
- Удалите нужный снапшот через консоль разработчика командой:
DELETE _snapshot/{REPO_NAME}/{SNAPSHOT_NAME}