mongodb で複数シャードを立ち上げる。
前回まで
前回は、シャードを2つ登録し、10万件のドキュメントを登録した。ドキュメントは全てshard0000に登録された。
データを確認する。
> db.emails.count(); 100000
モデル的にはユーザー:10 の受信箱には 4000件のメールがあり、送信箱に1000件のメールがある状態。
> db.emails.find({to:10}).count(); 4000 > db.emails.find({from:10}).count(); 1000
ユーザー:10が最後に受信したメールはこうやって得る。
> db.emails.find({to:10}).sort({id:-1}).limit(1); { "_id" : ObjectId("4d651216ba6e0000000322df"), "id" : 99908, "from" : 9, "to" : [ 10, 11, 12, 13 ], "subject" : "subject99908", "body" : "body99908" } >
Chunkの分割と移動
普通はchunkの分割は自動で行われます。現状では、分割はinsertingに関して副作用を持っています。将来的にchunkの自動分割は他の事例にも適用される予定です。(Chunkの分割は透過的です)
Chunkの分割
普通は自動だそうだが、手動でやってみる。
> use admin switched to db admin > db.runCommand( { moveChunk : "test.emails" , find : { id : 50000 } , to : "shard0001" } ) { "millis" : 11762, "ok" : 1 } >
確認
> db.printShardingStatus() --- Sharding Status --- sharding version: { "_id" : 1, "version" : 3 } shards: { "_id" : "shard0000", "host" : "localhost:27101" } { "_id" : "shard0001", "host" : "localhost:27102" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "test", "partitioned" : true, "primary" : "shard0000" } test.emails chunks: { "id" : { $minKey : 1 } } -->> { "id" : { $maxKey : 1 } } on : shard0001 { "t" : 2000, "i" : 0 } { "_id" : "local", "partitioned" : false, "primary" : "shard0001" } >
これだと、minKey から maxKey まで shard0001 へ移動してしまっている。ああ、moveChunk は移動だ。分割はsplitだ。
> db.runCommand( { split : "test.emails" , middle : { id : 50000 } } ); { "ok" : 1 } > db.printShardingStatus() --- Sharding Status --- sharding version: { "_id" : 1, "version" : 3 } shards: { "_id" : "shard0000", "host" : "localhost:27101" } { "_id" : "shard0001", "host" : "localhost:27102" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "test", "partitioned" : true, "primary" : "shard0000" } test.emails chunks: { "id" : { $minKey : 1 } } -->> { "id" : 50000 } on : sh ard0001 { "t" : 2000, "i" : 1 } { "id" : 50000 } -->> { "id" : { $maxKey : 1 } } on : sh ard0001 { "t" : 2000, "i" : 2 } { "_id" : "local", "partitioned" : false, "primary" : "shard0001" } >
50000でchunkが割れたので、最初のchunkをshard0000へ移動する。
> db.runCommand( { moveChunk : "test.emails" , find : { id : 1 } , to : "shard0000" } ) { "millis" : 6456, "ok" : 1 } > db.printShardingStatus() --- Sharding Status --- sharding version: { "_id" : 1, "version" : 3 } shards: { "_id" : "shard0000", "host" : "localhost:27101" } { "_id" : "shard0001", "host" : "localhost:27102" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "test", "partitioned" : true, "primary" : "shard0000" } test.emails chunks: { "id" : { $minKey : 1 } } -->> { "id" : 50000 } on : sh ard0000 { "t" : 3000, "i" : 0 } { "id" : 50000 } -->> { "id" : { $maxKey : 1 } } on : sh ard0001 { "t" : 3000, "i" : 1 } { "_id" : "local", "partitioned" : false, "primary" : "shard0001" } >
1つ目のチャンクがshard0000、2つ目のチャンクがshard0001になっている。
データ確認
localhost:27104(mongos) で確認
C:\> \mongo\bin\mongo localhost:27104/test MongoDB shell version: 1.6.5 connecting to: localhost:27104/test > db.emails.count(); 100000 > db.emails.find({to:10}).count(); 4000 > db.emails.find({from:10}).count(); 1000 > db.emails.find({to:10}).sort({id:-1}).limit(1); { "_id" : ObjectId("4d651216ba6e0000000322df"), "id" : 99908, "from" : 9, "to" : [ 10, 11, 12, 13 ], "subject" : "subject99908", "body" : "body99908" } >
localhost:27101(shard0000) で確認
C:\> \mongo\bin\mongo localhost:27101/test MongoDB shell version: 1.6.5 connecting to: localhost:27101/test > db.emails.count(); 50000 > db.emails.find({to:10}).count(); 2000 > db.emails.find({from:10}).count(); 500 > db.emails.find({to:10}).sort({id:-1}).limit(1); { "_id" : ObjectId("4d65120bba6e000000025f8f"), "id" : 49908, "from" : 9, "to" : [ 10, 11, 12, 13 ], "subject" : "subject49908", "body" : "body49908" } >
localhost:27102(shard0001) で確認
C:\> \mongo\bin\mongo localhost:27102/test MongoDB shell version: 1.6.5 connecting to: localhost:27102/test > db.emails.count(); 50000 > db.emails.find({to:10}).count(); 2000 > db.emails.find({from:10}).count(); 500 > db.emails.find({to:10}).sort({id:-1}).limit(1); { "_id" : ObjectId("4d651216ba6e0000000322df"), "id" : 99908, "from" : 9, "to" : [ 10, 11, 12, 13 ], "subject" : "subject99908", "body" : "body99908" } >
おお、localhost:27104(mongos)でshard0000とshard0001をあわせた結果が取得できている。