View
6.640
Download
0
Category
Preview:
DESCRIPTION
MongoDB Casual TalksのLTで話したネタ。 MongoDBのバックアップ機能について。
Citation preview
カジュアルにMongoDBのBackup機能説明
Masakazu MatsushitaCyberagent, Inc.
•松下 雅和 / @matsukaz•Cyberagent, Inc.•Ameba Pico (海外版ピグ)•Animal Land•DevLOVE Staff
About Me
MongoDBでBackupと言えば?
mongoexportor
mongodump
mongoexportはJSON/CSV形式でデータを出力
ただし全てのデータ型をサポートしているわけではない
以下のデータ型はデータの忠実性が一部失われてしまう
data_regexdata_oiddata_ref
data_binary data_date data_timestamp
> db.hoge.save( { val : 100 } );> db.hoge.save( { val : NumberInt( 200 ) } );
> db.hoge.find( val : { $type : 1} );{ _id : ObjectId("..."), val : 100 }
> db.hoge.find( val : { $type : 16} );{ _id : ObjectId("..."), val : 200 }
1 = double
16 = int
数値型も全てdoubleになる
mongoexport(・A ・)イクナイ
mongodumpはBSON形式でデータを出力
データは正しい情報のまま出力される
Onlineでの実行も可能
ただし小規模での利用を想定したもの
全データが一箇所に出力されるのでデータ量に注意
実行中はパフォーマンスにも
影響する
mongorestoreも時間がかかる
Sharding環境だとさらに問題が
--oplogオプションは使えない
(dump開始時~完了時の差分のoplogも出力する機能)
mongorestoreだけでなくrestore後のマイグレーションも時間がかかる
データ量が多いとひどいことに・・・
orz
MongoDBを停止させていいなら
話は簡単
Shard 1
mongod
mongod
mongod
Shard 2
mongod
mongod
mongod
Shard 3
mongod
mongod
mongod
mongoc
mongoc
mongoc
Shard内のmongod1台とmongocのデータを物理コピーでOK
Shard 1
mongod
mongod
mongod
Shard 2
mongod
mongod
mongod
Shard 3
mongod
mongod
mongod
mongoc
mongoc
mongoc
リカバるときはデータをコピーするだけ
Onlineで、かつサービスへの影響を抑えたBackupって出来ないの?
そんなうまい話なんて・・・
あるんです!!
Officialな手順
1. balancerを止める
use config;db.settings.update( { _id: "balancer" }, { $set : { stopped: true } } , true );
2. 全Primaryをlockdb.fsyncLock();
Shard 1
mongod
mongod
mongod
Shard 2
mongod
mongod
mongod
Shard 3
mongod
mongod
mongod
mongoc
mongoc
mongoc
更新されないようにする更新されないようにする更新されないようにする
3. config情報をBackup
mongodump -d config dump_configdata
4. SecondaryのデータをBackup
Shard 1
mongod
mongod
mongod
Shard 2
mongod
mongod
mongod
Shard 3
mongod
mongod
mongod
mongoc
mongoc
mongoc
5. 全PrimaryをUnlockdb.fsyncLock();
Shard 1
mongod
mongod
mongod
Shard 2
mongod
mongod
mongod
Shard 3
mongod
mongod
mongod
mongoc
mongoc
mongoc
6. balancerを有効化
use config;db.settings.update( { _id: "balancer" }, { $set : { stopped: false } } , true );
Backupに時間がかかるとlock時間が長すぎる
そこで
mongodを落としてあとからゆっくりBackupを取ったら?
手順はほぼ一緒
1. balancerを止める
use config;db.settings.update( { _id: "balancer" }, { $set : { stopped: true } } , true );
2. 全Primaryをlockdb.fsyncLock();
Shard 1
mongod
mongod
mongod
Shard 2
mongod
mongod
mongod
Shard 3
mongod
mongod
mongod
mongoc
mongoc
mongoc
更新されないようにする更新されないようにする更新されないようにする
3. config情報をBackup
mongodump -d config dump_configdata
4. Secondaryを落とす
Shard 1
mongod
mongod
mongod
Shard 2
mongod
mongod
mongod
Shard 3
mongod
mongod
mongod
mongoc
mongoc
mongoc
5. 全PrimaryをUnlockdb.fsyncLock();
Shard 1
mongod
mongod
mongod
Shard 2
mongod
mongod
mongod
Shard 3
mongod
mongod
mongod
mongoc
mongoc
mongoc
6. balancerを有効化
use config;db.settings.update( { _id: "balancer" }, { $set : { stopped: false } } , true );
7. 落としたSecondaryをBackup
Shard 1
mongod
mongod
mongod
Shard 2
mongod
mongod
mongod
Shard 3
mongod
mongod
mongod
mongoc
mongoc
mongoc
8. 落としたSecondaryを起動
Shard 1
mongod
mongod
mongod
Shard 2
mongod
mongod
mongod
Shard 3
mongod
mongod
mongod
mongoc
mongoc
mongoc
勝手に同期が取られる勝手に同期が取られる勝手に同期が取られる
カジュアルに検証した限りは問題なし
なお、この方法を試して問題が起きても当方でh(ry
銀河さん情報だとSecondaryの
Lockでいけるんだとか
・・・
そっちのがいいよね
アプリケーションに影響ないしー...( = =)トオイメ
PrimaryとSecondaryの同期ズレだけ許容できるかどうかだけ?
大抵できると思うのでSecondaryの
Lockの方向でドウゾ
ご清聴ありがとうございました!
Recommended