Tres máquinas con systemd

45 minIntermedio

Tres máquinas Linux bastan para un clúster de tres nodos como servicio de systemd; al final compruebas que aguanta un reinicio.

Un clúster de producción de TeselaDB son tres o más máquinas con el mismo binario, y aquí lo montas en tres máquinas Linux, cada nodo como servicio de systemd. Al final reinicias una de ellas para ver que el clúster sigue sirviendo.

Lo que vas a construir

Tres nodos, node-01, node-02 y node-03, unidos con tokens de alta y arrancados por systemd en cada arranque de su máquina, con tus aplicaciones conectadas a los tres con TLS y el usuario que crees.

Requisitos

  • Tres máquinas Linux con el binario en /usr/local/bin/teseladb (Instalar en Linux) y los relojes sincronizados con NTP.
  • El puerto 27100 abierto entre las tres máquinas, el 27017 hacia tus aplicaciones y el 27200 hacia tu equipo de operación.

1. El servicio en las tres máquinas

Crea /etc/systemd/system/teseladb.service en cada máquina. La unidad arranca el nodo cuando la red está lista y lo vuelve a arrancar si falla:

[Unit]
Description=TeselaDB
After=network-online.target

[Service]
ExecStart=/usr/local/bin/teseladb start --dbpath /var/lib/teseladb --bind_ip 0.0.0.0,%H --peer-listen 0.0.0.0:27100 --admin-listen 0.0.0.0:27200
Restart=on-failure

[Install]
WantedBy=multi-user.target

2. Arranca el primer nodo

En node-01, el primer arranque crea la CA del clúster y el usuario root:

Shell
sudo systemctl enable --now teseladb

3. Une los otros dos

En node-01, crea un token de un solo uso para cada uno de los otros dos nodos. Cada token caduca a la hora, como fija --ttl 1h, así que créalos justo antes de unir node-02 y node-03 al clúster en marcha:

Shell
sudo teseladb admin --dbpath /var/lib/teseladb token create --ttl 1h

En node-02 y en node-03, el primer arranque lleva --join y el token. Después para ese proceso. Deja el nodo al servicio, que ya no necesita el token:

Shell
sudo teseladb start --dbpath /var/lib/teseladb --bind_ip 0.0.0.0,$(hostname) --peer-listen 0.0.0.0:27100 \
  --admin-listen 0.0.0.0:27200 --join node-01:27100 --enroll-token <token>
sudo systemctl enable --now teseladb

4. Conecta tus aplicaciones

Copia la CA del clúster, /var/lib/teseladb/pki/ca.pem, a las máquinas de tus aplicaciones y crea para cada una un usuario con los roles que necesita (Usuarios y roles). La cadena lleva los tres nodos y authSource=admin, porque los usuarios viven en la base admin y el driver tiene que autenticarse allí aunque la aplicación trabaje en tienda:

mongodb://tienda-api:<contraseña>@node-01:27017,node-02:27017,node-03:27017/tienda?tls=true&tlsCAFile=./ca.pem&authSource=admin

Para conectarte tú como root, desde node-01, saca su contraseña y la CA del directorio de datos y pasa los tres nodos en la cadena, con authSource=admin porque los usuarios viven en la base admin:

Shell
ROOT_PASSWORD=$(sudo sed -n 's/^password=//p' /var/lib/teseladb/root-credentials.txt)
sudo cat /var/lib/teseladb/pki/ca.pem > ca.pem
mongosh "mongodb://root:$ROOT_PASSWORD@node-01:27017,node-02:27017,node-03:27017/?tls=true&tlsCAFile=./ca.pem&authSource=admin"

Probarlo

sudo teseladb admin --dbpath /var/lib/teseladb nodes lista los tres nodos como activos. Reinicia node-03 con sudo reboot mientras tu aplicación escribe: los rangos que lideraba eligen un líder nuevo en los otros dos nodos y el driver reintenta la operación que estaba en curso. Cuando la máquina vuelve, systemd arranca el nodo y se pone al día solo.

Limpiar

Si era una prueba, para el servicio y borra los datos en cada máquina, con la CA y las claves del clúster:

Shell
sudo systemctl disable --now teseladb
sudo rm -r /var/lib/teseladb

Siguientes pasos