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 でログをなんちゃら、なテスツを早くしてみたいものです。