2014年3月4日火曜日

mongodbのsharding機能を使ってみた

■環境
CentOS 5.10 64bit
MongoDB 2.9.4

■MongoDBインストール
vim /etc/yum.repos.d/10gen.repo
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=1
priority=1
yum clean all
yum -y install mongo-10gen mongo-10gen-server --disablerepo=\* --enablerepo=10gen

service mongod start
mongo
  でmongoコンソールが利用できることを確認する

service mongod stop
  確認ができたらshardingノードを立ち上げるため一旦停止しておく

■shardサーバの起動
mkdir /data/db/shard1/
mkdir /data/db/shard2/
mongod --shardsvr --port 27017 --dbpath /data/db/shard1/
mongod --shardsvr --port 27018 --dbpath /data/db/shard2/

「--shardsvr」オプションをつけてmongodプロセスを起動します
2つのshardサーバを異なるポートで立ち上げます
初回はデータを作成するので起動まで時間がかかります
「--logpath」と「--fork」オプションを付与することでバックグランドで実行することが可能です

■configサーバの起動
mkdir /data/db/config
mongod --configsvr --port 37017 --dbpath /data/db/config

shardingのメタ情報を保存しておくmogodプロセスです
shardsvr同様「--logpath」と「--fork」オプションを付与することでバックグランドで実行することが可能です

■mongosサーバの起動
mongos --configdb localhost:37017 --port 47017

「--configdb」オプションで先ほど起動したconfigサーバを指定します
shardsvr同様「--logpath」と「--fork」オプションを付与することでバックグランドで実行することが可能です

■起動プロセス確認
ここまでで起動したプロセスが以下のようになってれば問題ないです
root      6202  0.0  1.9 423840 39312 pts/6    Sl+  18:23   0:00 mongod --shardsvr --port 27017 --dbpath /data/db/shard1/
root      6227  0.0  1.8 421756 38720 pts/9    Sl+  18:23   0:00 mongod --shardsvr --port 27018 --dbpath /data/db/shard2/
root      6462  0.4  1.9 403340 40196 pts/8    Sl+  18:29   0:00 mongod --configsvr --dbpath /data/db/config --port 37017
root      6477  0.0  0.4 115524  9120 pts/5    Sl+  18:29   0:00 mongos --configdb localhost:37017 --port 47017

■sharding設定
mongosプロセス上に「admin」というコレクションが作成されていますので
adminコレクションに対して設定を追加していきます

mongo admin --port 47017
mongos> sh.addShard("localhost:27017");
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> sh.addShard("localhost:27018");
{ "shardAdded" : "shard0001", "ok" : 1 }
mongos> sh.status()
--- Sharding Status ---
  sharding version: {
        "_id" : 1,
        "version" : 3,
        "minCompatibleVersion" : 3,
        "currentVersion" : 4,
        "clusterId" : ObjectId("53144b7514a80c8a98d45417")
}
  shards:
        {  "_id" : "shard0000",  "host" : "localhost:27017" }
        {  "_id" : "shard0001",  "host" : "localhost:27018" }
  databases:
        {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
        {  "_id" : "test",  "partitioned" : false,  "primary" : "shard0000" }
        {  "_id" : "sharding_test",  "partitioned" : false,  "primary" : "shard0001" }

27017と27018をシャードとして追加しました

次にshard対象とするDBとコレクションとコレクションのキーを指定します
DBおよびコレクションは作成されていなくても問題ございません
mongos> sh.enableSharding("sharding_test");
{ "ok" : 1 }
mongos> sh.shardCollection("sharding_test.test_collection",{name:1});
{ "collectionsharded" : "sharding_test.test_collection", "ok" : 1 }
{ "ok" : 1 }
これでtest_collectionはshardingできるようになったので実際にデータを投入して確認してみます

■データ登録確認
mongo --port 47017
mongos> show dbs
admin   (empty)
config  0.046875GB
sharding_test   0.203125GB
作成したsharding_testデータベースがあることがわかります

データを登録してみます
mongos> use sharding_test
switched to db sharding_test
mongos> i = 0; while ( i < 100000 ) { db.test_collection.save({name:i}); i = i + 1}
100000
mongos> db.test_collection.find();
{ "_id" : ObjectId("531450466026cecc3ea4b71b"), "name" : 0 }
{ "_id" : ObjectId("531450466026cecc3ea4b71c"), "name" : 1 }
{ "_id" : ObjectId("531450466026cecc3ea4b71d"), "name" : 2 }
{ "_id" : ObjectId("531450466026cecc3ea4b71e"), "name" : 3 }
{ "_id" : ObjectId("531450466026cecc3ea4b71f"), "name" : 4 }
{ "_id" : ObjectId("531450466026cecc3ea4b720"), "name" : 5 }
{ "_id" : ObjectId("531450466026cecc3ea4b721"), "name" : 6 }
{ "_id" : ObjectId("531450466026cecc3ea4b722"), "name" : 7 }
{ "_id" : ObjectId("531450466026cecc3ea4b723"), "name" : 8 }
{ "_id" : ObjectId("531450466026cecc3ea4b724"), "name" : 9 }
{ "_id" : ObjectId("531450466026cecc3ea4b725"), "name" : 10 }
{ "_id" : ObjectId("531450466026cecc3ea4b726"), "name" : 11 }
{ "_id" : ObjectId("531450466026cecc3ea4b727"), "name" : 12 }
{ "_id" : ObjectId("531450466026cecc3ea4b728"), "name" : 13 }
{ "_id" : ObjectId("531450466026cecc3ea4b729"), "name" : 14 }
{ "_id" : ObjectId("531450466026cecc3ea4b72a"), "name" : 15 }
{ "_id" : ObjectId("531450466026cecc3ea4b72b"), "name" : 16 }
{ "_id" : ObjectId("531450466026cecc3ea4b72c"), "name" : 17 }
{ "_id" : ObjectId("531450466026cecc3ea4b72d"), "name" : 18 }
{ "_id" : ObjectId("531450466026cecc3ea4b72e"), "name" : 19 }
Type "it" for more

mongosやshardサーバのログを眺めているとそれらしきログが流れていることがわかるかと思います

27017と27018にログインして確認したところ今回は27018にすべてのデータが入っていました
27017にはDBとコレクションのみ作成されていました
10万件ほどではデータは分散されないようで続けてデータを登録し続けたら100万件あたりでデータの分散が発生しました
データ27017と27018にありますがmongosから見るとその合計の値を確認することができます

■Tips
shardサーバ、configサーバ、mongosサーバの停止はバックグラウンドで起動している場合はkillしてください
フォアグランドで実行している場合はCtrl+cで停止できます

とりあえず特定のコレクションに対してshardingさせるまではできました
まだ未調査な部分(チャンクやreplecaSetとの複合など)が多いので何かあれば追記していきます

■参考サイト

0 件のコメント:

コメントを投稿