如何将数据存储在随机切断电源的机器上

我有一个物理机主机上运行的虚拟机(Debian)。 虚拟机作为它经常在本地networking上接收的数据的缓冲区(这个数据的周期是0.5s,因此吞吐量相当高)。 收到的任何数据都存储在虚拟机上,并通过UDP重复转发到外部服务器。 一旦外部服务器(通过UDP)确认已收到数据包,原始数据将从虚拟机中删除,而不会再次发送到外部服务器。 连接虚拟机和外部服务器的互联网连接是不可靠的,这意味着它可能一度停机数天。

托pipe虚拟机的物理机器随机每天多次切断电源。 没有办法知道何时会发生这种情况,并且不可能为系统添加UPS,电池或类似的解决scheme。

最初,数据存储在虚拟机上基于文件的HSQLDB数据库上。 然而,频繁的停电最终会导致数据库脚本文件被破坏(不在文件系统级别,即可读,但HSQLDB无法理解),这导致了我的问题:

数据应该如何存储在一个断电的环境中,并经常发生?

我能想到的一个select是使用平面文件,将每个数据包作为文件保存在文件系统上。 这样,如果文件由于断电而损坏,则可以忽略,其余数据保持不变。 然而,这带来了一些问题,主要与可能存储在虚拟机上的数据量有关。 在每个数据之间0.5秒时,10天内将生成1,728,000个文件。 这至less意味着使用具有增加数量的inode的文件系统来存储这些数据(当前的文件系统设置在约250,000条消息和30%的磁盘空间使用inode)。 而且,很难(不可能)pipe理。

还有其他的select吗? 是否有在Debian上运行的数据库引擎不会因为停电而被破坏? 另外,应该使用什么文件系统? ext3是目前使用的。

在虚拟机上运行的软件是使用Java 6编写的,所以希望解决scheme不会不兼容。

老实说,你最好的办法是修补电源切断,或者把一个不同的系统放在一个更好的位置。

是的,有些系统比如redis会将数据存储在仅附加日志中进行回放,但是您可能会在较低级别上发生损坏 – 例如,如果您的文件系统被encryption,那么磁盘上的数据可能存在风险。

我感谢任何改进对你有用,但是真正的问题不是你能够解决的问题。

你的方法可以工作。 让我build议一些改进。 在primefaces写入到文件的堆栈溢出中存在一个问题。 实质上,你将每个数据包保存到一个临时文件,然后将其重命名为最终名称。 重命名是一个primefaces操作,将从电源故障安全。 这样,你可以保证你的最终目的地中的所有文件已经正确保存,没有损坏。

那么你可以做什么来处理拥有数百万个文件的问题。 cron是一个可以每个小时运行一个作业的工作,每个小时将所有文件放在一个小时以上,然后再使用primefaces文件操作将它们合并到一个大文件中,这样即使在电源故障期间也能安全地运行,然后删除旧文件。 有点像日志旋转。 一个小时的文件将是大约7,200个文件。 所以在任何时候你都不应该有超过20000个磁盘文件。

你可以在系统中安装一个带有电池供电的写入caching的UPS或RAID卡,只需49.95美元 ,你就可以完成在软件上无法完成的任务。

你声称这是不可能的服务器连接到一个UPS或电池…是根本不可信的。

除了存储所有数据的块设备以外,只读装载整个系统。 直接使用该块设备,并使用该原始块设备实现您自己的数据存储机制。