[MongoDB学習ノート3]MongoDBスライス

6765 ワード

MongoDBのレプリカセット(Replica Set)は、データのバックアップやデータの信頼性の問題を解決する一方で、データの読み書き性能も向上しています.MongoDBスライス(Sharding)はデータの拡張問題を解決し、MongoDBはクラウドコンピューティング時代の分散データベースとして、大容量データストレージ、効率的な同時データアクセス、自動フォールトトレランスなどがMongoDBの重要な指標である.
本編ではMongoDBのスライス(Sharding)についてご紹介します
 

1.スライスが必要なタイミング


1)データ量が非常に多く、単一ディスクではSNSデータなどの記憶ができない
2)シングルサーバでは、同時書き込みのパフォーマンス要件を満たすことができません(コピーセットでは1台のサーバしか許可されていません)
3)MongoDBはメモリデータベースとファイルデータベースであり、できるだけ読み書き操作を向上させるには、できるだけ多くのデータをメモリに保存することが望ましい.
 

2.スライスを作成するには


1)構成サーバの作成
2)ルーティングサーバを作成し,作成時にリンクを指定する必要があるコンフィギュレーションサーバ,すなわちルータがコンフィギュレーションサーバにリンクする必要がある.
3)2台以上のスライスサーバ(Mongoインスタンスの実行)を作成し、ここでは2台のサーバ27010と27011を使用する
4)ルーティングサーバに対して、複数のクラスタにスライスを追加するコマンドを実行する(27021027011)
db.runCommand({"addshard":"127.0.0.1:27010","allowLocal":true});
db.runCommand({"addshard":"127.0.0.1:27011","allowLocal":true});

 

3.スライスの作成


 
3.1構成サーバーの作成
 
dbpath=/home/tom/development/mongoshard/configServer
port=28000
bind_ip=127.0.0.1

 
構成サーバーの起動:mongod--config configServer.conf
3.2ルーティングサーバの作成
   
port=28001
configdb=127.0.0.1:28000

   
ルーティングサーバーの起動:mongos--config router.conf
   
3.3 2台のスライスサーバの構成
 
   
dbpath=/home/tom/development/mongoshard/shard1
bind_ip=127.0.0.1
port=27010

 
dbpath=/home/tom/development/mongoshard/shard2
bind_ip=127.0.0.1
port=27011

   
3.4パッチサーバとルーティングサーバの関連付け
1)構成サーバ、ルーティングサーバ、および2台のスライスサーバの起動
2)ルーティングサーバにリンクされたJavascript Shellコマンドライン端末mongo 127.0.0.1:28001/adminを開く
3)コマンドライン端末でコマンドを実行し,2台のサーバをクラスタに組み込む.
 
db.runCommand({"addshard":"127.0.0.1:27010","allowLocal":true});
db.runCommand({"addshard":"127.0.0.1:27011","allowLocal":true});

成功すると結果が表示されます:{"shardAdded":"shard 0000","ok":1}および{"shardAdded":"shard 0001","ok":1}
 
dbを実行する.runCommandの前に、use adminなどのデータベース操作文はできません.
 
4)データベースfoolbarのスライス機能を開く(スライスサーバにfoolbarデータベースが作成されていないので、後で作成する)
   
db.runCommand({"enablesharding":"foolbar"});

 
5)データベースセットのスライス機能を開く(mongodyデフォルトのスライスアルゴリズムを用いてkeyに従ってスライスする)
  
db.runCommand({"shardcollection":"foolbar.persons","key":{"_id":1}});

 
6)上記の手順を完了すると、スライスクラスタの確立が完了する
 

4.スライステスト


4.1ルーティングサーバ用Javascript Shellクライアントでfoolbarデータベースuse foolbarに切り替える
 
4.2 Javascriptメソッドを定義し、10000個のドキュメントをループします.(add()関数を作成するには、コマンドラインで次の文を実行し、add()関数を実行してデータの挿入を完了します.)
function add() {
    for (var i = 0; i< 10000; i++) {
        db.persons.insert({"name:":"tom"+i, "age": i});
    }
}

 
4.3データ挿入完了後、dbを呼び出す.persons.find().count()挿入されたデータバーの数を調べた結果,10000バーが表示された
 
4.4各スライスサーバ上のpersonsドキュメントの個数を確認する
 
4.4.1 10000件の文書のテスト結果
shard 1:mongo 127.0.0.1:27010/adminへのリンク
          use foolbar
         db.persons.find().count()
         >>>10000
 
shard 2:mongo 127.0.0.1:27011/adminにリンク
        use foolbar
        db.persons.find().count()
        >>>0
 
その結果、すべてのデータが最初のスライスに存在することは受け入れられず、データ量を増やすしかないことが明らかになった.
 
4.4.2 100000件の文書のテスト結果
ルーティングサーバへのリンク:mongo 127.0.0.1:2801/admin
次のコマンドを実行します.
function add() {
    for (var i = 0; i< 1000000; i++) {
        db.persons.insert({"name:":"tom"+i, "age": i});
    }
}

1台目と2台目のデータ分布状況
 
tom$ mongo 127.0.0.1:27010/admin
MongoDB shell version: 2.4.10
connecting to: 127.0.0.1:27010/admin
> use foolbar
switched to db foolbar
> db.persons.find().count();
640957
> exit

tom$ mongo 127.0.0.1:27011/admin
MongoDB shell version: 2.4.10
connecting to: 127.0.0.1:27011/admin
> use foolbar
switched to db foolbar
> db.persons.find().count();
369043
> exit

 
 
 

5.スライス状況を観察する


 
 
tom$ mongo 127.0.0.1:28001/admin
MongoDB shell version: 2.4.10
connecting to: 127.0.0.1:28001/admin
mongos> db.printShardingStatus();
--- Sharding Status --- 
  sharding version: {
	"_id" : 1,
	"version" : 3,
	"minCompatibleVersion" : 3,
	"currentVersion" : 4,
	"clusterId" : ObjectId("53e23314e0892adc5cc089bc")
}
  shards:
	{  "_id" : "shard0000",  "host" : "127.0.0.1:27010" }
	{  "_id" : "shard0001",  "host" : "127.0.0.1:27011" }
  databases:
	{  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
	{  "_id" : "foolbar",  "partitioned" : true,  "primary" : "shard0000" }
		foolbar.persons
			shard key: { "_id" : 1 }
			chunks:
				shard0000	3
				shard0001	3
			{ "_id" : { "$minKey" : 1 } } -->> { "_id" : ObjectId("53e24069e92ed4a015b75957") } on : shard0000 Timestamp(5, 0) 
			{ "_id" : ObjectId("53e24069e92ed4a015b75957") } -->> { "_id" : ObjectId("53e2446d1db30c2efea0b7d0") } on : shard0001 Timestamp(5, 1) 
			{ "_id" : ObjectId("53e2446d1db30c2efea0b7d0") } -->> { "_id" : ObjectId("53e244861db30c2efea5af7c") } on : shard0000 Timestamp(4, 1) 
			{ "_id" : ObjectId("53e244861db30c2efea5af7c") } -->> { "_id" : ObjectId("53e2449d1db30c2efeaa7f8d") } on : shard0000 Timestamp(3, 2) 
			{ "_id" : ObjectId("53e2449d1db30c2efeaa7f8d") } -->> { "_id" : ObjectId("53e244b51db30c2efeaf683b") } on : shard0001 Timestamp(4, 2) 
			{ "_id" : ObjectId("53e244b51db30c2efeaf683b") } -->> { "_id" : { "$maxKey" : 1 } } on : shard0001 Timestamp(4, 3)