2012年4月9日月曜日

MongoDB(5) シャーディング

今日はMongoDBのシャーディングをやってみよう。

shardingとは: Shard(database_architecture)
mongoのシャーディング: Sharding

はじめにデータベース起動(とりあえず3つ)
mongod --dbpath=d:\xampp\mongodb\data\shard1 --port 28017
mongod --dbpath=d:\xampp\mongodb\data\shard2 --port 28018
mongod --dbpath=d:\xampp\mongodb\data\shard3 --port 28019


コンフィグサーバ起動
mongod --configsvr --port 28099 --dbpath=d:\xampp\mongodb\data\config


ルーティングプロセス起動

(デフォルトチャンクサイズは200MBだけど、テストのために3MBに指定)
mongos --configdb localhost:28099 --port 28100 --chunkSize 3


ここまでで、サーバ群起動完了。
次に、shardingの設定をする。


mongo起動、adminデータベースに接続
D:\xampp\mongodb\bin>mongo localhost:28100/admin
MongoDB shell version: 2.0.3
connecting to: localhost:28100/admin


shardサーバ追加
mongos> db.runCommand({addshard:"localhost:28017"});
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> db.runCommand({addshard:"localhost:28018"});
{ "shardAdded" : "shard0001", "ok" : 1 }
mongos> db.runCommand({addshard:"localhost:28019"});
{ "shardAdded" : "shard0002", "ok" : 1 }


ステータス確認
mongos> db.rintShardingStatus();
--- Sharding Status ---
  sharding version: { "_id" : 1, "version" : 3 }
  shards:
        {  "_id" : "shard0000",  "host" : "localhost:28017" }
        {  "_id" : "shard0001",  "host" : "localhost:28018" }
        {  "_id" : "shard0002",  "host" : "localhost:28019" }
  databases:
        {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }

mongos>



shardキーを指定
mongos> db.runCommand({shardcollection:"test.test",key:{userid:1}});
{ "ok" : 0, "errmsg" : "sharding not enabled for db" }


おこられた(><)

データベースにsharding許可を指示
mongos> db.runCommand({enablesharding:"test"});
{ "ok" : 1 }



再度挑戦
mongos> db.runCommand({shardcollection:"test.test",key:{userid:1}});
{ "collectionsharded" : "testdb.test", "ok" : 1 }

ていうか、これ、コレクション単位でshardできるのか。すごい柔軟。



ルーティングサーバに接続して、テストデータ投入。
D:\xampp\mongodb\bin>mongo localhost:28100
MongoDB shell version: 2.0.3
connecting to: localhost:28100/test
mongos>



100万件くらい、いれればいいかな。
mongos> for(var i =0; i<1000000; i++) {
... var doc = {userid:i, name:"user"+i};
... db.test.save(doc);
... }


状況確認
mongos> db.runCommand({addshard:"localhost:28017"});db.printShardingStatus();
--- Sharding Status ---
  sharding version: { "_id" : 1, "version" : 3 }
  shards:
        {  "_id" : "shard0000",  "host" : "localhost:28017" }
        {  "_id" : "shard0001",  "host" : "localhost:28018" }
        {  "_id" : "shard0002",  "host" : "localhost:28019" }
  databases:
        {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
        {  "_id" : "testdb",  "partitioned" : true,  "primary" : "shard0000" }
        {  "_id" : "test",  "partitioned" : true,  "primary" : "shard0000" }
                test.test chunks:
                                shard0000       8
                                shard0001       7
                                shard0002       14
                        too many chunks to print, use verbose if you want to force print


状況確認2
mongos> db.test.count();
1000000


100万件はいってる。


接続先を個別のデータベースに変えて確認
D:\xampp\mongodb\bin>mongo localhost:28017
MongoDB shell version: 2.0.4
connecting to: localhost:28017/test
> db.test.count();
162515

D:\xampp\mongodb\bin>mongo localhost:28018
MongoDB shell version: 2.0.4
connecting to: localhost:28018/test
> db.test.count();
171400

D:\xampp\mongodb\bin>mongo localhost:28019
MongoDB shell version: 2.0.4
connecting to: localhost:28019/test
> db.test.count();
666085

合計100万件はいってる。ナイス。

というわけで、MongoDB編おしまい。

かねこ( ;∀;)