Tenemos una colección de datos de registro, donde cada documento de la colección se identifica mediante una dirección MAC y un día calendario. Básicamente:En MongoDB, estrategia para maximizar el rendimiento de las escrituras en los documentos de registro diarios
{
_id: <generated>,
mac: <string>,
day: <date>,
data: [ "value1", "value2" ]
}
Cada cinco minutos, añadimos una nueva entrada en el registro de la matriz de datos dentro del documento del día actual. El documento se transfiere a la medianoche UTC cuando creamos un nuevo documento para cada MAC.
Hemos notado que IO, medido por bytes escritos, aumenta durante todo el día y luego vuelve a bajar a la medianoche UTC. Esto no debería suceder porque la tasa de mensajes de registro es constante. Creemos que el comportamiento inesperado se debe a que Mongo mueve documentos, en lugar de actualizar sus matrices de registros. Por lo que vale, stats()
muestra que el paddingFactor es 1.0299999997858227.
varias preguntas:
- ¿Hay una manera de confirmar si Mongo está actualizando en su lugar o en movimiento? Vemos algunos movimientos en el registro lento de consultas, pero esto parece una evidencia anecdótica. Sé que puedo
db.setProfilingLevel(2)
, luegodb.system.profile.find()
, y finalmente busco"moved:true"
, pero no estoy seguro si está bien hacerlo en un sistema de producción ocupado. - El tamaño de cada documento es muy predecible y regular. Suponiendo que mongo está haciendo muchos movimientos, ¿cuál es la mejor manera de descubrir por qué Mongo no puede preseleccionar con mayor precisión? ¿O para hacer que Mongo presfore con mayor precisión? Suponiendo que la descripción anterior del problema es correcta, ajustar el factor de relleno no parece ser suficiente.
- Debería ser bastante fácil para mí preseleccionar el documento y eliminar cualquier conjetura de Mongo. (Sé que los documentos padding factor dicen que no debería tener que hacer esto, pero necesito dejar este tema atrás). ¿Cuál es la mejor manera de preseleccionar un documento? Parece simple escribir un documento con un campo de matriz de bytes de basura, y luego eliminar inmediatamente ese campo del documento, pero ¿hay algún problema que deba tener en cuenta? Por ejemplo, puedo imaginar tener que esperar en el servidor para la operación de escritura (es decir, hacer una escritura segura) antes de eliminar el campo de basura.
- Estaba preocupado por la preasignación de todos los documentos de un día más o menos al mismo tiempo porque parece que esto saturaría el disco en ese momento. ¿Es esta una preocupación valida? ¿Debería tratar de distribuir los costos previos a la asignación el día anterior?
Scott Hernandez respondió esta pregunta en el Grupo de Google, por lo que estoy publicando una lista en su respuesta: http://groups.google.com/group/mongodb-user/browse_thread/thread/8a24e7f3faf95f71# – jtoberon
Última actualización: todavía estamos tratando de descubrir qué está pasando. – jtoberon