訳:EBS : Snapshotの仕組み等
2012.02.12追記 @ayakomuro さんがわかりやすく解説してくれている。
-----
Amazon’s Elastic Block Store explained | RightScale Blog
スナップショットバックアップは、EBSの機能の中でも、最も便利で最も理解が難しい機能である。EBSボリュームのスナップショットはいつでも取得可能である。すべてのS3上のデータと同じく、ボリュームのデータのコピーをS3に保存する。最初の特徴は、スナップショットはユーザのS3バケツに表示されないこと。そのため、標準のS3 APIでアクセスできない。EC2 APIでスナップショットの一覧を取得できる。また、スナップショットから新しいボリュームを作成することでリカバリ可能。2番目の特徴は、インクリメンタルスナップショットであること。これは、後続のスナップショットを作成するためにEBSは前回のスナップショットから変更されたディスクブロックのみを保存する。
概念的にどのようにインクリメンタルスナップショットが動作しているか?は、下図に示す。各ボリュームはブロックに分割されている。初回のスナップショットが保存されると、ボリュームに今まで書かれた全ブロックがS3にコピーされる。そしてスナップショットのToC(table of contents)がS3に書かれる。ToCには全ブロックが保存される。同一ボリュームに対して2回目のスナップショットが実行された時、初回のスナップショットから変更されたブロックのみがS3にコピーされる。2回目のスナップショットのToCがS3に書かれ、スナップショットに属するS3上の全ブロックが保存される。あるブロックは初回のスナップショットと共有され、あるブロックは新しいものである。3回目のスナップショットも同様に作成され、初回、2回目、3回目のスナップショットのブロックが含まれる。
インクリメンタルスナップショットの特徴について、2つの良いことがある。それは、時間と領域を節約できる点である。変更されたブロックのみをS3に送信するため、連続してスナップショットを取得するととても速く、増分のブロックに対するS3のストレージ分を支払うだけで良い。答えに困るのが、スナップショットがどのくらいの容量を使っているか?だである。言い換えると、あるスナップショットを削除するとどのくらい容量を減らせるか?とも言える。あるスナップショットを消すと、そのスナップショットでだけ使われていたブロック(つまり、そのスナップショットのToCから参照されているブロック)が削除される。
スナップショットに関して気をつけることは、一貫性(consistency)である。ブロックはS3へ数分かけて流れていくのだが、あるスナップショットは正確なある時点で取得される。しかし大抵の場合、ディスク上と、スナップショットの瞬間との間(vs.)の制御をしたくなるだろう。これは特に、データベースを使っている場合に重要になる。データベースをフリーズし、ファイルシステムをフリーズし、スナップショットを取得し、すべてのフリーズを解除することを推奨する。ファイルシステムレベルでは、大きなローカルドライブ、EBSボリューム用にxfsを使い続けている。というのも、フォーマットが速く、フリーズ(freezing)をサポートしているからである。このように、スナップショットを取得するときは、xfs freezeして、スナップショットを取得し、unfreezeしている。MySQLを実行している場合は、 "flush all tables with read lock" で明確に書き込みを止める。これで、スナップショットをマウントした際にリカバリが必要になるような中途半端な更新を含まないことを保証する。この操作はUSBドングルに似ている。 : if you pull the dongle out while it’s being written to “your mileage may vary” when you plug it back into another machine…
スナップショットの性能は、S3の性能になってしまう。S3の性能は1ストリームで約20MB/sである。ここでの3つ嬉しいことは、スナップショットはインクリメンタルであること、データは圧縮されること、これらの動作がEBSによってバックグラウンドで行われそのボリュームをマウントしているインスタンスに影響を与えないことである。 Obviously the data needs to come off the disks, so there is some contention to be expected, but compared to having to do the transfer from disk through the instance to S3 it is like night and day.