我有一台运行在物理机主机上的虚拟机 (Debian)。虚拟机充当它经常通过本地网络接收的数据的缓冲区(此数据的周期为 0.5 秒,因此吞吐量相当高)。收到的任何数据都存储在虚拟机上,并通过 UDP 重复转发到外部服务器。一旦外部服务器(通过 UDP)确认它收到了一个数据包,原始数据就会从虚拟机中删除,并且不会再次发送到外部服务器。连接 VM 和外部服务器的 Internet 连接不可靠,这意味着它可能一次关闭数天。
托管 VM 的物理机每天会随机断电数次。无法判断何时会发生这种情况,也无法向系统添加 UPS、电池或类似解决方案。
最初,数据存储在虚拟机上基于文件的 HSQLDB 数据库中。但是,频繁的断电最终导致数据库脚本文件损坏(不是在文件系统级别,即可读,但HSQLDB无法理解),这就引出了我的问题:
在断电可能并且确实经常发生的环境中,数据应该如何存储?
我能想到的一种选择是使用平面文件,将每个数据包保存为文件系统上的一个文件。这样,如果文件因断电而损坏,则可以忽略它,其余数据保持完整。然而,这会带来一些问题,主要与可能存储在虚拟机上的数据量有关。每条数据间隔 0.5 秒,10 天内将生成 1,728,000 个文件。这至少意味着使用具有更多 inode 的文件系统来存储这些数据(当前的文件系统设置在大约 250,000 条消息和 30% 的磁盘空间使用时耗尽了 inode)。此外,它很难(并非不可能)管理。
还有其他选择吗?是否有在 Debian 上运行的数据库引擎不会因断电而损坏?另外,应该为此使用什么文件系统?ext3 是目前使用的。
在虚拟机上运行的软件是使用 Java 6 编写的,因此希望该解决方案不会不兼容。