mongoDBで一括シャーディング

mongoDBにはシャーディング環境では動作しないクエリがある。なので、自分は開発用PC上のmongoDBもシャーディングの設定をしている。

しかし、ステージング環境等のmongoDBからmongodumpしてmongorestoreをするとシャーディング設定が消えてしまう(dropオプション付けている場合)。

データを引っこ抜いてくるたびにシャーディングの設定するのは面倒なので自動化している。以下の内容のシェルスクリプトを作成。mongo_sharding.sh などと適当に名前をつけて保存

#!/bin/bash
COLS=`mongo LocalDatabaseName --quiet --eval "db.getCollectionNames().forEach(function(i){ print(i) });" | grep -v system`
for i in $COLS
do
    echo 'db.runCommand({ shardcollection: "LocalDatabaseName.'${i}'", key: { _id: 1}});'
done

以下のコマンドで全てのコレクションにシャーディング設定が適用される。

$ ./mongo_sharding.sh | mongo admin

ここまで来たらついでにdump/restoreもスクリプトにしてしまおう。 mongorestore_from_stg.sh というスクリプトを作成。

#!/bin/bash
mongodump -h our.staging.server -d StagingDatabaseName 
mongorestore -h localhost -d LocalDatabaseName --drop ./dump/StagingDatabaseName
./mongo_sharding.sh | mongo admin

終わり。

こういうのは1つのスクリプトにしないのが正解。