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


13

我有一个在物理机主机上运行的虚拟机(Debian)。虚拟机充当其在本地网络上频繁接收的数据的缓冲区(该数据的周期为0.5s,因此吞吐量相当高)。接收到的所有数据都存储在虚拟机上,并通过UDP反复转发到外部服务器。外部服务器确认(通过UDP)它已接收到数据包后,原始数据将从虚拟机中删除,然后不再发送到外部服务器。连接虚拟机和外部服务器的Internet连接不可靠,这意味着一次可能会断开几天。

托管VM的物理机每天随机几次断电。无法判断何时会发生这种情况,并且无法在系统中添加UPS,电池或类似解决方案。

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

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

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

还有其他选择吗?是否有在Debian上运行且不会因断电而损坏的数据库引擎?此外,应为此使用什么文件系统?ext3是目前使用的。

虚拟机上运行的软件是使用Java 6编写的,因此希望该解决方案不会兼容。


14
“托管虚拟机的物理机每天会随机断电数次。无法得知何时将要断电,并且无法在虚拟机上添加UPS,电池或类似的解决方案。系统。” 我真的很想知道这是怎么可能的。它在国际空间站中吗,因此需要2000万美元才能发射UPS或其他东西?
ceejayoz

3
机器是否至少具有带电池后备缓存的RAID控制器?
Zoredache

4
我们可以为这个问题推荐非常有趣,有创造力甚至在理论上正确的解决方案。但是,我们不知道主机上运行的是什么虚拟机管理程序和硬件,因此无法保证磁盘写操作已真正写入或以正确的顺序写入……
pino42

5
@Sevas听起来好像不是您的电话,但我建议您值得指出的是,50台基本的廉价UPS的价格为2500美元,并且不需要维护(您需要在电池开始使用几年后更换它们) )。除非您知道一堆免费工作的编码器,否则尝试用软件解决此问题的成本将远高于此。可能有助于使管理人员以每单位50美元的价格解决此问题,而不是数十小时或数百小时的熟练工时(每小时3位数)。
HopelessN00b

9
这实际上听起来像是恶意程序。用户不知道“ VM”正在其计算机上运行。它正在窃取整个网络中的数据,然后通过一个连接将其漏出以隐藏自身。用户随机“打开和关闭计算机”-因此您不能仅添加UPS。
劳伦斯

Answers:


23

老实说,您最好的方法是修复电源中断或在更好的位置部署其他系统。

是的,有一些系统(例如redis)会将数据存储在仅附加日志中以供重播,但是您可能会在较低级别上遭受损坏-例如,如果文件系统被加密,则磁盘上的数据可能会受到威胁。

我感谢任何改进对您都是有用的,但实际上,鉴于您所概述的情况,这个问题并不是可以解决的。


8
+1正确答案是“不要那样做”
克里斯·S

6
+1最终,随机的断电会损坏您的文件系统。电子设备在电源故障时会发生不可预测的事情。
格兰特(Grant)2012年

-1(虚拟-1)。我认为,这样的系统必须建立在不时断电的假设之上。这个假设是您必须处理的现实事实。
伊加尔·塞班

11

您的方法可行。让我提出一些改进。原子写入文件时在堆栈溢出中存在一个问题。本质上,您将每个数据包保存到一个临时文件中,然后将其重命名为其最终名称。重命名是一种原子操作,可以防止电源故障。这样,您可以确保最终目标中的所有文件都已正确保存,没有损坏。

然后,您可以做什么来解决数百万个文件的问题。cron是一项可能会每小时运行的作业,它将所有文件更旧一个小时,然后再次使用原子文件操作将它们组合成一个大文件,这样即使在停电期间该作业也可以安全运行,然后删除旧文件。有点像日志旋转。一个小时的文件价值约为7,200个文件。因此,在任何时候,磁盘上都不应包含超过20,000个文件。


1
这不是一个不好的答案,但是问题在于假设写入本身是原子操作,事实并非如此。因此,在错误的时间断电仍会创建数据或FS损坏。大概是最好的选择,除了固定电源或将东西插入UPS之外,因此+1。
HopelessN00b


是的,一旦写入文件重命名是原子操作。首先,不是写文件。
HopelessN00b 2012年

3
@ HopelessN00b新文件已写入一半或损坏都没关系。您的旧文件状态良好。恢复系统时,将销毁半写的文件。
DJClayworth

2
确实是@ HopelessN00b!只能说临时目录中的临时文件只能写一半。最终目标目录中的所有文件始终不会损坏且安全地位于磁盘上
Marwan Alsabbagh 2012年

7

您在系统上安装了具有电池后备写入缓存的UPS或RAID卡,而只需花费49.95美元,您就可以完成仅靠软件无法完成的工作。

您声称无法以某种方式将此服务器连接到UPS或电池...这简直令人难以置信。


9
官僚愚蠢总是令人信服的。
Dan在火光中摆弄

3
@DanNeely My PHB won't let me hook this up to a UPS/battery与“ it is not possible to add a UPS, a battery, or a similar solution to the system. 不要太学究” 有很大的不同,但这是一个重要的区别,因为它改变了可用的方法和解决方案。
HopelessN00b 2012年

或者,就像其他地方提到的那样,如果我要求安装UPS,则被劫持计算机的用户会感到惊讶。否则情况会令人难以置信。只要有适当的业务案例,任何人都可以在合理的范围内接受UPS来处理损坏的数据。
WernerCD

@WernerCD我希望您认识我们的CIO。虽然我同意劫持某人的计算机是一种可能的用例,但我也可以想到合法的计算机,因此,我会给这个人带来疑问的好处。考虑一下嵌入式系统和控制器,或者像Raspberry Pi一样,肯定是您使用的“计算机”的价值低于将其连接到UPS所需的50美元。
HopelessN00b 2012年

即使计算机的价值低于50美元的UPS,实际上计算机上的数据还是值得的。Google建立在“毫无价值的”计算机上。比CPU成本更重要的是数据丢失,人力损失(这种编程冒险,数据损坏追逐,旧系统以及新部分中的错误跟踪)的成本,客户价值的损失(丢失了我的数据吗?请下一家公司。),等等
WernerCD

5

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


3
...并购买由电池供电的磁盘控制器卡,并确保磁盘上没有写缓存,否则您仍然会费劲。
voretaq7

在这里说他们应该从Live-CD或等效的ROM系统中启动,并使用一些固态存储与平面文件解决方案一起使用。
马克·艾伦

可以禁用写缓存。这种方法是可行的。建议仅追加存储机制。块是原子写入的(我假设),因此您可以有两个“指针”块,它们指向具有新/待办数据的部分的开头和结尾。在写入/完成数据之后,更新指针。也应禁用NCQ。
不眠之地
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.