ReplicaSetは冗長化・ミラーリング、Shardingはストライピング風の役割で、スケールアップするためにはRaid10を構成するように拡張していくことになります。
さて、まず作るのはReplicaSetのほうになりますが、デフォルト(?)ではSlave側に接続してもgetは許可されません。
セッションごとに明示的に指定し、クライアント側で制御すればよいのでした。
Slaveへのgetが許可されていないことを確認
Slaveに接続し、Masterでないことを確認します。
> db.isMaster()
{
"setName" : "testset",
"ismaster" : false,
"secondary" : true,
-- snip --
}
この状態ではgetが利きません、"not master" ですって。
> use sawatest
switched to db sawatest
> db.getCollectionNames()
uncaught exception: error: { "$err" : "not master", "code" : 10107 }
Slaveでのgetを許可する
db.getMongo().setSlaveOk()を発行すれば、そのセッション内では読み出しOKになります。rs.slaveOk()でも代用可能です。
> db.getMongo().setSlaveOk()
今度はGetできます。
> db.getCollectionNames()
[ "system.indexes", "things" ]
mongoのShell以外では?
たとえばRubyドライバから同じことをしようと思ったら、Replica Sets in Ruby にあるように「:read_secondary => true」 を設定すればOKと。
セカンダリなんだかスレーブなんだか
しかし"secondary" : true のDBに対して発行する命令は"setSlaveOk()"なので、セカンダリなのかスレーブなのか微妙に困る。
Secondaryなのは他のReplica方式の名残として、ReplicaSetではMasterがいるからSlaveなんだろうけどもね。
0 件のコメント:
コメントを投稿