mongoDB の sharding を単一ホストで云々

とりあえず、バッチでなんとかしてみました。手順としては MongoDBのSharding を踏襲させて頂きました。以下。

  • shardsvr なプロセス起動
  • configsvr なプロセス起動
  • mongs なプロセス起動
  • addshard なコマンド投入
  • データのインポート
  • sharding 開始
  • sharding なステイタスの確認
  • config サーバ確認

でっちあげたスクリプトなどを以下に。

shardsvr なプロセス起動

でっち上げた起動スクリプトが以下。

mkdir -p /var/lib/mongodb/mongo{1,2,3}/{db,logs}
mongod --shardsvr --nojournal --port 27017 --logappend \
--logpath /var/lib/mongodb/mongo1/logs/mongod.log \
--pidfilepath=/var/lib/mongodb/mongo1/logs/mongod.pid \
--dbpath=/var/lib/mongodb/mongo1/db --fork
mongod --shardsvr --nojournal --port 27018 --logappend \
--logpath /var/lib/mongodb/mongo2/logs/mongod.log \
--pidfilepath=/var/lib/mongodb/mongo2/logs/mongod.pid \
--dbpath=/var/lib/mongodb/mongo2/db --fork
mongod --shardsvr --nojournal --port 27019 --logappend \
--logpath /var/lib/mongodb/mongo3/logs/mongod.log \
--pidfilepath=/var/lib/mongodb/mongo3/logs/mongod.pid \
--dbpath=/var/lib/mongodb/mongo3/db --fork

最初、--nojournal を忘れてました。journal が作成されるまで port のリスンはしないことが分かりました。

configsvr なプロセス起動

でっちあげた起動スクリプトが以下。

mkdir -p /var/lib/mongodb/config/{db,logs}
mongod --configsvr --port 27020 --nojournal --logappend \
--logpath /var/lib/mongodb/config/logs/mongod.log \
--pidfilepath=/var/lib/mongodb/config/logs/mongod.pid \
--dbpath=/var/lib/mongodb/config/db --fork

こちらも --nojournal してます。

mongs なプロセス起動

でっち上げた起動スクリプトが以下。

mkdir -p /var/lib/mongodb/mongos/logs
mongos --configdb localhost:27020 --port 27021 --logappend \
--logpath /var/lib/mongodb/mongos/logs/mongos.log \
--pidfilepath=/var/lib/mongodby/mongos/logs/mongos.pid --fork

これで無事に起動することを確認しております。次は shard 構成の設定盛り込みです。

addshard なコマンド投入

ここからはコマンド投入する .js なファイルも追加。まずはスクリプトで以下。

mongo admin --port 27021 shardconfigration.js

で、shardconfigration.js が以下。

db.runCommand({addshard:"localhost:27017"});
db.runCommand({addshard:"localhost:27018"});
db.runCommand({addshard:"localhost:27019"});
db.runCommand({listshards:1})
db.printShardingStatus();

とりあえず下二つは不要ですが確認のために、ということで。起動については以下なカンジで。

$ sudo /bin/bash shardconfigration.sh

データのインポート

サンプルに沿って /var/log/dpkg.log を mongoimport しました。

mongoimport --host localhost:27021 --db mydb --collection dpkglog \
--fields date,time,class,message --ignoreBlanks \
--type tsv /var/log/dpkg.log

sharding 開始

スクリプトが以下。

mongo admin --port 27021 shardingstart.js

で、shardingstart.js が以下。

db.runCommand({enablesharding:"mydb"});
db.runCommand({shardcollection:"mydb.dpkglog",key:{"_id":1}});

以下なカンジでコマンド投入。

$ sudo /bin/bash shardingstart.sh

sharding なステイタスの確認

以下で起動する形。

mongo admin --port 27021 shardingstatus.js

で、shardingstatus.js が以下。

db.printShardingStatus();

ここは実行したナニを以下に。

$ sudo /bin/bash shardingstatus.sh
[sudo] password for user: 
MongoDB shell version: 2.0.4
connecting to: 127.0.0.1:27021/admin
--- Sharding Status --- 
  sharding version: { "_id" : 1, "version" : 3 }
  shards:
        {  "_id" : "shard0000",  "host" : "localhost:27017" }
        {  "_id" : "shard0001",  "host" : "localhost:27018" }
        {  "_id" : "shard0002",  "host" : "localhost:27019" }
  databases:
        {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
        {  "_id" : "mydb",  "partitioned" : true,  "primary" : "shard0000" }
                mydb.dpkglog chunks:
                                shard0000       1
                        { "_id" : { $minKey : 1 } } -->> { "_id" : { $maxKey : 1 } } on : shard0000 { "t" : 1000, "i" : 0 }

$

config サーバ確認

で、こちらなんですが以下で mongo をナニ。

mongo config --port 27020 configstatus.js

で、configstatus.js が以下、なんですが

db.shards.find()
db.databases.find()
db.collections.find()

これが何も出力しません。

$ sudo /bin/bash configstatus.sh
MongoDB shell version: 2.0.4
connecting to: 127.0.0.1:27020/config
$

ちなみに REPL からコマンドを投入すると出力が確認できます。

$ sudo mongo config --port 27020 
MongoDB shell version: 2.0.4
connecting to: 127.0.0.1:27020/config
> db.shards.find()
{ "_id" : "shard0000", "host" : "localhost:27017" }
{ "_id" : "shard0001", "host" : "localhost:27018" }
{ "_id" : "shard0002", "host" : "localhost:27019" }
> db.databases.find()
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "mydb", "partitioned" : true, "primary" : "shard0000" }
> db.collections.find()
{ "_id" : "mydb.dpkglog", "lastmod" : ISODate("1970-01-16T11:38:57.640Z"), "dropped" : false, "key" : { "_id" : 1 }, "unique" : false }
> exit
bye
$

これはこんなものなんだろな、とゆーことで。

とはいえ

複数ホストで Sharding+ReplicaSet で云々しつつ Fluentd でログをなんちゃら、なテスツを早くしてみたいものです。