Actualizar sin parar el servicio

TeselaDB

TeselaDB

Equipo de TeselaDB

40 minIntermedio

Cambia el binario de un clúster de tres nodos uno a uno mientras una carga de prueba escribe sin fallos.

Un clúster de tres nodos sigue sirviendo con uno parado, porque cada rango conserva la mayoría de sus réplicas. Esa es la base de una actualización sin parada: cambias el binario de un nodo, esperas a que vuelva y pasas al siguiente.

Lo que vas a construir

Un clúster de tres nodos actualizado a una versión nueva, nodo a nodo, con una carga de prueba que escribe un documento por segundo durante toda la actualización y cuenta las escrituras que fallan.

Requisitos

  • Un clúster de tres nodos como servicio de systemd (Tres máquinas con systemd).
  • El binario de la versión nueva en cada máquina y las notas de esa versión leídas.
  • mongosh con un usuario con readWrite sobre una base de prueba.

1. Arranca la carga de prueba

En otra terminal, con mongosh sobre los tres nodos, escribe un documento por segundo durante diez minutos:

JavaScript
let fallos = 0;
for (let i = 0; i < 600; i++) {
  try {
    db.carga.insertOne({ i, at: new Date() });
  } catch (error) {
    fallos += 1;
  }
  sleep(1000);
}
print(`escrituras fallidas: ${fallos}`);

2. Actualiza un nodo cada vez

Ejecuta las órdenes de abajo primero en node-03, después en node-02 y por último en node-01, para que solo haya un nodo parado cada vez mientras los otros dos conservan la mayoría de las réplicas de cada rango:

Shell
sudo systemctl stop teseladb
sudo install -m 0755 ./teseladb /usr/local/bin/teseladb
sudo systemctl start teseladb
teseladb admin --dbpath /var/lib/teseladb nodes

No pases al siguiente hasta que nodes liste el nodo actualizado como activo. No drenes los nodos, porque el drenado sirve para retirarlos del clúster.

3. Activa la versión de MongoDB nueva, si la hay

Si las notas de la versión dicen que anuncia una versión de MongoDB más reciente, súbela cuando los tres nodos tengan el binario nuevo, como explica Actualizar entre versiones.

Probarlo

Cuando acaba la carga, escribe cuántas escrituras fallaron. Los drivers reintentan una vez las escrituras que pillan un cambio de líder, así que lo normal es que dé cero:

escrituras fallidas: 0

Limpiar

JavaScript
db.carga.drop();

Ejecútala en mongosh cuando la carga haya escrito su resultado, para borrar la colección carga que llenó la prueba.

Siguientes pasos