【发布时间】:2015-07-22 18:14:14
【问题描述】:
我正在开发现实世界中的多用户文件存储系统 该系统必须面对系统崩溃或断电的情况 失败,所以我正在研究一致性和持久性。
许多数据库系统支持 ACID,以及现代计算机系统 支持的日志文件系统。我注意到一个日志系统 对于这样的系统将是非常重要的,我们可以使用日志系统 弄清楚坠机前发生了什么和没有发生什么, 所以在系统重启时,我们可以做一个合适的恢复工作。
一个典型的日志系统工作步骤:
- 写入日志(数据或元数据)
- 写入实际数据
- 提交该日志
所以当系统崩溃事件发生时,只有几种可能:
- 日志不完整:所以忽略它
- 日志未提交:所以数据不完整 - 回滚
- 日志已提交:操作完成
一些日志文件系统就是这样工作的。
我不知道数据库系统是如何工作的,一般来说 数据库系统是在用户空间中运行的软件,据我所知, 文件写入功能和磁盘之间有几件事 表面:
- 进程缓存
- 系统缓存
- 磁盘缓存
所以当函数返回时,数据可能不在磁盘上,可能是 在这些缓存中。
在 Windows 系统上,可以通过 FILE_FLAG_NO_BUFFERING 禁用缓存 标记 CreateFile 时,MSDN 说“当缓存被禁用时,所有读取 和写操作直接访问物理磁盘”,我的第一个 问题是,FILE_FLAG_NO_BUFFERING 是否会关闭磁盘缓存 好吧 ?或者如何确保数据已到达磁盘表面 ?
还有一个问题:SATA 和 SCSI 磁盘正在使用“命令 排队”技术,队列中的命令可以重新排序 被更有效地处理,但是日志系统依赖于 时间顺序,命令队列对日志系统(在用户空间中)有害吗? 或者我怎样才能确保 A 在 B 之前被写入?
【问题讨论】:
-
Q1:FILE_FLAG_WRITE_THROUGH 标志关闭系统缓存,数据将缓存在磁盘缓存中但仍会写入磁盘。 FILE_FLAG_NO_BUFFERING 也消除了所有预读文件缓冲和磁盘缓存。 support.microsoft.com/en-us/kb/99794Q2:没关系了。
标签: caching storage consistency acid