【发布时间】:2012-04-17 16:47:55
【问题描述】:
我目前正在为监控系统开发我们当前媒体存储的升级(用于存储视频/音频/元数据),并且我正在重新设计记录结构以提供更强大的解决方案。
我需要为存储在数据文件中的数据创建一些索引数据,所以我正在创建一个索引文件结构,但我担心硬盘故障(想象一下如果在写入索引期间断电文件,它会损坏,因为数据很可能会被写入一半)。 我已经设计了索引的存储方式,但我担心的是电源故障或磁盘故障导致的数据损坏
那么,有人知道在写入时避免数据损坏的技术吗?
我已经进行了一些搜索,但没有找到好的解决方案,一种解决方案是创建写入文件的所有内容的日志,但是我每秒将有更多的 I/O(我担心数量每秒的 I/O 数,系统应该尽可能少地执行)。
我想出的是在索引文件中复制敏感数据以及时间戳和校验和字段。例如:
Field1 Field2 Field3 时间戳校验和
Field1 Field2 Field3 时间戳校验和
所以,我将数据写入了两次,如果当我读取文件时,第一组字段已损坏(校验和不匹配),我有第二组字段应该没问题。我相信如果在中间停止写入时会发生损坏,因此,例如,当软件正在写入第一组字段并且电源故障时,第二组仍然完好无损......如果电源故障而第二set 正在编写中,第一个已经完好无损。
你们觉得这个解决方案怎么样?是否避免数据损坏?
顺便说一句,由于部署具有事务性 NTFS 的系统的限制,我不能将任何类型的数据库用于这种存储或事务性 NTFS
欢迎任何想法,谢谢!
【问题讨论】:
-
使用数据库而不是重新发明轮子。你说你不能使用数据库,但这听起来很假。为什么不呢?
-
我和大卫,使用数据库是更现实的方式,检查火鸟How much time it takes to recover a Firebird database after a power failure?
-
嗯,在监控行业的软件中,数据库从不用于存储视频/音频数据,而是用于存储配置、日志,而不是与视频/音频相关的数据... Video/音频文件必须是独立的,就像视频文件(.AVI、WMV...)一样。对于我们需要实现的性能,数据库系统也有太多的控制和开销。如果我需要存储常规数据,我肯定会使用数据库。
-
我理解您对性能的担忧,但我仍然会听取上述建议并首先研究数据库系统,然后再重新发明轮子。考虑那些在你继续前进很久之后必须支持你的创作的成本:)
-
您可以使用不需要数据库部署的嵌入式数据库系统,例如 DISAM。
标签: c++ delphi data-integrity integrity