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")