Es probable que en alguna ocasión necesitemos reemplazar uno de nuestros nodos de datos del cluster de Elasticsearch. Una opción (a lo loco, y nada recomendable) sería directamente eliminar el nodo, y añadir uno nuevo, el cual, en algún momento se sincronizará con el cluster. Obviamente lo malo de esta opción, es que el cluster quedará en status yellow o red mientras no termine la sincronización.
Una buena opción (probado en un ES 5.6.3) para hacer de este proceso, un proceso seguro y controlado, es como primer paso, quitar el nodo del cluster, esperar a que los shards (primarios y réplicas) se re-asignen, y una vez tengamos el nodo desacoplado del cluster, reemplazarlo. La idea es continuar con el cluster en «green» durante todo el proceso.
A continuación los pasos.
1- Primero confirmaremos el estado del cluster así como los nodos con que contamos, si no lo hemos hecho ya. En el ejemplo querremos reemplazar el nodo con IP 10.10.10.13.
$ curl http://elasticsearch.mydomain.com:9200/_cat/health?h=status
green
$ curl http://elasticsearch.mydomain.com:9200/_cat/nodes?v
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
10.10.10.2 75 94 0 0.00 0.00 0.00 di - whatever-2
10.10.10.3 84 87 0 0.00 0.00 0.00 di - whatever-3
10.10.10.4 67 50 0 0.00 0.03 0.00 m * whatever-4
10.10.10.5 84 98 0 0.00 0.00 0.00 di - whatever-5
10.10.10.6 84 36 0 0.01 0.02 0.00 - - whatever-6
10.10.10.7 49 41 0 0.00 0.00 0.00 - - whatever-7
10.10.10.8 27 49 0 0.00 0.00 0.00 m - whatever-8
10.10.10.9 34 87 0 0.16 0.09 0.03 di - whatever-9
10.10.10.10 63 37 0 0.00 0.00 0.00 - - whatever-10
10.10.10.11 82 80 1 0.00 0.01 0.00 di - whatever-11
10.10.10.12 57 49 0 0.00 0.00 0.00 m - whatever-12
10.10.10.13 58 86 0 0.00 0.00 0.00 di - whatever-13
2- En segundo lugar, redistribuiremos los shards asignados al nodo a reemplazar entre el resto de nodos del cluster. No podemos prever de antemano, cuanto tardará esta operación.
$ curl -XPUT http://elasticsearch.mydomain.com:9200/_cluster/settings -H 'Content-Type: application/json' -d '{
"transient" :{
"cluster.routing.allocation.exclude._ip" : "10.10.10.13"
}
}'
3- A partir de entonces, deberemos ir monitorizando el estado de nuestro cluster, y específicamente, del nodo que estamos quitando. Podemos usar varios comandos para ver el avance.
Podemos listar los shards del cluster y mostrar únicamente los referentes al nodo que estamos quitando, con el siguiente comando:
$ curl http://elasticsearch.mydomain.com:9200/_cat/shards | grep 10.10.10.13
Por otra parte, podemos ver el estado del cluster, centrándonos en los valores para «number_of_pending_tasks» así como para los «number_of_*nodes»:
$ curl http://elasticsearch.mydomain.com:9200/_cluster/health?pretty
4- Al finalizar el proceso, el nodo no tendrá shards asignados, y podremos pasar a eliminarlo/retirarlo.
5- Tras añadir un nuevo nodo al cluster, deberemos darle algunos minutos para que se inicie y se una al cluster. De nuevo, podremos lanzar algunos de los comandos que ya hemos venido usando, para verificar el estado de la sincronización del nuevo cluster.
Verificamos que el nuevo nodo aparezca en el cluster
$ curl http://elasticsearch.mydomain.com:9200/_cat/nodes?v
Monitorizamos los shards que se van asignando al nuevo nodo
$ curl http:// elasticsearch.mydomain.com:9200/_cat/shards?v | grep -i "IP-del-nuevo-nodo"
Confirmamos que el cluster continúa «green», y vemos cómo avanza el proceso mediante el «number_of_pending_tasks»
$ curl http://elasticsearch.mydomain.com:9200/_cluster/health?pretty
6- Cuando no haya más tareas pendientes, nuestro proceso habrá acabado, con suerte, sin downtimes y con el cluster siempre en «green».