Mapping ohne Downtime ändern (Reindex + atomarer Alias-Wechsel)
ElasticsearchIndex-LebenszyklusBefehl
# 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 } }
]
}Was es tut
Legt einen Index mit dem neuen Mapping an, kopiert die Daten im Hintergrund per Reindex, vergleicht die Dokumentanzahlen und stellt den von der Anwendung genutzten Alias in einer atomaren Operation auf den neuen Index um.
Wann einsetzen
Wenn sich der Typ eines bestehenden Felds ändern muss (text -> keyword, integer -> long), ein Analyzer geändert oder die Shard-Anzahl neu festgelegt werden muss; das ist am bestehenden Index nicht direkt möglich.
Vorsicht
Die Anwendung muss sich mit dem Alias verbinden, nicht mit dem Indexnamen; sonst erfordert der Wechsel ein Deployment. Neue Schreibvorgänge in die Quelle während des Reindex erreichen das Ziel nicht: Schreibzugriffe stoppen oder den Reindex kurz vor dem Wechsel mit op_type create + conflicts proceed erneut ausführen, um die Lücke zu schließen (Updates und Deletes werden so nicht übertragen). Reindex erzeugt Leselast auf der Quelle und Schreiblast auf dem Ziel; mit requests_per_second drosseln.