Reindizierung bestehender Daten

Die Reindizierung von Daten steht, gerade in der Planungsphase, an der Tagesordnung.
So kann es z.B. vorkommen, dass man bei der Aufteilung der Daten das Volumen noch nicht genau abschätzen kann, und vor dem Problem steht, dass man die täglichen Indexe zu einem monatlichen Index zusammenführen muss.
Beschrieben werden soll das am Beispiel eines Index dhcp. Die Aufgabe besteht darin, die jeden Tag erzeugten Indizes zu einem monatlichen Index zu kombinieren.

Schritt 1: Anlegen des neuen Index

Der neue Index soll über die drei Datanodes verteilt werden und es soll pro Shard ein Replikat erzeugt werden: 
PUT dhcp-2018.07 {
  "settings" : {
    "number_of_shards" : 3,
    "number_of_replicas" : 1
  }
}

Schritt 2: Reindizierung starten

Nachdem der neue monatliche Index nun besteht, kann auch schon die Reindizierung gestartet werden.
Hierbei sollen alle Indexe aus dem Juli 2018, also dhcp-2018.07.01, dhcp-2018.07.02, ..., dhcp-2018.07.31, zu dem im Schritt 1 neu erzeugten Index dhcp-2018.07 zusammengefasst werden.
Die Quelle ist damit das Pattern dhcp-2018.07.*, und das Ziel dhcp-2018.07.
POST _reindex {
  "source": {
    "index": "dhcp-2018.07.*"
  },
  "dest": {
    "index": "dhcp-2018.07"
  }
}

Nach Absetzen des Kommandos wird die Reindizierung im Hintergrund als Task ausgeführt.
Dies ist die einfachste Form des Kommandos. Es gibt noch weitere Parameter, die z.B. Throttling betreffen. Diese sind in der Dokumentation ausführlich erklärt.

Kontrolle des Fortschritts

Den Status des nun laufenden Tasks kann man ebenfalls über die API von Elasticsearch kontrollieren.
Hierzu wird das Kommando

GET _tasks?detailed=true&actions=*reindex

ausgeführt.
Es erscheint eine Ausgabe ähnlich der folgenden:

{
  "nodes": {
    "-7am_C5FTdKuioES0992Pw": {
      "name": "esdata-n1",
      "transport_address": "10.1.5.2:9300",
      "host": "esdata-n1.rs.de",
      "ip": "10.1.5.2:9300",
      "roles": [
        "master",
        "data",
        "ingest"
      ],
      "attributes": {
        "ml.machine_memory": "3860013056",
        "xpack.installed": "true",
        "ml.max_open_jobs": "20",
        "ml.enabled": "true"
      },
      "tasks": {
        "-7am_C5FTdKuioES0992Pw:23560053": {
          "node": "-7am_C5FTdKuioES0992Pw",
          "id": 23560053,
          "type": "transport",
          "action": "indices:data/write/reindex",
          "status": {
            "total": 899455,
            "updated": 0,
            "created": 407000,
            "deleted": 0,
            "batches": 408,
            "version_conflicts": 0,
            "noops": 0,
            "retries": {
              "bulk": 0,
              "search": 0
            },
            "throttled_millis": 0,
            "requests_per_second": -1,
            "throttled_until_millis": 0
          },
          "description": "reindex from [dhcp-2018.07.*] to [dhcp-2018.07]",
          "start_time_in_millis": 1534931386819,
          "running_time_in_nanos": 289336230371,
          "cancellable": true,
          "headers": {}
        }
      }
    }
  }
}


Der Wert "total" enthält hierbei die Gesamtzahl der neu zu indizierenden Dokumente. Die Werte "created", "deleted", "updated" geben an, wie viele bereits neu erzeugt, bestehende gelöscht, oder auch aktualisiert wurde. Hiermit kann man sich einen Eindruck über den Fortschritt verschaffen.
Die Startzeit "start_time_in_millis" ist die Anzahl der Millisekunden, die seit dem 01.01.1970 vergangen ist; lässt man die lezten drei Stellen weg ist sie damit ein Unix Timestamp.

Der Task läuft. wie oben bereits geschrieben, im Hintergrund. Ist die Reindizierung abgeschlossen, wird bei der Abfrage des Status, bzw. der laufenden Reindex- Tasks, wenig bis nichts zurück gegeben. Die "alten" Indexe können nun gelöscht werden.