質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

負荷分散

負荷分散とは、並列に運用されている機器間でできる限り負担が均等になるように、処理を分散し割り当てることです。 負荷分散は専用機器の使用、DNSサーバの設定、サーバに負荷分散ソフトウェアを導入することで実現できます。

Q&A

解決済

1回答

2425閲覧

Node.js+MongoDBのシャーディングにて負荷が分散されません

ako

総合スコア15

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

負荷分散

負荷分散とは、並列に運用されている機器間でできる限り負担が均等になるように、処理を分散し割り当てることです。 負荷分散は専用機器の使用、DNSサーバの設定、サーバに負荷分散ソフトウェアを導入することで実現できます。

0グッド

0クリップ

投稿2016/08/18 07:53

編集2016/08/18 08:28

###前提・実現したいこと
シャーディング+レプリカセットで構築された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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

var userSchema = new Schema({name: String}, {shardKey: {_id: 1}, read: "secondaryPreferred"});
このような記述にすることで解決しました。

投稿2016/08/18 14:22

ako

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問