Pages

2011/03/16

MongoDBのレプリカセットで、Slave(Secondary)からもget (Readの負荷分散)

MongoDBの負荷分散ではReadのためのReplicaSet、WriteのためのShardと2つの方式を取ることができます。

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 件のコメント:

コメントを投稿