Wartung einer Node eines Elasticsearch Clusters

Beim Einspielen von Sicherheitspatches oder anderen kurzen Wartungstasks kann es notwendig sein, die Nodes eines Clusters nacheinander neu zu starten. Man sprich hier von einem Rolling Restart.
Grundsätzlich stellt das kein Problem dar. Sind jedoch viele Daten im Cluster, so kommt es nach dem Restart zu einer hohen Last, da das System ein Rebalancing _aller_ Daten durchführt.
Bei einer nur kurzen Downtime einzelner Nodes bietet es sich an das Rebalancing zu unterbinden. Das Vorgehen dabei ist wie folgt:

Anhalten der Indizierung und Durchführen eines synced flushs

Wenn möglich sollte man das Indizieren neuer Daten beenden und einen synced flush durchführen. Da das Beenden der Indizierung neuer Daten z.B. durch Stoppen von Logstash oder Logbeat meist nicht möglich ist, sollte man zumindest durch

POST /_flush/synced

den synced flush so oft wiedeholen bis keine Fehlermeldungen mehr auftauchen. Wie lange das dauert hängt davon ab ob und wie viele Daten noch in der Indizierungspipeline vorhanden sind.

Die Zuweisung neuer Shards verhindern

Durch das Kommando


PUT _cluster/settings
{
"transient" : {
"cluster.routing.allocation.enable" : "none"
}
}

wird Elasticsearch angewiesen keine neuen Shards zuzuweisen. Bei kurzen Wartungen ist das von Vorteil.

Anhalten von Elasticsearch auf der zu wartenden Node

Durch das Beenden von Elasticsearch wird die Node aus dem Clusterverbund entfernt.

Durchführen der Wartung

Das System ist nun ein normales Linuxsystem, auf dem Wartungen, wie z.B. das Einspielen von Patches mittels apt, wie üblich durchgeführt werden können. Vor einem eventuell notwendigen Neustart ist es elementar zu prüfen ob Elasticsearch automatisch beim Systemstart gestartet wird. Dies kann, sofern ein weiterer Neustart auf Grund von Updates notwendig ist, unerwünscht sein, da die Node sich dann ungewollt wieder in den Cluster integriert.

Neustart der Node

Nach dem Neustart der Node und des Elasticsearch Services muss sichergestellt werden, dass diese sich auch wieder sauber in den Cluster integriert.

GET _cluster/health

zeigt den Clusterstatus an. In der Zeile "number_of_nodes" sollte, sofern die Node sauber integriert ist, die Gesamtzahl von Nodes im Elasticsearch Cluster erscheinen.

Die Zuweisung neuer Shards einschalten

Damit der Cluster wieder neue Shards zuweist muss das Kommando

PUT _cluster/settings
{
"transient" : {
"cluster.routing.allocation.enable" : "all"
}
}

abgesetzt werden. Sofort danach erfolgt automatisch das Rebalancing des Clusters, das dann abgeschlossen ist, wenn der Status des Clusters wieder grün ist.
Geprüft werden kann der Status mit

GET _cluster/health

In der Zeile "status" findet sich, ist der Elasticsearch Cluster wieder voll funktionsfähig, der String "green".

Weitere Nodes des Elasticsearch Clusters

Selbstverständlich müssen alle Schritte von "Die Zuweisung neuer Shards verhindern" bis zu "Die Zuweisung neuer Shards einschalten" für jede einzelne Node des Clusters durchgeführt werden. 
Sind alle Wartungen beendet und ist der Status des Clusters wieder grün, kann man das Indexing, sofern es gestoppt wurde, wieder aktivieren.