MongoDBでマスタを入れるときに特定のShardに入れたいときがあります。例えば、マスタ系のデータはすべてShard1に寄せて、トランザクション系のデータはすべてのシャードに分けるとか。
そういう時には、
use admin; // testMaster3コレクションをShardCollectionに指定 db.adminCommand({"shardCollection":"blog.testMaster3",key:{"id":1}, unique:true}); // 初期データをshard0001に設定 db.runCommand({moveChunk : "blog.testMaster3", find : {id : {$minKey : 1} }, to : "shard0001"}); mongos> db.printShardingStatus() --- Sharding Status --- sharding version: { "_id" : 1, "version" : 3 } shards: { "_id" : "rs", "host" : "rs/localhost:27030,localhost:27032,localhost:27031" } { "_id" : "shard0000", "host" : "localhost:27040" } { "_id" : "shard0001", "host" : "localhost:27050" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "blog", "partitioned" : true, "primary" : "shard0000" } blog.testMaster3 chunks: shard0001 2 { "id" : { $minKey : 1 } } -->> { "id" : 1 } on : shard0001 { "t" : 2000, "i" : 1 } { "id" : 1 } -->> { "id" : { $maxKey : 1 } } on : shard0001 { "t" : 2000, "i" : 2 }
で、ここで大きな問題が。
複数のmongosから接続した時に、上記コマンドを打ったmongosからは参照できるのですが、別のmongosからは見えない問題が。statsを見ると、shardの設定がうまくみえて模様。ちなみに、mongosを再起動したら見えるようになったので、mongosがキャッシュしている模様。
mongos> db.testMaster3.stats() { "sharded" : true, "flags" : 1, "ns" : "blog.testMaster3", "count" : 100, "numExtents" : 1, "size" : 5204, "storageSize" : 8192, "totalIndexSize" : 16352, "indexSizes" : { "_id_" : 8176, "id_1" : 8176 }, "avgObjSize" : 52.04, "nindexes" : 2, "nchunks" : 2, "shards" : { "shard0001" : { "ns" : "blog.testMaster3", "count" : 100, "size" : 5204, "avgObjSize" : 52.04, "storageSize" : 8192, "numExtents" : 1, "nindexes" : 2, "lastExtentSize" : 8192, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 16352, "indexSizes" : { "_id_" : 8176, "id_1" : 8176 }, "ok" : 1 } }, "ok" : 1 } // 見えてないとき mongos> db.testMaster3.stats() { "sharded" : false, "primary" : "shard0000", "ns" : "blog.testMaster3", "count" : 0, "size" : 0, "storageSize" : 8192, "numExtents" : 1, "nindexes" : 2, "lastExtentSize" : 8192, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 16352, "indexSizes" : { "_id_" : 8176, "id_1" : 8176 }, "ok" : 1 }
ちなみに、再起動しなくても、以下のコマンドでクリアができました。でも、これをやるんだったらmongosを再起動するのと手間は同じだよな。普通、mongosからconfigサーバに見に行く時にわからないものなのか?
db.adminCommand("flushRouterConfig")
参考
MongoDB