読者です 読者をやめる 読者になる 読者になる

mongosのキャッシュクリア

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

参考
flushRouterConfig command - MongoDB