MongoDBのSharding

MongoDBのShardingを使ってみる。

MongoDB起動

MongoDBのレプリカセット - i2bsの日記の時と同様にディレクトリを作成して、port等を変えて3つのMongoDBを起動する。
今回はShardingを使う為、--replSetオプションを外して--shardsvrを付与する。
(通常はreplSetとshardsvrを合わせて使うらしい)

mkdir -p /data/mongo{1,2,3}/{db,logs}
/usr/local/mongodb/bin/mongod --shardsvr --journal --port 27017 --logappend --logpath /data/mongo1/logs/mongod.log --pidfilepath=/data/mongo1/logs/mongod.pid --dbpath=/data/mongo1/db --fork
/usr/local/mongodb/bin/mongod --shardsvr --journal --port 27018 --logappend --logpath /data/mongo2/logs/mongod.log --pidfilepath=/data/mongo2/logs/mongod.pid --dbpath=/data/mongo2/db --fork
/usr/local/mongodb/bin/mongod --shardsvr --journal --port 27019 --logappend --logpath /data/mongo3/logs/mongod.log --pidfilepath=/data/mongo3/logs/mongod.pid --dbpath=/data/mongo3/db --fork

Configサーバ起動

クラスタメタデータ(shard,サーバ,chunkの情報)を管理している。
Configサーバはmongodの起動オプションに--configsvrオプションを付与する。
今回は1サーバで全てのプロセスを起動するのでConfigサーバは1プロセスしか起動しないけど、3台構成が推奨らしい。
ちなみにConfigサーバは停止してもデータの読み書きには影響しないがshardの追加や移動ができなくなる。

mkdir -p /data/config/{db,logs}
/usr/local/mongodb/bin/mongod --configsvr --port 27020 --logappend --logpath /data/config/logs/mongod.log --pidfilepath=/data/config/logs/mongod.pid --dbpath=/data/config/db --fork

mongos起動

mongosはrequestのバランシングとresponseのマージをするプロセス。
mongosへrequestを投げることで各shardにバランシングされてresponseはマージして返す。
実データは持たないのでdbディレクトリは作成しない。また今回はchunk sizeを1MBに設定する。
mongosはとても軽いらしくどこで動かしても問題無いみたい。

mkdir -p /data/mongos/logs
/usr/local/mongodb/bin/mongos --configdb localhost:27020 --port 27021 --logappend --logpath /data/mongos/logs/mongos.log --pidfilepath=/data/mongos/logs/mongos.pid --fork

Shard構成

Shardの構成をするだけでまだバランシングされない。

root@johan:~# /usr/local/mongodb/bin/mongo --port 27021
MongoDB shell version: 2.0.2
connecting to: 127.0.0.1:27021/test
mongos> use admin
switched to db admin
mongos> db.runCommand({addshard:"localhost:27017"});
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> db.runCommand({addshard:"localhost:27018"});
{ "shardAdded" : "shard0001", "ok" : 1 }
mongos> db.runCommand({addshard:"localhost:27019"});
{ "shardAdded" : "shard0002", "ok" : 1 }
mongos> db.runCommand({listshards:1})
{
	"shards" : [
		{
			"_id" : "shard0000",
			"host" : "localhost:27017"
		},
		{
			"_id" : "shard0001",
			"host" : "localhost:27018"
		},
		{
			"_id" : "shard0002",
			"host" : "localhost:27019"
		}
	],
	"ok" : 1
}
mongos> db.printShardingStatus();
--- 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" }

mongos> exit
bye

データのインポート

dpkg.logを使ってみた。

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

Shardingの会誌

root@johan:~# /usr/local/mongodb/bin/mongo --port 27021MongoDB shell version: 2.0.2
connecting to: 127.0.0.1:27021/test
mongos> use admin
switched to db admin
mongos> db.runCommand({enablesharding:"mydb"});
{ "ok" : 1 }
mongos> db.runCommand({shardcollection:"mydb.dpkglog",key:{"_id":1}});
{ "collectionsharded" : "mydb.dpkglog", "ok" : 1 }
mongos> exit
bye

ShardingStatus確認

root@johan:~# /usr/local/mongodb/bin/mongo --port 27021MongoDB shell version: 2.0.2
connecting to: 127.0.0.1:27021/test
mongos> use admin
switched to db admin
mongos> db.printShardingStatus();
--- 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	2
				shard0001	1
			{ "_id" : { $minKey : 1 } } -->> { "_id" : ObjectId("4f464e834ba53cc9aafc67a0") } on : shard0000 { "t" : 2000, "i" : 1 }
			{ "_id" : ObjectId("4f464e834ba53cc9aafc67a0") } -->> { "_id" : ObjectId("4f4650faf02466cafa108272") } on : shard0000 { "t" : 1000, "i" : 3 }
			{ "_id" : ObjectId("4f4650faf02466cafa108272") } -->> { "_id" : { $maxKey : 1 } } on : shard0001 { "t" : 2000, "i" : 0 }

mongos> exit
bye

Configサーバからも確認

root@johan:~# /usr/local/mongodb/bin/mongo --port 27020
MongoDB shell version: 2.0.2
connecting to: 127.0.0.1:27020/test
> use config
switched to db 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-16T09:26:47.903Z"), "dropped" : false, "key" : { "_id" : 1 }, "unique" : false }
> exit
bye