基于事务的归档容器

时间:2012-05-21 15:45:07

标签: transactions filesystems archive

我正在创建一个在插入特定USB密钥时运行的Windows服务。 它的作用很简单:联系FTP服务器,下载一些文件,然后存储 它们位于USB上的(加密)存档中。存档可以只读方式打开 使用提供给客户端的工具(但这与我的问题无关)。

该服务用于使USB与主服务器保持同步(非常类似于Dropbox,但只能下载并且同步文件夹位于可移动媒体上)。存档可以增长到几千兆字节。每周大约有1GB的文件在大约400个用户的密钥上更新。

由于整个更新过程对用户是透明的,因此在将数据写入存档时,他们拔出 USB的可能性是不可忽视的(即使我发出某种尖叫声) ,华而不实的警告:不要取消)。破坏存档需要全部再次下载,这意味着已经加载的服务器上浪费了相当多的带宽。

所以基本上我需要对存档的写入交易。如果它们失败,只要它们不将容器置于不一致状态就可以了。文件是完全写入的,要么不是。如果文件被部分写入,如果容器实际上没有“看到”它,那就没关系。

问题在于: 我怎样才能始终保证数据的一致性?具体来说,如何使IO操作作为事务工作?你会建议什么?我要自己实施一些东西吗?或者是否已有容器提供此功能?

这是我到目前为止所得到的:

  • 创建新存档,在提交时重命名:不可能,存档太大。
  • Zip / Tar / 7z :不合适,写入失败会损坏存档
  • Truecrypt :不合适,因为它需要文件系统驱动程序(用户点的管理员权限)。
  • 需要将文件系统映射到文件的任何内容:不合适,非常确定如果没有管理员就无法做到这一点,但如果可行,那就太棒了。
  • 在SQLite DB中存储文件:它是ACID,因此确实可以成为一种解决方案。但是,由于SQLite具有有限的BLOB容量,因此需要拆分文件。不是很优雅,但我已经准备好了。此外,当存储大型blob时,SQLite的事务日志会变得非常大。
  • 自己实施:我宁愿尽可能地避免这种情况,但我并不害怕这样做。我发现这个话题非常复杂。

如果这个问题过于笼统,请将其移至SU等。

3 个答案:

答案 0 :(得分:1)

您可能想尝试使用svn或git之类的东西来下载加密的差异;如果文件被破坏,它们通常可用于在本地重建文件。或者只是下载差异并使用补丁生成最新的文件版本。

如果用户在写入数据的过程中拔出FLASH驱动器,则还有其他问题。许多不可靠(在闪存块级别,而不是文件系统级别)并且可能被破坏到像NTFS或EXT3这样的日记文件系统无法恢复的程度。这里有更多细节:https://superuser.com/questions/290060/can-flash-memory-be-physically-damaged-if-power-is-interrupted-while-writing

答案 1 :(得分:0)

非常简单,真的。写入临时,如果写完成则设置为主,否则删除并重试。

答案 2 :(得分:0)

也许我们的SolFS(应用程序版)可行。 SolFS在容器文件中提供虚拟文件系统,它支持日志记录数据写入模式,这有助于保持文件系统的整体性。