Tengo una máquina virtual (Debian) ejecutándose en un host de máquina física. La máquina virtual actúa como un búfer para los datos que recibe con frecuencia a través de la red local (el período para estos datos es 0.5s, por lo que un rendimiento bastante alto). Todos los datos recibidos se almacenan en la máquina virtual y se envían repetidamente a un servidor externo a través de UDP. Una vez que el servidor externo reconoce (a través de UDP) que ha recibido un paquete de datos, los datos originales se eliminan de la máquina virtual y no se envían nuevamente al servidor externo. La conexión a Internet que conecta la VM y el servidor externo no es confiable, lo que significa que podría estar inactiva durante días a la vez.
La máquina física que aloja la VM obtiene su corte de energía varias veces al día al azar. No hay forma de saber cuándo va a suceder esto y no es posible agregar un UPS, una batería o una solución similar al sistema.
Originalmente, los datos se almacenaban en una base de datos HSQLDB basada en archivos en la máquina virtual. Sin embargo, los frecuentes cortes de energía eventualmente causan que el archivo de script de la base de datos se corrompa (no a nivel del sistema de archivos, es decir, es legible, pero HSQLDB no puede tener sentido), lo que lleva a mi pregunta:
¿Cómo deben almacenarse los datos en un entorno donde los cortes de energía pueden y ocurren con frecuencia?
Una opción que se me ocurre es usar archivos planos, guardar cada paquete de datos como un archivo en el sistema de archivos. De esta manera, si un archivo está dañado debido a la pérdida de energía, puede ignorarse y el resto de los datos permanece intacto. Sin embargo, esto plantea algunos problemas, principalmente relacionados con la cantidad de datos que probablemente se almacenan en la máquina virtual. A 0.5s entre cada pieza de datos, se generarán 1,728,000 archivos en 10 días. Esto al menos significa usar un sistema de archivos con un mayor número de inodos para almacenar estos datos (la configuración actual del sistema de archivos se quedó sin inodos a ~ 250,000 mensajes y se utilizó el 30% de espacio en disco). Además, es difícil (no imposible) de administrar.
¿Hay más opciones? ¿Existen motores de base de datos que se ejecutan en Debian que no se corrompan por cortes de energía? Además, ¿qué sistema de archivos se debe utilizar para esto? ext3 es lo que se usa en este momento.
El software que se ejecuta en la máquina virtual está escrito con Java 6, por lo que esperamos que la solución no sea incompatible.
fuente
Respuestas:
Honestamente, su mejor enfoque aquí es solucionar los cortes de energía o implementar un sistema diferente en una mejor ubicación.
Sí, hay sistemas como redis que almacenarán datos en un registro de solo agregar para reproducirlos, pero corre el riesgo de corrupción en niveles inferiores, por ejemplo, si su sistema de archivos está codificado, entonces los datos en el disco están potencialmente en riesgo.
Aprecio que cualquier mejora sea útil para usted, pero realmente el problema no se puede resolver dado el escenario que ha descrito.
fuente
Tu enfoque puede funcionar. Permítanme sugerirle algunas mejoras. Hubo una pregunta en el desbordamiento de la pila sobre la escritura atómica en el archivo . Esencialmente, guarda cada paquete de datos en un archivo temporal y luego cambia el nombre a su nombre final. El cambio de nombre es una operación atómica que estará a salvo de fallas de energía. De esa manera, tiene la garantía de que todos sus archivos en su destino final se han guardado correctamente sin daños.
Entonces, ¿qué puede hacer para lidiar con el problema de tener millones de archivos? ¿Es cron un trabajo que se ejecuta tal vez cada hora que toma todos los archivos anteriores a una hora y los combina en un archivo grande usando nuevamente operaciones de archivo atómico para que este trabajo se ejecute de manera segura incluso durante fallas de alimentación y luego borre los archivos antiguos. Algo así como la rotación del registro. Una hora de archivos sería de alrededor de 7.200 archivos. Entonces, en cualquier momento, no debería tener más de 20,000 archivos en el disco.
fuente
Instala un UPS o una tarjeta RAID con una memoria caché de escritura respaldada por batería en el sistema, y por tan solo $ 49.95 , logra lo que es simplemente imposible de lograr solo con el software.
Su afirmación de que de alguna manera no es posible conectar este servidor a un UPS o batería ... simplemente no es creíble.
fuente
My PHB won't let me hook this up to a UPS/battery
es algo muy diferente ait is not possible to add a UPS, a battery, or a similar solution to the system.
No ser demasiado pedante, pero es una distinción importante porque cambia el enfoque y las soluciones disponibles.Monte todo el sistema de solo lectura, excepto un dispositivo de bloque que almacena todos sus datos. Use ese dispositivo de bloque directamente e implemente su propio mecanismo de almacenamiento de datos usando ese dispositivo de bloque sin procesar.
fuente