Amazon S3 の結果整合性と読み取り一貫性

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

2015/2/23、「書き込み後の読み込み」整合性について更新しました。

Amazon S3 の使いどころ

前回の記事では、Amazon S3 でホームページが作れるという記事を書きましたが、それならファイルのステータスを使ってトランザクション処理にも使えるのでは?と思う方が100人中2人ぐらいいらっしゃるのではないでしょうか。

答えから言いますと、Amazon S3 ではトランザクションの制御はできません。トランザクションを実現するためには、SimpleDBを使う必要があります。(正確には、SimpleDBであるモードに設定する)

それでは、Amazon S3 はどのような考え方でインターネットストレージを実現しているのか解説します。

読み取り一貫性

Amazon S3 の特性を理解するために、読み取り一貫性についてご紹介します。読み取り一貫性は、データベースのトランザクション管理を行う際に、トランザクション分離レベル (Isolation Level)で出てくるキーワードです。以下に、読み取り一貫性がどのように動くのか列挙します。

  • あるトランザクションがデータを変更中のとき、ほかのトランザクションからは変更される前のデータを参照します。
  • ほかのトランザクションからは変更前の確定されたデータを参照します。
  • あるユーザーAが値をUPDATEしたとき、ユーザーBがそのデータを参照すると、戻ってくる値はUPDATE前の値となります。
  • あるトランザクションで変更した確定前のデータをほかのトランザクションから参照することはできません。

結果整合性

Amazon S3 の特性を理解するために、結果整合性についてご紹介します。結果整合性は、クラウド環境でのストレージの考え方として最近語られるようになりました。ひとことで言うならば、「更新はそのうち全体に反映される」です。Amazon S3 は分散されたインターネットストレージですので、1つのファイルをアップロードすると順次分散用のコピーが始まります。これにより障害時にファイルが消える確率を最小化することができます。一方で、複数ユーザが同じファイルをアップロードや更新した場合はどうなるでしょうか。衝突(コンフリクト)しそうですよね。結果整合性では、最後に更新した処理が終わると、時間が経てば必ず全てのストレージに最新情報が反映されます。そのうち反映されるというのは、かなり割り切った使い方ですが、常に最新を表示する必要がないデータを扱う用途にはピッタリです。例えば、Twitterのつぶやきはそのうち反映されればいいですよね。

Amazon S3 の動作例1

あるオブジェクトについて順次操作した場合の動作例です。

screenshot 2015-02-24 0.03.29

W1がredと書き込み終わった後に、W2が同じObjectにrubyと更新します。次にR1とR2が読み込むと、読み取り一貫性から考えると値はrubyとなるはずです。しかし、実際のところは結果整合性からredかrubyか結果なしとなります。ヲイヲイって思うかもしれません。W2の更新から長い時間(感覚値)が経つとrubyとなります。(US Standard)

USスタンダードリージョン以外は、「書き込み後の読み込み」整合性があるため、R1 と R2 の両方が color = ruby を返します。

Amazon S3 の動作例2

あるオブジェクトへ更新中に読み込んだ場合の動作例です。

screenshot 2015-02-24 0.09.56

W1がrubyと書き込み終わった後に、W2が同じObjectにgarnetと更新をします。次にR1がW2の更新完了前に読み込みます。結果は、読み取り一貫性は保たれず値はrubyかgarnetとなります。結果整合性からrubyかgarnetか結果なしとなります。R2も同じく、読み取り一貫性は保たれず値はrubyかgarnetとなります。結果整合性からrubyかgarnetか結果なしとなります。(US Standardリージョン)

USスタンダードリージョン以外は、整合性のある読み込みのため、R2 は color = garnet を返します。

Amazon S3 の動作例3

あるオブジェクトの更新中にさらに更新した場合の動作例です。

screenshot 2015-02-24 0.13.40

W1がgarnetと書き込み終わる前に、W2がbrickと更新をします。次にR1とR2が読み込みます。結果は、読み取り一貫性は保たれず値はgarnetかbrickとなります。結果整合性からgarnetかbrickか結果なしとなります。書き込みが重なった場合は結果整合性になるってことですね。

なお、どのような読み書きをしたとしても、アトミック性がありますので、部分的なデータが取れることはありません。

まとめ

Amazon S3 は、パソコンのファイルシステムやデータベースと同じようにロックやトランザクション処理は行われないことをなんとなく感じて頂けたと思います。じゃぁどこで使うかと言いますと、繰り返しになりますが長期保存を目的としたインターネットストレージです。

用法を理解した楽しく使いましょう〜

参考資料

Amazon S3 のご紹介