进程重启后恢复数据

时间:2011-11-13 04:17:33

标签: linux transactions persistence

我在运行2.6.3x内核的基于x86的Linux系统中有这个要求..

我的进程有一些动态数据(不多,在几兆字节范围内),如果进程崩溃,必须恢复。显而易见的解决方案是将数据存储在共享内存中,如果进程重新启动,则再次读取它。必须小心写入共享内存,以便更新过程中的进程崩溃不会使数据在共享内存中损坏。

在编码之前我自己只是想检查是否有任何提供此功能的开源程序/库..谢谢。

-Santhosh。

1 个答案:

答案 0 :(得分:0)

我不认为您提出的设计是合理的。操作系统崩溃(例如电源故障等)可能导致mmap'd区域与光盘部分同步(可能页面的编写顺序与编写它们的顺序不同),这意味着您的数据结构将获得以任意方式腐败。

如果你需要你的数据库更改是持久的和原子的(也许一致性和完整性也不会受到伤害,对吧?)那么我强烈建议使用支持ACID或相应子集的现有数据库系统。也许sqlite或Berkeley DB可以解决问题。

原则上你可以自己做,但不是你所描述的方式 - 你需要创建某种日志文件,这种日志文件以一种可以原子方式读回来的方式更新,并且能够从一些已知的快照等“重播”事件,这在技术上具有挑战性。

请记住:

  • 操作系统故障可能导致由msync()或类似程序启动的写入部分完成到持久光盘
  • mmap不保证永远不会在其他时间写回数据,即当你暂时没有调用msync()时
  • 页面不一定按照您在内存中修改页面的顺序写回 - 例如你可以写一个[0]然后一个[4096],并且有一个[4096]持久但是[0]不会在崩溃之后。
  • 即使刷新单个页面也不能绝对保证是原子的。

我意识到使用库(例如bdb或sqlite)对数据结构进行每次读取或写入操作都是一种侵入性的改变,但如果你想要这种稳健性,我认为这是必要的。