背景:
我有一些 AIO 应用程序机器,(运行带有 rails + mongodb + 铬的 ubuntu)在移动教练的一台机器上用于显示信息,偶尔用户可能会将某些数据中的卡盘更改为 mongodb。
现在,机器的电源是恒定的,教练司机可以随时关闭机器。机器有2个分区,第一个是/的aufs,另一个是mongodb的ext4 /data目录。但是在停电的瞬间,db没有数据输入。
问题:
每次机器断电重启(每隔几个小时),mongodb都会在其目录下留下一个mongod.lock文件。在 /etc/rd.local 中,我试图在每次启动时删除锁定文件,但有时它仍然拒绝启动。这导致我的应用程序启动失败。
根据官方文档:http : //www.mongodb.org/display/DOCS/Durability+and+Repair,我仍然有一些无法启动的情况。
在上述常规电源故障情况下运行 mongodb 的最佳做法是什么?无需投入额外的硬件。
首先,请阅读您链接到的祝福文档:
mongod.lock
不要删除 mongod.lock 文件。如果 mongod 无法启动,请使用上述方法之一来纠正这种情况。删除锁定文件将允许数据库在其数据可能损坏时启动。通常,您永远不应该强制数据库以可能损坏的数据开始。在紧急情况下,您可能希望删除锁定文件以从服务器中提取任何数据。如果您曾经手动删除锁定文件并启动服务器备份,则不应认为该服务器“健康”。
按照您链接的祝福文档中概述的步骤在电源故障后恢复。
MongoDB 的设计目的不是在会被毫不客气地踢到脑袋的环境中运行——如果您需要这种持久性,则需要一个专为两阶段提交和刷新写入磁盘而设计的数据库。
所有mongod.lock文件告诉你的是数据库有一个不干净的关闭,即没有被管理员停止,等等。
当--repair自己运行一个操作时,mongod 会尝试读取现有文件,写入新文件,然后交换它们。完成后,它应该删除 mongod.lock 文件,并使您能够启动数据库。
如果与--repairpathargument配合使用,则修复后的文件会被放置在指定的修复路径中,并且锁文件可能不会被移除,因为原始数据文件没有被修复,而是将修复后的数据写入新文件中指定的路径。
可能的工作流程--repairpath:
服务启动,日志消息通知您锁定问题,退出。
mongod --dbpath=/data/db
Run Code Online (Sandbox Code Playgroud)您运行类似于此的修复命令:
mongod --dbpath=/data/db --repair --repairpath=/data/db2
Run Code Online (Sandbox Code Playgroud)
并等待它完成。
完成后,从修复的文件路径启动 mongod:
mongod --dbpath=/data/db2
Run Code Online (Sandbox Code Playgroud)确认工作后,您可以根据需要删除/data/db目录。
所有这些都可以/data/db/通过不使用 --repairpath 选项“替换”文件来消除。
关于恢复,看一下Journaling - 这会创建一个操作日志,每 100 毫秒刷新到永久磁盘,当 mongod 启动并检测未应用的日志文件并应用它们时,删除锁定文件,并启动服务器。