DBAtlas · Atlas d'exploitation des bases de données

Modifier un mapping sans interruption (reindex + bascule atomique de l'alias)

ElasticsearchCycle de vie des index

Commande

# 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 } }
  ]
}

Ce que fait la commande

Crée un index avec le nouveau mapping, copie les données en arrière-plan avec reindex, compare le nombre de documents, et bascule l'alias utilisé par l'application vers le nouvel index en une seule opération atomique.

Quand l'utiliser

Quand le type d'un champ existant doit changer (text -> keyword, integer -> long), qu'un analyzer doit changer ou que le nombre de shards doit être redéfini ; ces opérations ne peuvent pas se faire sur place sur l'index existant.

Attention

L'application doit se connecter à l'alias, pas au nom de l'index ; sinon la bascule nécessite un déploiement. Les nouvelles écritures sur la source pendant le reindex n'atteignent pas la cible : arrêtez les écritures, ou relancez le reindex avec op_type create + conflicts proceed juste avant la bascule pour combler l'écart (les mises à jour et suppressions ne sont pas reportées de cette façon). Le reindex génère une charge de lecture sur la source et d'écriture sur la cible ; limitez-le avec requests_per_second.

Ouvrir dans DBAtlas →

Voir aussi