Migrar desde MongoDB Atlas
40 minIntermedio

Pasar una base de Atlas a tu clúster de TeselaDB, con sus índices de búsqueda, acaba con un cambio en la cadena de conexión.
La migración desde Atlas usa las mismas herramientas que desde MongoDB: mongodump con la cadena mongodb+srv de Atlas
y mongorestore contra TeselaDB. Lo que mongodump no copia son los índices de búsqueda, así que los apuntas antes y
los creas otra vez al final.
Lo que vas a construir
La base tienda de Atlas copiada en tu clúster de TeselaDB con sus índices normales y sus índices de búsqueda, y al
final tu aplicación apuntando al clúster nuevo.
Requisitos
- Docker y
mongosh. - Las MongoDB Database Tools, con
mongodumpymongorestore. - Para migrar tu propio Atlas, un usuario con permiso de lectura sobre la base y la IP de tu máquina en la lista de acceso de Atlas.
Prepara el entorno
docker run -d --name teseladb -p 27017:27017 viuzi/teseladb:latest \
start --dbpath /data --bind_ip 0.0.0.0
until docker logs teseladb 2>&1 | grep -q '^ready'; do sleep 1; done
ROOT_PASSWORD=$(docker exec teseladb cat /data/root-credentials.txt | sed -n 's/^password=//p')
docker cp teseladb:/data/pki/ca.pem ./ca.pem
export TESELADB_URI="mongodb://root:$ROOT_PASSWORD@127.0.0.1:27017/?tls=true&tlsCAFile=./ca.pem&authSource=admin"
mongosh "$TESELADB_URI" --quiet --eval 'db.runCommand({ ping: 1 }).ok'
docker run -d --name atlas-origen -p 27018:27017 mongodb/mongodb-atlas-local:7.0.41
until mongosh "mongodb://127.0.0.1:27018/?directConnection=true" --quiet --eval 1 >/dev/null 2>&1; do sleep 2; done
mongosh "mongodb://127.0.0.1:27018/tienda?directConnection=true" --quiet --eval 'db.productos.insertMany([{ nombre: "silla roja", precio: 40 }, { nombre: "mesa de roble", precio: 120 }, { nombre: "silla plegable", precio: 25 }])'
until mongosh "mongodb://127.0.0.1:27018/tienda?directConnection=true" --quiet \
--eval 'db.productos.createSearchIndex("default", { mappings: { dynamic: true } })' >/dev/null 2>&1; do sleep 3; done
export ATLAS_URI="mongodb://127.0.0.1:27018/tienda?directConnection=true"El primer contenedor arranca TeselaDB en modo seguro y deja en TESELADB_URI una cadena como root, que tiene permiso
para restaurar. Los dos servidores corren en Docker. El segundo arranca la imagen local de Atlas en el puerto 27018 con tres productos y un índice de búsqueda. La última línea deja su cadena en ATLAS_URI. El servicio de búsqueda de esa imagen tarda unos segundos
más que la base en responder, por eso la creación del índice se repite hasta que funciona. Para migrar tu Atlas, pon en
ATLAS_URI su cadena mongodb+srv:// con tu usuario.
1. Apunta los índices de búsqueda
mongosh "$ATLAS_URI" --quiet --eval 'printjson(db.productos.getSearchIndexes().map((index) => ({ name: index.name, definition: index.latestDefinition })))'Guarda la definición de cada índice de búsqueda de cada colección, porque mongodump no los exporta. Con la base de
prueba, la orden escribe el índice default con mappings: { dynamic: true }.
2. Exporta desde Atlas
mongodump --uri "$ATLAS_URI" --gzip --archive=tienda.gz3. Importa en TeselaDB
mongorestore --uri "$TESELADB_URI" --gzip --archive=tienda.gzmongorestore crea los índices normales. Las funciones propias de Atlas que no son de MongoDB, como los triggers de
Atlas, no viajan en el archivo, porque mongodump solo lee lo que guarda la base y esas funciones viven en el servicio de Atlas que la rodea.
4. Crea otra vez los índices de búsqueda
mongosh "$TESELADB_URI" --quiet --eval 'db.getSiblingDB("tienda").productos.createSearchIndex("default", { mappings: { dynamic: true } })'Crea otra vez en TeselaDB cada índice de búsqueda con la definición que apuntaste en el paso 1, como hace la orden de
arriba con el índice default de productos con mapeo dinámico.
Probarlo
mongosh "$ATLAS_URI" --quiet --eval 'db.productos.countDocuments()'
mongosh "$TESELADB_URI" --quiet --eval 'db.getSiblingDB("tienda").productos.countDocuments()'
mongosh "$TESELADB_URI" --quiet --eval 'db.getSiblingDB("tienda").productos.aggregate([{ $search: { text: { query: "silla", path: { wildcard: "*" } } } }, { $limit: 3 }]).toArray()'Los recuentos de cada colección tienen que coincidir en Atlas y en TeselaDB. Una búsqueda devuelve resultados en cuanto termina de construirse su índice. Con la base de prueba, la última orden devuelve las dos sillas. Cuando todo coincide, cambia la cadena de conexión de tu aplicación por la del clúster de TeselaDB, con sus nodos, su CA y un usuario propio para la aplicación.
Limpiar
Borra el archivo de la exportación cuando los datos ya estén en TeselaDB, porque lleva todos tus datos sin cifrar. Si seguiste la guía con los contenedores de prueba, bórralos también con la CA:
rm tienda.gz
docker rm -f teseladb atlas-origen
rm ca.pemSiguientes pasos
- Comprobar una migración, con sumas y hashes por colección.
- Índices de búsqueda, con lo que acepta cada definición.