MongoDBでゆるふわDB体験

第5回 MongoDBのシャーディングを試してみよう

この記事を読むのに必要な時間:およそ 3 分

シャーディングを試してみる(前半)

このページと次のページでは,実際にシャーディング構成を作ってみます。

今回は,1台の物理マシンにポートを分けて5つのサーバを立ち上げます。具体的にはconfigサーバ,mongosサーバ,および3つのシャード(node0,node1,node2)です。3つのmongodがそれぞれ別のシャードになります図2参照⁠⁠。

図2 シャーディング構成図

図2 シャーディング構成図

システムを構成するサーバの準備

ディレクトリ作成

まずデータディレクトリとログディレクトリを作成します。手順はすべてMongoDBを展開したディレクトリで行うことを想定しています。

$ cd (MongoDBの展開ディレクトリ)
$ mkdir -p data/config
$ mkdir data/node0
$ mkdir data/node1
$ mkdir data/node2
$ mkdir log
シャードの起動
$ bin/mongod --shardsvr --port 30000 --dbpath data/node0 --logpath log/node0.log --fork   
$ bin/mongod --shardsvr --port 30001 --dbpath data/node1 --logpath log/node1.log --fork   
$ bin/mongod --shardsvr --port 30002 --dbpath data/node2 --logpath log/node2.log --fork

mongodコマンドに--shardsvrのオプションを指定することにより,このmongodがシャードになります。

configサーバ起動
$ bin/mongod --configsvr --port 20001 --dbpath data/config --logpath log/config.log --fork

mongodコマンドに--configsvrのオプションを指定することにより,このmongodがconfigサーバになります。

mongosサーバ起動
$ bin/mongos --configdb localhost:20001 --port 20000 --logpath log/mongos.log --chunkSize 1 --fork

mongosコマンドによりmongosサーバを起動します(mongodではありません⁠⁠。--configdbにてconfigサーバを指定します。mongosサーバはメモリ上にのみ存在するプロセスであるため,dbpathを指定する必要はありません。chunkSizeはチャンクのサイズをしています。デフォルトでは64Mですが,今回はチャンクが分割される動作を確認したいため,小さい1MBに設定します。

確認

psコマンドで5つのプロセスが見えればOKです。

$ ps -ef | grep mongo
root 1221 ・・ bin/mongod --shardsvr --port 30000 --dbpath data/node0 --logpath log/node0.log
root 1235 ・・ bin/mongod --shardsvr --port 30001 --dbpath data/node1 --logpath log/node1.log
root 1236 ・・ bin/mongod --shardsvr --port 30002 --dbpath data/node2 --logpath log/node2.log
root 1239 ・・ bin/mongod --configsvr --port 20001 --dbpath data/config --logpath log/config.log
root 1241 ・・ bin/mongos --configdb localhost:20001 --port 20000 --logpath log/mongos.log --chunkSize 1

mongosサーバにシャードの追加

mongoシェルで,mongosサーバのadminデータベースに接続します

$ bin/mongo localhost:20000/admin

sh.addShardメソッドでシャードを追加していきます。

mongos> sh.addShard("localhost:30000")    // ←30000ポートのmongodを追加
{ "shardAdded" : "shard0000", "ok" : 1 }  // ←okの値が1であれば正常です

mongos>  sh.addShard("localhost:30001")   // ←30001ポートのmongodを追加
{ "shardAdded" : "shard0001", "ok" : 1 }  // ←okの値が1であれば正常です

mongos> sh.addShard("localhost:30002")    // ←30002ポートのmongodを追加
{ "shardAdded" : "shard0002", "ok" : 1 }  // ←okの値が1であれば正常です

「sh」というオブジェクトにはシャーディングの設定を簡単にするためのメソッドがあります。sh.help()を実行することにより使い方のヘルプを見ることができます。

sh.statusメソッドで追加したシャードが正しく追加されているかどうか確認します。

mongos> sh.status()
--- Sharding Status ---
  sharding version: { "_id" : 1, "version" : 3 }
  shards:
        {  "_id" : "shard0000",  "host" : "localhost:30000" } // ←3つのmongodが追加されている
        {  "_id" : "shard0001",  "host" : "localhost:30001" }
        {  "_id" : "shard0002",  "host" : "localhost:30002" }
  databases:
        {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }

データの投入

続いて,mongosサーバ経由でデータを投入してみます。

mongosサーバに接続している状態で,logdbというデータベースを作ります。

mongos> use logdb
switched to db logdb

続いて,logsというコレクションに10万件データを投入します。mongoシェルではjavascriptの文法が使えるため,forループによりデータを挿入しています。

mongos> for(var i=1; i<=100000; i++) db.logs.insert({"uid":i, "value":Math.floor(Math.random()*100000+1)})      
mongos> db.logs.count()
100000                   // ←10万件挿入されている

最後にuidにインデックスを張ります。理由は,これからこのコレクションをシャード化する場合,シャードキーに対応するインデックスを作成しておく必要があるためです。

mongos> db.logs.ensureIndex( { uid : 1 } );

この時点ではまだシャーディングは有効になっていません。単純に最初のノードに10万件のデータが入っているだけです図3参照⁠⁠。

図3 シャーディング有効前のイメージ図

図3 シャーディング有効前のイメージ図

この状態を確認するには,mongoシェルにてmongosサーバのconfigデータベースの中身を見ればわかります。configデータベースのchunksコレクションにクエリをかけてみましょう。

mongos> use config
switched to db config
mongos> db.chunks.count()    // ←チャンクの数を表示
0                            // ←0であることがわかる

著者プロフィール

藤崎祥見(ふじさきしょうけん)

野村総合研究所 OpenStandia所属。オープンソースのR&Dとセミナー講師を担当。

Debian,Ubuntu,Liferayのコミュニティで活動した後,MongoDBの翻訳に関わり,丸の内MongoDB勉強会を始める。

実家がお寺で,住職の資格を所持する坊主系エンジニア。

Twitter:@syokenz


渡部徹太郎(わたなべてつたろう)

野村総合研究所 OpenStandia所属。オープンソースを使ったSIやサポートの業務に従事。

藤崎と共同で丸の内MongoDB勉強会を始める。

趣味は自宅サーバ。好きなものはLinuxとRuby。

Twitter:@fetarodc


林田敦(はやしだあつし)

野村総合研究所 OpenStandia所属。オープンソースを使ったSIや製品開発業務に従事。

丸の内MongoDB勉強会では広報兼雑用係を務める。

趣味はレザークラフト,ダイビング,スキー,キャンプ,ジェットスキー,カメラ等々。作って滑って撮って潜れるエンジニア。

Facebook:Atsushi Hayashida