[MongoDB学習ノート3]MongoDBスライス
6765 ワード
MongoDBのレプリカセット(Replica Set)は、データのバックアップやデータの信頼性の問題を解決する一方で、データの読み書き性能も向上しています.MongoDBスライス(Sharding)はデータの拡張問題を解決し、MongoDBはクラウドコンピューティング時代の分散データベースとして、大容量データストレージ、効率的な同時データアクセス、自動フォールトトレランスなどがMongoDBの重要な指標である.
本編ではMongoDBのスライス(Sharding)についてご紹介します
1)データ量が非常に多く、単一ディスクではSNSデータなどの記憶ができない
2)シングルサーバでは、同時書き込みのパフォーマンス要件を満たすことができません(コピーセットでは1台のサーバしか許可されていません)
3)MongoDBはメモリデータベースとファイルデータベースであり、できるだけ読み書き操作を向上させるには、できるだけ多くのデータをメモリに保存することが望ましい.
1)構成サーバの作成
2)ルーティングサーバを作成し,作成時にリンクを指定する必要があるコンフィギュレーションサーバ,すなわちルータがコンフィギュレーションサーバにリンクする必要がある.
3)2台以上のスライスサーバ(Mongoインスタンスの実行)を作成し、ここでは2台のサーバ27010と27011を使用する
4)ルーティングサーバに対して、複数のクラスタにスライスを追加するコマンドを実行する(27021027011)
3.1構成サーバーの作成
構成サーバーの起動:mongod--config configServer.conf
3.2ルーティングサーバの作成
ルーティングサーバーの起動:mongos--config router.conf
3.3 2台のスライスサーバの構成
3.4パッチサーバとルーティングサーバの関連付け
1)構成サーバ、ルーティングサーバ、および2台のスライスサーバの起動
2)ルーティングサーバにリンクされたJavascript Shellコマンドライン端末mongo 127.0.0.1:28001/adminを開く
3)コマンドライン端末でコマンドを実行し,2台のサーバをクラスタに組み込む.
成功すると結果が表示されます:{"shardAdded":"shard 0000","ok":1}および{"shardAdded":"shard 0001","ok":1}
dbを実行する.runCommandの前に、use adminなどのデータベース操作文はできません.
4)データベースfoolbarのスライス機能を開く(スライスサーバにfoolbarデータベースが作成されていないので、後で作成する)
5)データベースセットのスライス機能を開く(mongodyデフォルトのスライスアルゴリズムを用いてkeyに従ってスライスする)
6)上記の手順を完了すると、スライスクラスタの確立が完了する
4.1ルーティングサーバ用Javascript Shellクライアントでfoolbarデータベースuse foolbarに切り替える
4.2 Javascriptメソッドを定義し、10000個のドキュメントをループします.(add()関数を作成するには、コマンドラインで次の文を実行し、add()関数を実行してデータの挿入を完了します.)
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
次のコマンドを実行します.
1台目と2台目のデータ分布状況
本編では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)