![故障转移 tmpfs 镜像。我这样做对吗?](https://linux22.com/image/519078/%E6%95%85%E9%9A%9C%E8%BD%AC%E7%A7%BB%20tmpfs%20%E9%95%9C%E5%83%8F%E3%80%82%E6%88%91%E8%BF%99%E6%A0%B7%E5%81%9A%E5%AF%B9%E5%90%97%EF%BC%9F.png)
我的目标是让某个目录可用作 tmpfs。服务器正常运行期间会对此目录进行一些修改,并且这些修改必须通过 rsync 同步到 HDD 上的非 tmpfs 持久目录。
服务器启动后,必须将非 tmpfs 持久目录中的最新版本移动到 tmpfs,然后启动 rsync 同步。
我担心如果 tmpfs 目录为空,rsync 将删除非 tmpfs 备份。
我现在就是按照这种方式做的:
- 在 /etc/fstab 中创建 tmpfs 分区
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