カジュアルにMongo dbのbackup機能説明

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の方向でドウゾ

ご清聴ありがとうございました!