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

File structure to avoid data corruption

本文关键字:数据 损坏 文件结构      更新时间:2023-10-16

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

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

那么,有谁知道在编写时避免数据损坏的技术?

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

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

字段

1 字段 2 字段 3 时间戳校验和

字段

1 字段 2 字段 3 时间戳校验和

因此,我

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

你们如何看待这个解决方案?它能避免数据损坏吗?

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

欢迎任何想法,谢谢!

忽略

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

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

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

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

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

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

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

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

关于"交易"的理论太多了。

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

重新考虑使用数据库,重新考虑使用

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

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