###前提・実現したいこと
シャーディング+レプリカセットで構築されたMongoDBへNode.js(mongoose3.8利用)のプログラムからアクセスした際に、1つのサーバに負荷が集中しないようにしたいのですが、上手く行きません。
レプリカセット単体の時は、書き込みはプライマリDBに、読み込みはセカンダリDBに言っていたのですが、シャーディング使うと1台に読み書きが行ってしまいます。
解決方法をご存知のかた、ご教授頂きたく思います。
よろしくお願いします。
###発生している問題・エラーメッセージ
2つのレプリカセットを使ったシャーディングなのですが、プライマリシャードのプライマリDBだけの負荷が異常に上がってしまいます。
他の読み書きされるはずの3台のDBは、cpuのidleがほぼ99-100の状態です。
###該当のソースコード
Node.js
1var mongoose = require('mongoose'); 2var Schema = mongoose.Schema; 3var util = require('util'); 4var uri = 'mongodb://localhost:27017/test'; 5var options = { 6 "user": "test", 7 "pass": "test", 8 "replset": { 9 "readPreference": "secondaryPreferred" 10 } 11} 12 13mongoose.connect(uri, options); 14var userSchema = new Schema({name: String}, {shardKey: {_id: 1}}); 15var User = mongoose.model('User', userSchema); 16var testuser = new User({name: 'testuser'}); 17testuser.save(function (err, result) { 18 if (err) { 19 console.log(err); 20 } else { 21 User.findOne({_id: result._id}, function (err, entry) { 22 if (err) { 23 console.log(err); 24 } 25 console.log(util.inspect(entry)); 26 }); 27 } 28});
###試したこと
ReplicaSetでの読み書きの分散が上手く行った記述の仕方がこっちです。
Node.js
1var mongoose = require('mongoose'); 2var Schema = mongoose.Schema; 3var util = require('util'); 4var uri = 'mongodb://primarydb:27017,secondarydb:27017/test'; 5var options = { 6 "user": "test", 7 "pass": "test", 8 "replset": { 9 "rs_name": "test", 10 "readPreference": "secondaryPreferred" 11 } 12} 13 14mongoose.connect(uri, options); 15var userSchema = new Schema({name: String}); 16var User = mongoose.model('User', userSchema); 17var testuser = new User({name: 'testuser'}); 18testuser.save(function (err, result) { 19 if (err) { 20 console.log(err); 21 } else { 22 User.findOne({_id: result._id}, function (err, entry) { 23 if (err) { 24 console.log(err); 25 } 26 console.log(util.inspect(entry)); 27 }); 28 } 29});
###補足情報(言語/FW/ツール等のバージョンなど)
バージョン以下になります
Node.js v4.4.6
Mongodb v3.2.9
mongoose@3.8.40
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。