0

我有一个生产服务器和一个开发服务器。生产服务器正在运行 mongod,而我的开发服务器正在运行 2 个实例:1 - 作为生产的“从属”(使用副本集)。这会复制我的数据并允许更轻松的备份。2 - “主人”。我的开发集合(无法使用从属实例,关于 slaveOkay 等)。

他们都有自己的pid文件,数据文件夹,一切。一年多来,这一直没有太多问题。

不幸的是,自从上一个版本以来,似乎每当我启动一个实例时,它都会终止另一个实例(prod slave <> dev master)。无论哪一个先开始,另一个总是停止。

任何人都知道为什么 mongo 会突然出现这样的行为以及问题的解决方案吗?由于各种原因,使用主实例来容纳开发集合对我来说并不是一个真正的选择。

希望这能让事情更清楚一点:

production writes --> production [master] --[replicaSet]--> development instance 1 [slave]
development writes --> development instance 2 [master]

谢谢!

4

1 回答 1

0

为后代回答我自己的问题:

mongo 2.4.6 版的初始化脚本似乎有一个特殊之处。它使用以下表达式确定 PID 文件:

PIDFILE=`awk -F= '/^dbpath\s=\s/{print $2}' "$CONFIGFILE"`

这会在等号前后查找带有空格的 dbpath。由于默认配置文件包含“dbpath=/var/lib/mongo”,因此该表达式的结果为空。我想初始化脚本 - 没有给出任何特定的 .pid 文件 - 只使用默认的 .pid 文件位置。通常(有一个实例)这没有任何后果。在我的情况下,它会导致另一个 mongo 实例被终止。

到目前为止,我一直使用“pidfilepath”配置指令(不记得当我第一次安装它时它是否已经存在)。所以基本上我已经将我的初始化脚本更新为(并注意缺少的“\s”'es)

PIDFILE=`awk -F= '/^pidfilepath=/{print $2}' "$CONFIGFILE"`

然后我确保配置语句没有空格:

 pidfilepath=/var/run/mongo/mongod-name.pid  

这解决了我的问题。我希望它对处于相同情况的其他人也有同样的效果。

为什么要为 pid 文件使用 dbpath 呢?

于 2013-09-05T14:01:28.633 回答