4

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

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

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

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

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

Field1 Field2 Field3 时间戳校验和

Field1 Field2 Field3 时间戳校验和

所以,我将数据写入了两次,如果当我读取文件时,第一组字段已损坏(校验和不匹配),我有第二组字段应该没问题。我相信如果在中间停止写入时会发生损坏,因此,例如,当软件正在写入第一组字段并且电源故障时,第二组仍然完好无损......如果电源故障而第二set 正在编写中,第一个已经完好无损。

大家觉得这个解决方案怎么样?它是否避免数据损坏?

顺便说一句,由于部署具有事务性 NTFS 的系统的限制,我不能将任何类型的数据库用于这种存储或事务性 NTFS

欢迎任何想法,谢谢!

4

3 回答 3

2

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

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

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

于 2012-04-17T18:01:51.663 回答
2

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

我认为您最好不要复制“敏感数据”,而是分两步写入该数据,第一步写入“校验和”字段为空的数据,然后使用与数据匹配的校验和更新校验和。该校验和将用作“事务已提交”标志并确保数据完整性。

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

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

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

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

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

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

于 2012-04-17T18:46:21.227 回答
0

You can use some sort of transaction logic. Create the index in small chunks and first using a temporary file. When you finish one chunk (file), check for integrity and copy it as an actual index file if it passes the test. At this point you can distribute a few copies of the verified chunk.

于 2012-04-17T18:50:38.193 回答