在同一台服务器上运行多个Mongo DB实例

61

我正在使用MongoDB,是个新手。我正准备在专门的Mongo服务器上安装它。

我想创建2个实例 - 一个用于支持QA环境,另一个用于支持Staging环境。

我更熟悉SQL Server,在那里可以创建多个实例。

是否可能在MongoDB中做到同样的事情,如果可能,怎么操作?

4个回答

68

前述的答案不是一种推荐的方式来运行多个实例(特别是在服务器可能同时运行时),因为它会导致使用相同的配置参数,例如logpathpidfilepath,而这在大多数情况下并不是您想要的。

请考虑创建专用的mongod配置文件,例如mongod-QA.confmongod-STAGE.conf。在这些文件中,您可以提供dbpathlogpath文件夹、bind_ipportpidfilepath,针对每个mongod实例提供特定的设置,这样它们就不会互相影响。

完成这些步骤后,您可以按照以下方式触发两个实例:

mongod --config <path-to>/mongod-QA.conf
mongod --config <path-to>/mongod-STAGE.conf
你可以在MongoDB文档的页面上找到更多详细信息:页面


55

您只需创建另一个文件夹(例如:mongodb2)dbpath以用于第二个实例,并在不同的端口(例如:27018)运行它。

 mongod --dbpath /usr/local/var/mongodb2 --port 27018

3
请检查 @kasur 的回答,并在您的问题中加上警告。 - kommradHomer
我理解您的观点,但我的问题有些不同。我的服务器有2.4版本的Mongo,而我的系统需要超过3个MongoDB版本,那么我该怎么办? - suresh pareek
但是我怎么知道要启动哪个Mongo shell?有没有特定的命令来识别进程? - Ankur Soni
@AnkurSoni mongo --port 27018 - Doctor White

40

这是我如何在开发环境中启动4个mongod实例来模拟生产环境。

要启动mongod,您应该为每个mongod使用单独的配置文件。获取4个配置文件并使用它们启动mongod实例:

start C:\mongodb\bin\mongod.exe --config C:\net2\dev1-pc\configs\mongod-primary1.cfg 
start C:\mongodb\bin\mongod.exe --config C:\net2\dev1-pc\configs\mongod-secondary1.cfg --rest
start C:\mongodb\bin\mongod.exe --config C:\net2\dev1-pc\configs\mongod-secondary2.cfg
start C:\mongodb\bin\mongod.exe --config C:\net2\dev1-pc\configs\mongod-secondary3.cfg

配置文件看起来像这样:

mongod-primary1.cfg 文件的内容

systemLog:
    destination: file
    path: c:\net2\primary1-pc\data\log\mongod.log
storage:
    dbPath: c:\net2\primary1-pc\data\db
net:
    port: 27018
replication:
    replSetName: repl1

mongod-secondary1.cfg文件内容

systemLog:
    destination: file
    path: c:\net2\secondary1-pc\data\log\mongod.log
storage:
    dbPath: c:\net2\secondary1-pc\data\db
net:
    port: 27019
replication:
    replSetName: repl1

mongod-secondary2.cfg文件的内容

systemLog:
    destination: file
    path: c:\net2\secondary2-pc\data\log\mongod.log
storage:
    dbPath: c:\net2\secondary2-pc\data\db
net:
    port: 27020
replication:
    replSetName: repl1

mongod-secondary3.cfg文件内容

systemLog:
    destination: file
    path: c:\net2\secondary3-pc\data\log\mongod.log
storage:
    dbPath: c:\net2\secondary3-pc\data\db
net:
    port: 27021
replication:
    replSetName: repl1

你应该真的包含 pidfilepath - Karl Pokus
抱歉,我的错。这仅用于分叉,即如果不进行守护程序,则不会创建pid文件。 - Karl Pokus
我按照以下步骤操作,当我尝试在27018实例中保存某些值时,它会抛出写入错误,如下所示:> db.product.save({a:1}) WriteResult({"writeError": {"code": 10107, "errmsg": "not master"}}) - Johnykutty
1
@Johnykutty,上述配置是复制服务器的配置,而复制服务器应该只用于读取。您可以在主服务器/主服务器上执行写操作。只有主服务器才能在复制服务器上进行写入。从配置中删除复制部分,该服务器将作为另一个独立的MongoDB主实例运行。 - diveinsky

11
可以实现 - 您可以给每个实例分配一个独立的端口来监听,并为其分配一个独立的--dbpath目录以存储其文件,但我不建议这样做,因为它们将竞争相同的资源 - RAM、i/o带宽等。
如果您在此服务器上拥有多个磁盘,可以将它们的数据文件放置在单独的设备上,但仍会冒着QA实例降低生产实例可用性的风险,可能在最糟糕的时候发生。
我会把QA实例放在一个正在执行不重要任务的随机机器上,而不是与我的生产实例共存。

Asya,感谢您的反馈-这非常有帮助。共享一个服务器的环境都是测试环境,因此我不担心它们会争夺资源。但是,我仍希望拥有最好的设置。我可以将磁盘分成多个分区。如何使用mongo、连接字符串等设置它? - amateur
你只需将每个Mongo的dbpath目录放在不同的分区上。然后,由于每个都有不同的端口,您连接到hostname:port - 因此,根据您要连接的内容使用不同的端口。 - Asya Kamsky
好的,明白了。那么这是安装一个Mongo还是两个独立的安装? - amateur
3
您只需要安装一个 MongoDB 发行版。您只需启动两次 mongod 进程即可。 - Asya Kamsky
同一硬盘上的多个分区对性能来说是无用或有害的,不是吗?我认为这里最重要的因素是可用的内存,以便缓存不会窒息。 - Camilo Martin
尽管RAM很重要,但磁盘IOP(或缺乏此类可用性)往往是最常见的限制因素之一(即使内存不足也会由于过多页面错误而表现为不足的IOP)。因此,这取决于限制因素是什么-除了当前瓶颈以外的任何增加都将无用(直到实际瓶颈得到解决为止)。 - Asya Kamsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接