Actualmente estamos considerando un cambio de Postgres a CouchDB para una aplicación de monitoreo de uso. Algunos números:Estructura de documentos recomendada para CouchDB
Aproximadamente 2000 conexiones, sondeadas cada 5 minutos, para aproximadamente 600,000 nuevas filas por día. En Postgres, almacenamos estos datos, dividida por día:
t_usage {service_id, fecha y hora, data_in, data_out}
t_usage_20100101 hereda t_usage.
t_usage_20100102 hereda t_usage. etc.
Escribimos datos con un proceso almacenado optimista que supone que la partición existe y la crea si es necesario. Podemos insertar muy rápidamente.
Para la lectura de los datos, nuestros casos de uso, en orden de importancia y los resultados actuales son:
* Servicio individual, Día Individual Uso: Buen Rendimiento
* Servicios Múltiples, Mes Uso: Bajo rendimiento
* Individual servicio, mes de uso: bajo rendimiento
* Servicios múltiples, múltiples Meses: Rendimiento Muy pobre
* Servicios múltiples, Single Day: buen rendimiento
Esto tiene sentido porque las particiones están optimizados para el día, que es de lejos nuestro la mayoría imp caso de uso importante. Sin embargo, estamos buscando métodos para mejorar los requisitos secundarios.
A menudo necesitamos parametrizar la consulta por horas también, por ejemplo, solo dando resultados entre 8am y 6pm, por lo que las tablas de resumen son de uso limitado. (Estos parámetros cambian con la frecuencia suficiente que la creación de múltiples tablas de resumen de datos es prohibitiva).
Con ese trasfondo, la primera pregunta es: ¿Es CouchDB apropiado para esta información? Si es así, dados los casos de uso anteriores, ¿cuál sería el mejor modelo de los datos en documentos CouchDB? Algunas opciones que he puesto juntos hasta ahora, que estamos en el proceso de evaluación comparativa son (_id, _rev excluido):
un documento por conexión por día
{
service_id:555
day:20100101
usage: {1265248762: {in:584,out:11342}, 1265249062: {in:94,out:1242}}
}
Aproximadamente 60.000 nuevos documentos al mes. La mayoría de los datos nuevos serían actualizaciones de documentos existentes, en lugar de nuevos documentos.
(Aquí, los objetos en uso están codificados en la marca de tiempo de la encuesta, y los valores entran y salen).
un documento por conexión por mes
{
service_id:555
month:201001
usage: {1265248762: {in:584,out:11342}, 1265249062: {in:94,out:1242}}
}
Aproximadamente 2.000 documentos nuevos al mes. Se requieren actualizaciones moderadas a los documentos existentes.
un documento por la fila de los datos recogidos
{
service_id:555
timestamp:1265248762
in:584
out:11342
}
{
service_id:555
timestamp:1265249062
in:94
out:1242
}
Aproximadamente 15 millones de nuevos documentos al mes. Todos los datos serían una inserción de un nuevo documento. Inserciones más rápidas, pero tengo dudas sobre lo eficiente que será después de un año o 2 años con cientos de millones de documentos. El archivo IO parecería prohibitivo (aunque soy el primero en admitir que no entiendo completamente la mecánica de esto).
Estoy tratando de enfocar esto de una manera orientada a documentos, aunque romper el hábito RDMS es difícil :) El hecho de que solo se pueden parametrizar vistas mínimamente también me tiene un poco preocupado. Dicho esto, ¿cuál de los anteriores sería el más apropiado? ¿Hay otros formatos que no he considerado que tendrán un mejor rendimiento?
Gracias de antemano,
Jamie.
CouchDB lanzará múltiples procesos del sistema para que el servidor de vistas procese una vista, por lo que escala bien en varios núcleos. El resto de CouchDB está en Erlang y también es excelente para usar múltiples núcleos. – mikeal
Tienes razón. Ejecuté una prueba e inserté 2000 de estos documentos grandes (20 procesos que insertan 100 cada uno simultáneamente) en una instancia de Couch v0.9. En un Mac Pro 4,66G Mac, estos se insertaron en básicamente 3m30s. Couch tomó el 350% de la CPU. Al final, el archivo del disco era ~ 2G. Incluso después de la compactación, apenas cambió en absoluto. Por el contrario, insertar 2000 documentos de "un día" tomó ~ 18s. Mucho más rápido, por supuesto. 3m30s está demasiado cerca de la ventana de 5m que tienen. 18 años es mucho mejor. Sin embargo, la compactación tardó casi 3 millones. –
Muchas gracias por esto, es un excelente lugar para comenzar. Hemos ejecutado algunos puntos de referencia y encontramos casi lo mismo que usted. El principal problema que vamos a tener es la constante actualización de los datos: parece que será demasiado lento para los documentos de "todo el mes". Siempre que podamos compactar regularmente, con suerte estaremos bien. Es una pena que no podamos obtener un documento por punto de datos, pero como sospechaba, el archivo IO parece prohibitivo. Lamentablemente para actualizar cualquier otro tipo de documento, tenemos que leer antes de que podamos escribir, con el fin de obtener el _rev ... – majelbstoat