1つのシステムで2つのMongoDBを使ったらコネクションエラー、その対応策を考察

先日、1つのシステムで2つMongoDBを使ったら、PHPで使うと片方からrstパケットが50%ぐらいの確率で飛んでくるようになりました。

– MacOSX 10.8
– MongoDB 2.4.7
– PHPのMongoDBドライバ-> mongo 1.4.4 stable
です。現時点でMongoDBもドライバも最新、firewallも切っている、にも関わらずコネクションエラーが50%ぐらいの確率で起きるわけです。

RSTパケットが飛んでくる方の立ち上げ方は以下の様にしていました。

$ cat run
#!/bin/sh

./bin/mongod

$ cat run37017 
#!/bin/sh

./bin/mongod --port 37017 --dbpath ./data/37017/

いちおうdbpathは分離していたわけです。しかしながら後者、port 37017の方からRSTが飛んできたりしていました。

友人に、適当にググったりstackoverflowで対処療法を見つけるのではなく公式ドキュメントを読めと言われたので調べてみました。公式にはこのように書いてありました↓

Run Multiple Database Instances on the Same System

In many cases running multiple instances of mongod on a single system is not recommended. On some types of deployments [2] and for testing purposes you may need to run more than one mongod on a single system.

In these cases, use a base configuration for each instance, but consider the following configuration values:

dbpath = /srv/mongodb/db0/
pidfilepath = /srv/mongodb/db0.pid

The dbpath value controls the location of the mongod instance’s data directory. Ensure that each database has a distinct and well labeled data directory. The pidfilepath controls where mongod process places it’s process id file. As this tracks the specific mongod file, it is crucial that file be unique and well labeled to make it easy to start and stop these processes.

Create additional control scripts and/or adjust your existing MongoDB configuration and control script as needed to control these processes.


そもそもおすすめしない、と書いてありますので、よくなかったのかもしれません。。。
これを見るに、プロセスIDとログを指定しなかったのが悪かったのかなと感じました。

まだ検証していませんが、次回からはpidを使おうと思います。
-> 検証してみました↓

CPU/ネットワーク/DISK、どこがボトルネックになっているかに寄ると思いますが、たとえば1つのシステムにSSDを4つ挿して、1つのMongoDBの書き込み領域をそれぞれ1つのSSDに割り当てて、1つのシステムで4つのMongoDBにしたい場合があると思います。もちろんCPUとネットワークに余裕があるときにやらないとだめですけれども。

というわけで、データ、プロセスID、ログを明示的に指定して実行してみたところ、エラーが出なくなりました。私のやり方がまずかったわけです。

うまく行くconfファイルは以下のようになります。

$ cat 27017.conf 
fork = true
bind_ip = 127.0.0.1
port = 27017
quiet = false
dbpath = ./data/27017/
pidfilepath = ./piddir/27017.pid
logpath = ./log/27017.log
logappend = true
journal = true

$ cat 27018.conf 
fork = true
bind_ip = 127.0.0.1
port = 27018
quiet = false
dbpath = ./data/27018/
pidfilepath = ./piddir/27018.pid
logpath = ./log/27018.log
logappend = true
journal = true

そして、立ち上げ用スクリプトです。
$ cat run27017 
#!/bin/sh

./bin/mongod --config ./27017.conf

$ cat run27018
#!/bin/sh

./bin/mongod --config ./27018.conf

もちろん事前に、./data/27017/、./piddir/27017.pid、、./log/27017.logを作っておく必要があります(mkdirとtouchを使ってください)。

という訳で無事解決したので良かったです^^
MongoDBのせいにしてすみませんでしたorz馬鹿は私でした。

Bookmark the permalink.

Comments are closed.