2012-07-17 13 views
6

He estado usando MongoDB durante un tiempo, y vi que fsync espera a que los datos se descarguen en el disco. Ok, entonces pensé que era la solución para la seguridad de los datos.¿Para qué sirve Fsync de MongoDB?

Funcionó bien por toma larga, más larga que la alternativa de SQL. Luego vi que podía poner el syncdelay en 0, luego volvió la velocidad, pero pensé en cómo sería en el futuro con muchas solicitudes simultáneas. Así que eliminé la opción fsync de las actualizaciones y las inserciones, y eliminé la opción de configuración syncdelay.

Para comprobar si se estaban escribiendo los datos, revisé rápidamente Rockmongo después de hacer una actualización y los datos estaban realmente allí, ¡muy rápido!

Entonces, ¿en serio qué es fsync si hace que las escrituras sean lentas y sin ellas las escrituras suceden, y rápido de todos modos?

Respuesta

5

documentación por Mongo:

El uso principal de fsync es limpiar y cerrar la base de datos para copias de seguridad.

también

Los bloques de operación fsync todas las demás operaciones de escritura por un tiempo que se ejecuta.

El bloqueo parece ser el motivo.

4

fsync es técnicamente un comando de administración que fuerza el vaciado de todos los datos al disco. No debería tener que usarlo en su código, normalmente no al menos. Se usa para bloquear la base de datos para copias de seguridad, etc.

La seguridad de los datos en MongoDB proviene de la replicación/fragmentación/registro en diario, no de forzar escrituras. Ese tipo de derrotas el propósito de la cosa.

El controlador de Java ajusta este concepto de "escritura y sincronización" en la clase WriteConcern, que nunca me gustó mucho. No debería tener que decidir qué parte de sus datos es más o menos importante, sino simplemente confiar en que la herramienta hará su trabajo.

Además, si configura syncdelay a cero, asegúrese de desactivar el registro por diario. Ver this.

+0

Mi mayor preocupación fue que Mongo almacenó datos en la memoria y luego en el disco después del syncdelay, y si el usuario recibe un mensaje de error pero el hardware falló antes de esa sincronización, básicamente, un gran error. ¿Estoy en lo correcto? o hay una solucion a esto? – Hadrian

+0

Nuevamente, replicación.MongoDB es un almacén de datos distribuidos, no un RDBMS. Una sola instancia de MongoDB es esencialmente _useless_, porque no puede confiar en que sea duradera por sí misma. Una vez que tienes dos instancias, entonces no necesitas preocuparte por la falla del hardware. – kprobst

+0

Una única instancia con registro en diario está bien para la durabilidad, particularmente con la preocupación de escritura de diario. – MrKurt

0

Como han dicho las otras respuestas, el comando fsync fuerza una descarga y normalmente se usa justo antes de bloquear archivos de datos para una instantánea puntual.

Hay una "fsync" write concern option en getLastError que esperará a regresar a todos los datos pendientes que se han descargado al disco. Sin embargo, normalmente no usaría esto, la opción "j" (que regresa tan pronto como haya pasado el diario) es mucho más rápida de devolver y aún garantiza escrituras duraderas. Puede pasar a través de un comando de actualización/inserción como la opción segura en su controlador de elección para que ejecute automáticamente el comando getLastError por usted.