Alternativas para renombrar una base de datos en MongoDB

Tenemos varias opciones:

  1. Tenemos el comando copyDatabase, con autentificación hay que revisar bien los permisos del usuario con el que queremos hacer la copia, en la documentación explica con detalle los permisos necesarios dependiendo de la base base de datos.

 

https://docs.mongodb.com/v3.0/reference/method/db.copyDatabase/

  1. Tenemos la opción de hacer un mongodump y un mongorestore:
         $ mongodump -d old_db_name -o mongodump/

         $ mongorestore -d new_db_name mongodump/old_db_name

 

http://docs.mongodb.org/manual/tutorial/backup-with-mongodump/

 

  1. Luego podemos copiar colección a colección:
use admin   

db.runCommand({renameCollection: "[db_old_name].[collection_name]", to: "[db_new_name].[collection_name]"})

 

  1. O utilizar un el método agragate
db.oldCollection.aggregate([{$match: {}}, {$out: "newCollection"}])db.oldCollection.drop()

 

Precargando los datos en memoria en Mongodb

Tenemos varias opciones:

Touch: Solo válido para  l motor de almacenaje MMAPv1. No es compatible WiredTiger.

db.runCommand({ touch: "records", data: true, index: true })

Esto carga en memoria tanto los datos como los índices.

Cargar un índice especifico: En ocasiones no tenemos suficiente espacio en RAM para cargar todos los datos.

db.usuarios.find({}, {"_id" : 0, "clave" : 1, "fecha" : 1}). hint({"clave" : 1, "fecha" : 1}).explain()

 

Imaginemos que tienes un índice sobre el campo clave y fecha y queremos cargarlo en memoria. Con el comando explain forzaremos a mongod a iterar sobre todo el resultado. Se debe especificar que solo se quiere regresar los campos del índice (el segundo argumento del find) o cargaremos todos  los documentos en memoria.

Mover la base de datos a memoria: Se puede poner toda la base de datos en la RAM antes de iniciar mongo con el comando dd

     for file in /data/db/nombredb.*     

    >do    

    >dd if=$file of=/dev/null     

   > done

 

Esta técnica es buena si hay suficiente espacio en memoria para cargar los datos.

 

Cambiar las opciones de montaje de una partición

En este caso cambiamos la opciones de la partición mongodata sobre la que tenemos la base de datos de mongo

Editamos el fichero /etc/fstab

Añadimos las opciones necesarias, en este caso

/dev/xvdb1 /mongodata xfs defaults,noatime 0 0

Y lo volvemos a montar la partición, como root

mount -o remount /mongodata

Para ver las modificaicones:

[root@mvtv ~]# mount

 

mongorestore Error creating index admin.system.version: 13 err: “not authorized to create index on admin.system.version”

Haciendo un restore de la base de datos en mongo 2.6.9, nos hemos encontrado con este error, es porque el rol de root no tiene el rol de restore.

El rol de root no se puede modificar, con lo cual hay que añadir al usuario el rool de restore.

En nuestro caso

db.grantRolesToUser(“admin”, [ “restore” ])

Con esto ya nos permite hacer el restore

Modelo de memoria de MongoDB

Utiliza Memory Mapped File (mmap())

Mapea la información de la base de datos en la memoria virtual. Accede a la memoria virtual cuando la necesita. Esto significa que no toda la memoria virtual está cargada en la memoria real, solo una parte va subiendo la información a memoria según a va necesitando,  hasta que llena toda la memoria física. Una vez llena tiene que empezar a descartar páginas para dejar espacio y poder subir nueva información. Tiene que encontrar una página que borrar de la memoria para almacenar la nueva página.Para decidir que página quita de la memoria utiliza un algoritmo de LRU (Least Recently Used), o sea la página que hace más tiempo que no se han utilizado

Resident memory y working set

Working set es la porción de datos que se accede más frecuentemente. Y normalmente corresponde a los índices y a un parte de los datos que se accede más comúnmente. Puede ser que exista un sistema que acceda a todos los datos pero esto no es lo normal.

Cómo calcular el tamaño del working set.

Es bastante importante que todo el working set este alocado en memoria. Con lo cual es muy interesante poder calcular cuánto ocupa nuestro working set para calcular las necesidades de memoria. Esto es muy complicado, nos podemos basar en el tamaño medio del documento y de los índices.

Resident memory es la suma de todas las páginas alocadas en memoria, que incluirá el working set y normalmente más cosas que no sé han utilizado.

El funcionamiento de la memoria en el reinicio de la base de datos mongo o en el reinicio de la máquina.

Con este sistema de memoria cuando reiniciamos una base de datos mongo las páginas siguen en memoria, con lo cual no cuando se produce un reinicio no es necesario volver a disco a obtener la información.  Esto se llama soft page fault. Lo que más le cuesta a mongo son los hard page faults. Esto se produce cuando se reinicia la máquina y por tanto se libera la memoria.

Con este sistema de memoria cuando reiniciamos una base de datos mongo las páginas siguen en memoria, con lo cual no cuando se produce un reinicio no es necesario volver a disco a obtener la información.  Esto se llama soft page fault. Lo que más le cuesta a mongo son los hard page faults. Esto se produce cuando se reinicia la máquina y por tanto se libera la memoria.