跨Windows/Linux的大文件映射数据完整性事务化方案咨询
我拥有数十GB级别的持久化数据集,需部署可在Windows和Linux 64位系统编译运行的服务器对其进行操作与修改。采用文件映射(File mapping)是自然选择,但内存页修改异步同步至文件的特性,在进程崩溃、断电等异常终止场景下易导致数据不一致。我希望通过类事务技术解决该问题:所有文件映射修改需为临时状态,异常时可回滚,提交操作需为原子性,提交后变更持久化。
已提出的四种设计方案及优劣
方案1:WAL日志文件+显式写访问请求
应用需调用函数申请写权限,首次修改页时将原内容存入日志文件,提交时依次执行FlushFileBuffers/fsync、FlushViewOfFile/msync等操作,重启时若日志非空则回滚。
优劣:安全性最高,但需修改大量代码且脏页检查开销高。方案2:访问违例触发隐式写访问
文件映射设为PAGE_READONLY,写操作触发异常——Windows用SEH处理、Linux用SIGSEGV处理,保存页原内容至日志后改为PAGE_READWRITE,提交时恢复只读权限。
优劣:已在Windows实现原型,但异常处理存在潜在风险。方案3:使用写时复制内存保护
理论上采用PAGE_WRITECOPY(Linux是否有同类机制存疑),由OS自动分配脏页,提交时识别脏页同步至文件并恢复权限。
优劣:理论上高效但跨平台API可行性存疑。方案4:带日志支持的文件系统
在文件系统层面实现事务模式,映射文件变更临时存储,未提交则回滚。
优劣:理论最优但需确认是否有符合需求的跨平台支持文件系统。
现征集更多针对该场景的事务性设计方案或优化建议。
内容的提问来源于stack exchange,提问作者valdo

