文件结构,以避免数据损坏

时间:2012-04-17 16:47:55

标签: c++ delphi data-integrity integrity

我目前正在开发升级我们当前的媒体存储(用于存储视频/音频/元数据)以用于监控系统,我正在将记录结构重新设计为更强大的解决方案。

我需要创建一些存储在数据文件中的数据的索引数据,所以我创建了一个索引文件结构,但我关注的是硬盘故障(想象一下,如果在写入索引期间断电文件,它将成为腐败,因为数据很可能是半写的)。 我已经设计了如何存储索引,但我担心的是与电源故障或磁盘故障时的数据损坏有关

那么,有没有人知道在写入时避免数据损坏的技术?

我已经搜索了一下,发现没有好的解决方案,一个解决方案就是创建一个写入文件的所有内容的日志,但之后我每秒会有更多的I / O(我关注的数量)每秒的I / O数量,系统应该尽可能少地执行。)

我想到的是复制索引文件中的敏感数据以及时间戳和校验和字段。例如:

Field1 Field2 Field3时间戳校验和

Field1 Field2 Field3时间戳校验和

所以,我有两次写入数据,如果我读取文件时,第一组字段已损坏(Checksum不匹配),我有第二组字段应该没问题。我认为,如果写入中间停止写入会发生腐败,例如,当软件写入第一组字段并且电源故障时,第二组仍然完好无损...如果电源故障而第二组正在编写集合,第一个已经完好无损。

你们怎么看待这个解决方案?它是否可以避免数据损坏?

顺便说一下,由于部署具有事务性NTFS的系统的限制,我无法使用任何类型的数据库用于此类存储或事务性NTFS

欢迎任何想法,谢谢!

3 个答案:

答案 0 :(得分:2)

忽略您无法使用数据库的问题部分:)

您可能会发现感兴趣的SQL Server 2012的FileTable。您可以将数据库外部的文件存储在文件夹中,但仍然可以像访问数据库一样访问这些文件。您可以使用数据库将新文件插入该目录,或者只是将文件复制到该文件夹​​中。您的数据库不会因视频文件而变得非常胖。如果数据库服务器软件出现故障,它们也无法访问。您的帧索引可以是单独的.jpg文件(或其他),这些也可以通过FileTable和索引(通过外键)引用到主视频文件。帧索引表非常简单。

因此,您可以消除编写文件和维护日志以查看是否存在故障的数据库开销。如果操作系统由于电源故障而无法写入文件,那么数据库将没有机会。您可以进行目录比较,并使用强大的实用程序来移动文件,如果写入的任何部分失败,则不要删除源文件。

答案 1 :(得分:2)

它不会避免数据损坏,因为损坏可能发生在任何一组或两组字段中。

我认为你最好不要复制“敏感数据”但是分两步写入数据,第一步用“checksum”字段写空数据,然后在第二步用同一个数据更新校验和数据。此校验和将用作“事务已提交”标志并确保数据完整性。

当您读取数据时,忽略未提交的所有索引集,我的意思是校验和不匹配。

然后进行大量测试,并进行微调,在进程的每一步强制数据损坏,并保存随机数据。我个人认为测试需要大量的工作,因为失败是随机的,这就是为什么人们建议你使用多年测试的数据库。

请注意,虽然它增加了一些针对某些类型的数据损坏的保护,但它并不完美,您可以添加其他安全层来保护您的数据,包括数据复制,完整性检查和外部配置,包括无中断,raid系统,定期备份。

关于“交易”的理论太多了。

搜索“原子事务处理算法”以获取更多详细信息。

重新考虑使用数据库,使用日志重新考虑,甚至重新考虑使用文件系统来存储您的信息。

答案 2 :(得分:0)

您可以使用某种交易逻辑。以小块创建索引,首先使用临时文件。完成一个块(文件)后,检查完整性并在通过测试时将其复制为实际索引文件。此时,您可以分发经过验证的块的几个副本。