Node.js+pm2+Mongoose+MongoDB環境で’no valid seed servers in list’

MongoDBセカンダリノードがオートフェイルバックしない

HAProxyで負荷分散構成にしたアプリケーションサーバー群(Node.jsをpm2でデーモン化)からMongoose経由でMongoDBレプリケーション環境に接続しているのですが、先日にMongoDBセカンダリの幾つかのノードが疎通できない障害が起きました。

MongoDBレプリケーション環境のためダウンしたノードは自動的に接続先から外され、アプリケーションサーバーのDB接続は問題が起きませんでした。その後、疎通できなかったノード群がオートフェルバックしたのですが、なぜか一部のアプリケーションサーバーのノードだけがオートフェイルバックしたMongoDBに自動的に接続に行かず、生きたままだった状態のノードにのみ接続する状況が続きました。

なぜだろう…と3日間ほど原因調査をしていました。

no valid seed servers in list

オートフェイルバックしたMongoDBセカンダリノードに接続にいかない特定のアプリケーションサーバーを調べていたら、pm2のログに以下のエラーが出力されていました。

{ [MongoError: no valid seed servers in list] name: 'MongoError', message: 'no valid seed servers in list' }

有効なシードサーバーがない?ちょっとエラーの発生状況が掴みきれていなかったのですが、Stack OverFlowを見たらファイルディスクリプタの上限値を上げることによってこの問題を解決できたとする報告が出ていました(Node.js MongoDB on Ubuntu: no valid seed servers in list

ファイルディスクリプタの上限値を緩和へ

ulimit -aでアプリケーションサーバーのファイルディスクリプタの上限値を確認したところ、1024になっていました。これはだいぶ控え目な値なので、エラー解決が可能かどうかトライするために2048に設定しました。

sudo vim /etc/security/limits.conf
 
root soft nofile 2048
root hard nofile 2048

ファイルディスクリプタの上限値を2048まで緩和してから対象アプリケーションサーバーノードをリスタート。これで問題解決ができたか、しばらく経過観察しようと思います。

MongoDBレプリケーションがエラーになった時に、特定のアプリケーションサーバーでファイルオープンの数がかなり増えてしまったのかな。障害時にpm2が掴んでいたファイルオープンの数を調査しておけば良かったです。