故障转移 tmpfs 镜像。我这样做对吗?

故障转移 tmpfs 镜像。我这样做对吗?

我的目标是让某个目录可用作 tmpfs。服务器正常运行期间会对此目录进行一些修改,并且这些修改必须通过 rsync 同步到 HDD 上的非 tmpfs 持久目录。

服务器启动后,必须将非 tmpfs 持久目录中的最新版本移动到 tmpfs,然后启动 rsync 同步。

我担心如果 tmpfs 目录为空,rsync 将删除非 tmpfs 备份。

我现在就是按照这种方式做的:

  1. 在 /etc/fstab 中创建 tmpfs 分区
  2. cat /etc/rc.local (伪代码)

    如果有的话,从 /var/spool/cron/crontabs 中删除“tmpfs rsync”cronjob

    cp -r /路径/到/非-tmpfs-backup /路径/到/tmpfs/dir

    将“tmpfs rsync” cronjob 附加到 /var/spool/cron/crontabs

你怎么认为?

答案1

在非 tmpfs 目录深处创建某种种子文件,并且只有当其存在时才 rsync 回非 tmpfs(意味着“启动”副本有效),因此类似于:

引导

mount /path/tmpfs
rsync -aq --delete /path/non-tmpfs/ /path/tmpfs/

CRON

if [ -f /path/tmpfs/some/deep/location/filesgood.txt ]; then
  rsync -aq --delete /path/tmpfs/ /path/non-tmpfs/
fi

它并不完美,但如果你增强它(例如,如果你想在不同的目录中,通过在 cron 期间查找 5 个“cookie”文件),它应该是非常安全的。

答案2

我只想对上面 troyengel 的精彩回答进行评论,但在 serverfault 上缺乏这样做的代表。

一个解决方法是在 -aq 和 --delete 之间应该有一个空格。

另外,我还创建了一个镜像脚本,它将检查 /tmpfs 驱动器中的初始化文件锁,并在第一次运行时从磁盘镜像到 RAM,然后从 RAM 镜像到磁盘:

#!/bin/sh
if [ -f /workspace/z/some/deep/location/inited ]; then
  ionice -c2 -n7 nice -n 19 rsync -aq --delete /workspace/* $HOME/workspace 1>/dev/null
else
  ionice -c2 -n0 nice -n 19 rsync -aq --delete $HOME/workspace/* /workspace 1>/dev/null
fi

请注意,您的锁应该位于 /z/deep/location,因此它始终是最后同步的文件,以防止数据丢失。

我还包含了 nice 和 ionice 参数,因此初始镜像具有高优先级,而从 RAM 到磁盘的镜像具有较低优先级。

如果您足够勇敢,可以使用 -c1 -n7 进行实时初始镜像,如果您预计会出现频繁的空闲时间,则可以使用带有 -c3 且不带 -n 标志的 ionice,以便仅在磁盘未使用时进行镜像。

我将此脚本保存到 /usr/bin/Mirror,并使用 cron 每五分钟运行一次。

crontab -e

*/5 * * * * /usr/bin/Mirror

如果您想将工作文件存储在加密硬盘上,但在 RAM 中处理它们,这尤其有用。

如果您希望在系统启动和关闭时运行镜像,您可以使用 /etc/inittab

id0:26:once:/usr/bin/Mirror

相关内容