2012-01-18 34 views
8

Utilizo mongodb para almacenar datos de 30 días que llegan a mí como una secuencia. Estoy buscando un mecanismo de purga mediante el cual pueda tirar los datos más antiguos para crear espacio para nuevos datos. Solía ​​usar mysql en el que manejaba esta situación usando particiones. Mantuve 30 particiones basadas en fechas. Borro la partición fechada más antigua y creo una nueva partición para contener datos nuevos.Cómo manejar el purgado de bases de datos en Mongodb

Cuando mapeo lo mismo en mongodb, me apetece utilizar una fecha basada en 'fragmentos'. Pero el problema es que hace que mi distribución de datos sea mala. Si todos los datos nuevos están en el mismo fragmento, entonces ese fragmento estará tan caliente ya que hay mucha gente accediéndolos y los fragmentos que contienen datos más antiguos serán menos cargados por los usuarios.

Puedo realizar una purga basada en la recolección. Puedo tener 30 colecciones y puedo descartar la colección más antigua para acomodar nuevos datos. Pero algunos de los problemas son 1) Si hago las colecciones más pequeñas, no puedo beneficiarme mucho de la fusión, ya que se realizan por colección. 2) Mis consultas tienen que cambiar a la consulta de las 30 colecciones y tomar una unión.

Por favor sugiérame un buen mecanismo de purga (si corresponde) para manejar esta situación.

Respuesta

9

Hay realmente solo tres formas de purgar en MongoDB. Parece que ya ha identificado varias de las compensaciones.

  1. sola colección, borrar las entradas antiguas
  2. Colección por día, la caída de antiguas colecciones
  3. base de datos por día, eliminar bases de datos viejos

Opción # 1: colección única

pros

  • Fácil de implementar
  • fácil de ejecutar en un mapa/Reduce

contras

  • Elimina son tan caros como inserciones, provoca una gran cantidad de IO y la necesidad de "desfragmentar" o "compacto" el DB.
  • En algún momento se acabará el manejo de los dobles "escribe" como usted tiene que insertar tanto la pena un día de los datos y borrar el valor de los datos de un día.

Opción # 2: recolección por día

pros

  • Extracción de datos a través de collection.drop() es muy rápido.
  • Still Map/Reduce friendly, ya que la salida de cada día se puede combinar o reducir con los datos de resumen.

contras

  • es posible que tenga algunos problemas de fragmentación.
  • Tendrá que volver a escribir las consultas. Sin embargo, en mi experiencia, si tiene suficientes datos que está depurando, rara vez tiene acceso a esos datos directamente. En su lugar, tiende a ejecutar Mapa/Reduce sobre esos datos. Por lo tanto, esto no puede cambiar que muchas consultas.

Opción # 3: Base de datos por día

pros

  • deleción es tan rápido como sea posible, los archivos son simplemente trunca.
  • Cero problemas de fragmentación y fácil de hacer copias de seguridad/restaurar/archivar datos antiguos.

contras

  • Hará consultar más desafío (esperar a escribir algo de código de contenedor).
  • No es tan fácil escribir Mapa/Reducir, sin embargo, eche un vistazo al Marco de Agregación ya que de todos modos puede satisfacer mejor sus necesidades.

Ahora hay una opción # 4, pero no es una solución general. Sé de algunas personas que hicieron "purgas" simplemente usando Capped Collections. Definitivamente hay casos en que esto funciona, pero tiene un montón de advertencias, por lo que realmente necesita saber lo que está haciendo.

Cuestiones relacionadas