Mongoose でセカンダリにアクセス可能な接続を設定をするには

MongoDB でレプリケーションセットを構成する。MongoDBでは Secondary サーバへのアクセスを読み取りであってもデフォルトで拒否するようになっている。
このためには接続ごとに slaveOk フラグを立てる必要があるが、そのときの Mongoose の設定に手間取ったのでメモしておく。

(2013/1/18 に、レプリケーション設定に誤りがあったため以降の内容を修正しています。)

オプション設定

mongoose の connection を生成する方法は色々とありますが、createConnection メソッドを使っています。
createConnection の第2引数のオプションには、それぞれ以下のキーで設定を構成できます。

接続を生成する関数例

以下、sampledb というデータベースに localhost で 27017 と 27018 ポートで動いている二つの MongoDB サーバに接続するときのサンプルです。レプリケーションセット名は「myrepl」で、コネクションプールもデフォルトの 5 から 10 に増やしています。

const DB_HOST = "localhost:27017";
const DB_NAME = "sampledb";
const DB_REPLSET_NAME = "myrepl";
const DB_REPLSET_MEMBERS = "localhost:27017,localhost:27018"

var mongoose = require('mongoose');

var mongooseConnection = (function(){
  var uri;
  var opts = {
      server: { poolSize: 10, auto_reconnect: true }
  };

  if (DB_REPLSET_NAME && DB_REPLSET_MEMBERS) {
    var rsmembers = DB_REPLSET_MEMBERS.split(',');

    var svs = [];
    rsmembers.forEach(function(sv){
      svs.push("mongodb://" + sv + "/" + DB_NAME);
    });
    uri = svs.join(",");

    opts.replset = { rs_name: DB_REPLSET_NAME, readPreference: 'primaryPreferred' };
  } else {
    opts.db = { slave_ok: true };
    uri = 'mongodb://' + DB_HOST + '/' + DB_NAME;
  }

  return mongoose.createConnection(uri, opts);
})();

※DB_REPLSET_NAME, DB_REPLSET_MEMBERS が設定されていればレプリケーション設定になります。