以编程方式模拟 Linux 上的文件损坏?(用于数据库耐久性测试)

以编程方式模拟 Linux 上的文件损坏?(用于数据库耐久性测试)

基本上,我想要fwrite() n字节并将< n字节写入实际磁盘上,或者可能出现的任何其他不一致现象(例如扇区无序写入)。

我知道我可以在硬件层面上做到这一点:

  • 拉扯电源线,使金属裸露,或者
  • 只需通过虚拟机管理程序发出重置即可使用虚拟化操作系统。

..但我不喜欢上述情况,因为:

  • 我不想因实际断电而损坏我的硬件。
  • 实际的功率损耗模拟是手动的和/或难以自动化。
  • 虚拟化电源损耗模拟更好,但我猜测通过等待 VM 启动对数据库进行 100 次运行会非常慢,而且还必须构建逻辑来重新尝试通过 SSH 登录,直到 VM 启动完成。

..所以我正在寻找一种更快、更简单的解决方案来构建自动化。

我有一些想法:

1)使用以下命令终止进程$ kill -9 dbms_pid

这可能行不通,因为我猜测给出的所有内容fwrite()都是以原子方式添加到内核管理的缓冲区中的(这只是猜测),并且在进程终止后内核可能只是将缓冲区正常刷新到磁盘?

2)在写入过程中卸载文件系统

我认为当文件系统上有打开的文件时,卸载功能不起作用。

3)让文件系统驻留在由文件支持的环回设备上,并在电源切断点停止对该文件的写入

我认为没有这样的机制。重命名文件可能不会停止对文件系统的写入,因为环回驱动程序可能只是引用 inode 或一些内部引用。

卸载环回设备可能存在同样的问题,即当有人在其上打开文件时无法执行此操作。

从块设备作为文件进行复制是可行的(除非它是写独占锁定的,很可能是这样的),但因为复制内容不是原子操作,所以它可能会带来与关机无关的产物。

4)将文件系统托管在 LVM 上并拍摄快照

这可能是我最可行的想法。对 LVM 卷进行快照是原子操作,可以很好地模拟断电?我猜未刷新的缓冲区/页面不会被考虑在快照中(这对我的模拟来说很好),我希望这会引入与断电相同的现象,例如fwrite()内容只写了一半?

是否会出现无序写入的情况,或者写入 LVM 卷的页面是否总是按顺序应用?


您还有其他想法吗?您觉得这些选项怎么样?您同意 4) 是最好的想法吗?

我为什么要这样做:基本上,我正在开发一个数据库,我想通过构建一个自动化脚本来测试它的耐用性,该脚本将通过一轮大量的严酷测试,通过给它保存数据,同时至少模拟磁盘断电,然后验证没有丢失已提交的数据并且数据库可以安全恢复。

答案1

据推测,它们是 SATA 驱动器,具有“热插拔”的潜力。

因此,请做好系统的热插拔准备工作,以便您不会释放任何{魔法烟雾},然后在严酷测试期间拉动驱动器。

我会考虑热插拔驱动器托架,而不是尝试手动拔下它们。

进一步阅读:https://serverfault.com/questions/690609/

相关内容