DBAtlas · Атлас эксплуатации баз данных

Изменение маппинга без простоя (reindex + атомарное переключение псевдонима)

ElasticsearchЖизненный цикл индекса

Команда

# 1) Target index with the new mapping (refresh off and replicas 0 for loading):
PUT musteri-v2
{
  "settings": { "number_of_shards": 1, "number_of_replicas": 0, "refresh_interval": "-1" },
  "mappings": { "properties": { "kod": { "type": "keyword" }, "adet": { "type": "long" } } }
}
# 2) Reindex in the background (tracked with the returned task id):
POST _reindex?wait_for_completion=false&slices=auto
{
  "source": { "index": "musteri-v1", "size": 1000 },
  "dest": { "index": "musteri-v2", "op_type": "create" },
  "conflicts": "proceed"
}
GET _tasks/<task_id>
# 3) Restore settings and compare document counts:
PUT musteri-v2/_settings
{
  "index": { "refresh_interval": null, "number_of_replicas": 1 }
}
POST musteri-v2/_refresh
GET _cat/indices/musteri-v1,musteri-v2?v&h=index,docs.count,pri.store.size
# 4) Switch the alias to the new index in one atomic operation:
POST _aliases
{
  "actions": [
    { "remove": { "index": "musteri-v1", "alias": "musteri" } },
    { "add": { "index": "musteri-v2", "alias": "musteri", "is_write_index": true } }
  ]
}

Что делает

Создаёт индекс с новым маппингом, копирует данные в фоне через reindex, сравнивает число документов и одной атомарной операцией переключает используемый приложением псевдоним на новый индекс.

Когда использовать

Когда нужно изменить тип существующего поля (text -> keyword, integer -> long), анализатор или заново определить число шардов; на существующем индексе это сделать нельзя.

Внимание

Приложение должно подключаться к псевдониму, а не к имени индекса; иначе для переключения нужен деплой. Новые записи в источник во время reindex не попадают в цель: остановите запись или прямо перед переключением повторите reindex с op_type create + conflicts proceed, чтобы закрыть разрыв (обновления и удаления так не переносятся). Reindex создаёт нагрузку чтения на источник и записи на цель; ограничивайте через requests_per_second.

Открыть в DBAtlas →

Связанные материалы