Un clúster de tres nodos con Docker Compose

Arranca tres nodos de TeselaDB en contenedores, únelos con tokens de alta y conéctate.

Esta guía monta un clúster de tres nodos en una sola máquina con Docker Compose. Sirve para probar el reparto de rangos y qué pasa cuando cae un nodo; en producción, cada nodo va en su propia máquina.

1. El fichero de Compose

Guarda esto como compose.yaml. Los nodos 2 y 3 están en el perfil join porque necesitan un token que crea el primero.

YAML
services:
  node1:
    image: teseladb/teseladb:<version>
    command: start --dbpath /data --bind_ip 0.0.0.0 --peer-listen 0.0.0.0:27100 --admin-listen 0.0.0.0:27200
    ports: ["27017:27017"]
    volumes: ["node1:/data"]
  node2:
    image: teseladb/teseladb:<version>
    command: >
      start --dbpath /data --bind_ip 0.0.0.0 --peer-listen 0.0.0.0:27100 --admin-listen 0.0.0.0:27200
      --join node1:27100 --enroll-token ${TOKEN_NODE2}
    volumes: ["node2:/data"]
    profiles: ["join"]
  node3:
    image: teseladb/teseladb:<version>
    command: >
      start --dbpath /data --bind_ip 0.0.0.0 --peer-listen 0.0.0.0:27100 --admin-listen 0.0.0.0:27200
      --join node1:27100 --enroll-token ${TOKEN_NODE3}
    volumes: ["node3:/data"]
    profiles: ["join"]
volumes:
  node1:
  node2:
  node3:

2. Arranca el primer nodo

Shell
docker compose up -d node1

El primer arranque crea la CA y el usuario root en el volumen del nodo.

3. Crea un token por nodo

Cada token es de un solo uso:

Shell
export TOKEN_NODE2=$(docker compose exec node1 teseladb admin --dbpath /data token create --ttl 1h)
export TOKEN_NODE3=$(docker compose exec node1 teseladb admin --dbpath /data token create --ttl 1h)

4. Une los otros dos

Shell
docker compose --profile join up -d node2 node3
docker compose exec node1 teseladb admin --dbpath /data nodes

5. Conéctate

Shell
docker compose cp node1:/data/pki/ca.pem ./ca.pem
docker compose exec node1 cat /data/root-credentials.txt
mongosh "mongodb://root:<contraseña>@127.0.0.1:27017/?tls=true&tlsCAFile=./ca.pem"

6. Prueba una caída

Inserta datos, para un nodo y comprueba que sigues leyendo y escribiendo:

Shell
docker compose stop node2
docker compose exec node1 teseladb admin --dbpath /data ranges

Los rangos que lideraba node2 tienen un líder nuevo. Al arrancarlo otra vez, se pone al día solo.