ユーザ用ツール

サイト用ツール


mongodb:cluster

mongoDB cluster

mongoDBはレプリカセットとシャーディング機能をサポートしている。レプリカセットはDBの複製を作成し、自動フェイルオーバーによってサーバが落ちたとき接続先をレプリケーションサーバに切り替えることで可用性を確保できる機能。シャーディングはコレクションを分割して複数のDBに分散して保存することで同時読み込み、書き込み機能を向上させてスケールアウトする機能。

シャーディング

mongod、mongoc、mongosの3種類のサーバプロセスがある。これらのプロセスは本来はそれぞれ別のサーバマシン上で立ち上げるものである。ここでは全てのプロセスをローカルで起動させる。

mongod

データを格納するshardサーバ。

shardsvrオプションにtureを指定する。他は通常のmongodと同じように設定する。

port = 27001
logpath = /var/log/mongod_1.log
pidfilepath = /command/var/run/mongod_1.pid
logappend = true
fork = true
dbpath = /var/data/mongod_1
rest = true
shardsvr = true
port = 27002
logpath = /var/log/mongod_2.log
pidfilepath = /command/var/run/mongod_2.pid
logappend = true
fork = true
dbpath = /var/data/mongod_2
rest = true
shardsvr = true
port = 27003
logpath = /var/log/mongod_3.log
pidfilepath = /command/var/run/mongod_3.pid
logappend = true
fork = true
dbpath = /var/data/mongod_3
rest = true
shardsvr = true

起動する。

$ mongod --config=/etc/mongod_1.conf
$ mongod --config=/etc/mongod_2.conf
$ mongod --config=/etc/mongod_3.conf

mongoc

正式名称はconfig serverだが、日本のユーザの間ではmongocと呼ばれることが多い。クラスタの情報を管理するサーバで、これが停止するとクラスタ全体が停止してしまう。テストなので1プロセスしか立ち上げないが、実運用では単一障害点にならないように物理的に分けた3台のサーバでプロセスを立ち上げて冗長化する。

configsvrオプションにtrueを指定すると、config serverとして起動される。それ以外はmongodと同じ。

port = 27020
logpath = /var/log/mongoc.log
pidfilepath = /var/run/mongoc.pid
logappend = true
fork = true
dbpath = /var/data/mongoc
rest = true
configsvr = true

mongodコマンドで起動。

$ mongod --config=/etc/mongoc.conf

mongos

mognosルータ。アプリから接続されるプロセスでクラスタをアプリから隠蔽する。本番環境ではアプリケーションサーバ上にプロセスを立てて運用されることが多い。

configdbにmongocのhost、portを指定する(複数台構成の場合はカンマ区切りで)。アプリからの接続先になるのでportはmongoDBのデフォルトを指定するのが良い。

port = 27017
logpath = /var/log/mongos.log
pidfilepath = /var/run/mongos.pid
logappend = true
fork = true
configdb = 127.0.0.1:27020
# configdb = "127.0.0.1:27020"   mongoDB 2.2ではダブルクオートで囲むとエラーになるので注意

起動は mongos コマンドで

$ mongos --config=/etc/mongos.conf

シャーディングの設定

各プロセス起動後、クラスタの設定を行う。

mongosでadmin dbに接続して

$ mongo admin

mongodをシャードサーバとしてクラスタに追加する

mongos> db.runCommand({addshard:"127.0.0.1:27001", name:"ShardHogeDB01" , allowLocal:true});
mongos> db.runCommand({addshard:"127.0.0.1:27002", name:"ShardHogeDB02" , allowLocal:true});
mongos> db.runCommand({addshard:"127.0.0.1:27003", name:"ShardHogeDB03" , allowLocal:true});

dbにシャーディングを設定

mongos> db.runCommand({enablesharding:"hogeDB"});

コレクションにシャーディングを設定

mongos> db.runCommand({shardcollection:"hogeDB.fugaCollection", key:{ _id :1 }});

シャーディングの設定は以下のコマンドで表示できるが、正直読みにくい

mongos> db.printShardingStatus(); 

トラブルシューティング

"error creating initial database config information :: caused by :: can't find a shard to put new db on",

mongodがクラスタに1つも存在していない。1つ以上のmongodをクラスタに追加する

flushRouterConfig

mongosにキャッシュされているクラスタ情報をクリアします

db.adminCommand("flushRouterConfig")
mongodb/cluster.txt · 最終更新: 2015/03/16 09:08 by nullpon