今回は「MongoDB の レプリカセットにNode.jsドライバを使ってアクセスする方法」についてまとめます。
接続する
MongoDBのレプリカセットも接続さえできてしまえばほぼ終わりです。 ここではその基本となる接続文字列、読み込み設定、書き込み設定についてまとめます。
Node.jsドライバーでMongoDBへ接続する場合、 MongoClient.connect() を利用するので、その引数にどのような値を与えるとよいか、が要です。
接続文字列 (url)
ここでは MongoClient.connect() の第1引数に指定する接続文字列の設定方法についてみていきます。
MongoDBの接続文字列は以下のような構成になっています。
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
基本は host1, host2, ... というように接続先ホスト名を列挙して指定します。
また、 options としてレプリカセット ?replicaSet=<レプリカセット名> を指定します。
もし、レプリカセットが認証を有効にしているのであれば username 、 password および database を指定します。
例えば、レプリカセットメンバーが 127.0.0.1:8001 、 127.0.0.1:8002 、 127.0.0.1:8003 で、 レプリカセット名が rs0 、 認証が有効でユーザー名/パスワードが test/test で、 認証先データベースが test 出会った場合、以下のようなURLになります。
mongodb://test:test@127.0.0.1:8001,127.0.0.1:8002,127.0.0.1:8003/test?replicaSet=rs0
読み込み設定 (options)
MongoClient.connect() の第2引数 options のうち、レプリカセットの読み込みに関するオプションを見ていきます。
関係するのは readPreference の1つのみです。
readPreference
Read Preference 設定では、どのサーバーから優先的にデータ読み込みするかを設定します。 設定できる値は以下のような5種類です。
| 設定値 | 説明 |
|---|---|
| PRIMARY | デフォルトモード。プライマリサーバーから取得します。 |
| PRIMARY_PREFERRED | ほとんどの場合はプライマリサーバーから取得しますが、プライマリサーバーにアクセスできない場合はセカンダリサーバーから取得します。 |
| SECONDARY | セカンダリサーバーから取得します。 |
| SECONDARY_PREFERRED | ほとんどの場合はセカンダリサーバーから取得しますが、セカンダリサーバーにアクセスできない場合はプライマリサーバーから取得します。 |
| NEAREST | レプリカセットの種類に関わらず、レイテンシーが最小のサーバーから取得します。 |
書き込み設定
MongoClient.connect() の第2引数 options のうち、レプリカセットの書き込みに関するオプションを見ていきます。
関係するのは w 、 j 、 wtimeoutの3つです。
w
w オプションでは 何台目まで書き込みを保証するか を設定します。
| 設定値 | 説明 |
|---|---|
| <number> | 指定した台数まで書き込まれることを保証します。 |
| "majority" | 投票権のあるサーバーの過半数に書き込まれることを保証します。 |
j
ジャーナルへの書き込みまで保証するかどうかを設定します。
| 設定値 | 説明 |
|---|---|
| true | ディスクへの書き込みまで行います。 |
| false | デフォルト。メモリ上への書き込みのみを保証します。 |
wtimeout
書き込み応答のタイムアウト設定です。 指定した時間内に応答がなければ書き込み失敗と判断して後続の処理を続けられるようにします。
| 設定値 | 説明 |
|---|---|
| <number> | 書き込みをタイムアウトにする時間(ミリ秒)を指定します。 設定する場合は1より大きな値を指定します。 0を指定した場合、タイムアウト処理を行いません。 |
読み書きする
実際に上記設定を用いてレプリカセットへ書き込みを行うコードを載せます。 タイトルは「読み書き」と書いていますが接続できれば関係ないのでここでは「書き込み」のサンプルコードを掲載します。
index.js
var { MongoClient, ReadPreference } = require("mongodb");
var usr = "test";
var pwd = "test";
var authDb = "test";
var hosts = [
"127.0.0.1:8001",
"127.0.0.1:8002",
"127.0.0.1:8003"
];
var URL = `mongodb://${usr}:${pwd}@${hosts.join(",")}/${authDb}?replicaSet=rs0`;
var options = {
w: "majority",
wtimeout: 3000,
j: true,
readPreference: ReadPreference.NEAREST
};
MongoClient.connect(URL, options, (err, client) => {
if (err) {
console.log(err);
return;
}
var db = client.db("test");
db.collection("orders").insertMany([
{ datetime: "2018-01-12", item: "apple", quantity: 8 },
{ datetime: "2018-01-12", item: "grapefruit", quantity: 3 },
{ datetime: "2018-01-13", item: "strawberry", quantity: 4 },
{ datetime: "2018-01-14", item: "orange", quantity: 8 },
{ datetime: "2018-01-15", item: "apple", quantity: 6 },
{ datetime: "2018-01-15", item: "grapefruit", quantity: 5 },
{ datetime: "2018-01-17", item: "pear", quantity: 2 },
{ datetime: "2018-01-17", item: "apple", quantity: 9 },
{ datetime: "2018-01-20", item: "orange", quantity: 10 },
{ datetime: "2018-01-21", item: "strawberry", quantity: 2 },
{ datetime: "2018-01-21", item: "banana", quantity: 3 },
{ datetime: "2018-01-22", item: "strawberry", quantity: 2 }
]).then((docs) => {
console.log(docs);
}).catch((err) => {
console.log(err);
}).then(() => {
client.close();
});
});
今回は「MongoDB の レプリカセットにNode.jsドライバを使ってアクセスする方法」についてまとめました。 ポイントは以下の通りです。
- 接続先ホストは列挙する
- MongoClient.connect() で接続設定
参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!
参考記事
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!