linux - 进程重启后恢复数据

标签 linux transactions persistence

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

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

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

-Santhosh.

最佳答案

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

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

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

请记住:

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

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

关于linux - 进程重启后恢复数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8109573/

相关文章:

linux - 如何使用 Pyinstaller 为 Linux 机器创建可执行文件?

sql-server - 如何从 SQL Server 事务中刷新全文索引

tomcat - t 找到基本名称 org.eclipse.persistence.exceptions.i18n.PersistenceUnitLoadingExceptionResource 的包,语言环境 en_US

超过 100 万行的 SQL Server BULK INSERT - 需要性能改进

haskell - 在 Haskell 中使用类似于事件日志的酸性状态

vue.js - 如何阻止 i18n 在 Vue 上重新加载页面时恢复为默认语言环境?

linux - ftp 传输后 mp3 和 wav 文件播放断断续续/太快

c++ - 如何同时处理多个并发实例?

linux - 在并行处理中使用 awk 获取语法错误

javascript - 处理数据库事务返回