Сегодня поговорим о том, как быстро перенести индекс Elasticsearch между кластерами без S3.
Недавно при переезде на новый кластер Elasticsearch понадобилось перенести только несколько индексов. Казалось бы, задача простая: перенести документы — и готово. Но индекс в Elasticsearch - это не только документы. Есть ещё mapping, settings, aliases и другие метаданные.
Самый правильный вариант - Snapshot/Restore
Для полноценного переноса Elasticsearch предоставляет механизм Snapshot/Restore. Snapshot можно хранить во внешнем repository, например в S3, а затем восстановить на другом кластере.
Документация:
Snapshot and Restore
S3 repository
Это хороший вариант, когда инфраструктура уже готова. Но что делать, если доступ к S3 нужно ещё получить, а индексы нужны буквально «вчера»?
Reindex — быстрый перенос документов
В Elasticsearch есть API
_reindex, который позволяет скопировать документы из одного индекса в другой. Он также поддерживает перенос из удалённого Elasticsearch-кластера.Простейший вариант:
POST /_reindex
{
"source": {
"index": "old-index"
},
"dest": {
"index": "new-index"
}
}
Документация: Reindex API
Но здесь есть важный нюанс.
_reindex переносит документы, но не переносит mapping и settings исходного индекса.Поэтому целевой индекс нужно подготовить до запуска reindex.
Сначала mapping, потом документы
Получить mapping исходного индекса можно так:
GET /old-index/_mapping
Документация: Get mapping
После этого создаём индекс на новом кластере с нужным mapping:
PUT /new-index
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"name": {
"type": "keyword"
},
"age": {
"type": "integer"
}
}
}
}
Это важно, потому что если создать пустой индекс без нужного mapping, Elasticsearch может применить dynamic mapping при первой индексации документов. В результате типы полей могут отличаться от исходного индекса.
При создании индекса можно сразу задать
settings, mappings и aliases: Create index API.И не забываем про aliases
Ещё одна частая ошибка — перенести документы и забыть про aliases.
Например, приложение работает с:
users
а на самом деле это alias, указывающий на:
users-2026-08
Получить aliases можно через:
GET /old-index/_alias
После переноса их необходимо создать на новом индексе.
Например:
PUT /new-index/_alias/users
Или использовать
_aliases, если нужно одновременно удалить alias со старого индекса и добавить его на новый:
POST /_aliases
{
"actions": [
{
"remove": {
"index": "old-index",
"alias": "users"
}
},
{
"add": {
"index": "new-index",
"alias": "users"
}
}
]
}
Это удобно при production-миграции: приложение продолжает обращаться к тому же alias, а мы просто переключаем его на новый индекс.
Документация: Aliases API
Можно автоматизировать
Если индексов много или не хочется писать всё вручную, можно использовать elasticsearch-dump.
Инструмент позволяет отдельно переносить
data, mapping, alias, settings, analyzer и другие сущности.elasticsearch-dump на GitHub
Например:
elasticdump \
--input=http://old-es:9200/my_index \
--output=http://new-es:9200/my_index \
--type=mapping
elasticdump \
--input=http://old-es:9200/my_index \
--output=http://new-es:9200/my_index \
--type=data
Это уже можно завернуть в обычный Bash-скрипт и автоматизировать миграцию.