aws memo

AWS関連の備忘録

2012-05-15

訳:DynamoDB:SSD Hot S3 Cold パターン

DynamoDBのベストプラクティス的なパターン

High Scalability - High Scalability - DynamoDB Talk Notes and the SSD Hot S3 Cold Pattern

====

Amazon DynamoDB for Developersトークに参加する前の、DynamoDBに対する印象は、シンプル・速い・スケーラブル・地理的冗長性・使うには高い・運用不要、という、Amazonのいつもの品質のサービスだった。

トークの後、印象はより微妙(nuanced)になった。品質の印象はそのまま。フォーラムを見れば、すべてのプロダクトに典型的な問題があることがわかるが、それは驚きではない。SimpleDBの発展版( SimpleDB++)として、DYnamoDBはセカンドシステム症候群を避けて、もっとエレガントな設計を作ったように見える。

驚いたのは、DynamoDBがとても非クラウド的だったことだ。従量課金モデルと、バーストトラフィックに対して素早く柔軟に対応するというクラウドの柱が捨てられ、DynamoDBを作る前に使い方を考える必要があることだ。

トークの中で感じたことは、、、、

  • DynamoDBは Key-Valueデータの地位を明らかにした 。インターフェースは簡潔で、CreateTable, PutItem, BatchWriteItem, GetItem, Scan, Queryのように操作に一貫性がある。バッチ書き込みはトランザクションがサポートされていない。アクセスは、主キー、もしくは、ハッシュキーとレンジキーの複合で行う。データの最大サイズは64KB。スキーマレス。対応する型は、文字列型と数値型、そしてその集合(set)。読み込みは整合性有り、もしくは無しが可能で、書き込みは常に整合性有りで、整合性有りの読み込みは2倍のコストになる。
  • 操作は通常10msec以下で、だいたい3-4msec。だいたいネットワークで1.5msec以下、データベース処理で1.5msec以下で、データサイズに依存する。顧客は 1-2msecの応答時間を要求するのでAmazonはストレージにSSDを使うという革命的な手段を選んだ。はじめはSSDガベージコレクション周期に起因する性能問題があった。ベンダーとの広範な作業により問題は解決したが、知財の事情で、どのようにやったかはわかならい。
  • プロビジョンスループットモデル。 DynamoDBの最も革新的な機能であり、最も不確かであり、簡潔なAppleの設計美学である。プログラマはアプリケーションが必要になるだけのデータベースへの秒間リクエスト数を指定する担当である。DynamoDBが残りを請け負う。要求された性能を実現するためにデータを自動で多くのサーバに分散する。実行中(on the fly)にレートを変更できるが、新しく要求するレートをサポートするまでには最大10分必要になる。
  • 騒音隣人問題を解決する。クラウドの問題は、うるさい隣人が他の隣人の性能に影響を及ぼす可能性があること。DynamoDBがマルチテナント環境でSLAを順守するために、格納する値の最大サイズ64KBという制限を設けた。更に、1KBのデータを1回読み(書き)するのを Read/Writeキャパシティの単位としてリクエストが課金される。データサイズを固定し、スループットレートを保証するための仕様を決めるすることで、負荷をスケジュールために必要な情報を得た。
  • 従量課金ではない。プロビジョンスループットモデルの反面、実際に発生したトラフィックに対して支払う代わりに、確保したスループットに対して支払うことになる。Amazonの見方(perspective)だと、キャパシティを確保しているのだからある程度キャパシティを使っている、ということだが、クラウドの弾力的な素性が生み出すキャパシティ計画問題が同じように発生する。正しいスループットをどうやって弾きだすか?下回れば、顧客を失う。上回ればお金を失う。トラフィックがバーストしがちなら、ピーク時のスループットで年中確保しなければならない。スループットを調整できるが、バーストに合わせられるほど素早く調整できないし、drop通知のメカニズムもイケてなく(clumsy)て、メールでアラートを受け取ったら手動で調整する必要がある。
  • イケてる機能たち。 DynamoDBは、インクリメント操作と CAS( compare-and-swap)をサポートしており、両方ともとても便利である。
  • 運用不要(NoOp)ではない。開発者を助けるために腕利きは残る。 DynamoDBの運用は残るが、領域が違ってくるだろう
    • トランザクションが無い。開発者は冪等性(idempotency)、ガベージコレクション、その他DynamoDBがサポートすべき機能を実装する必要がある。例えば、セカンダリインデックスや検索がサポートされておらず、難しく、直接システムがサポートされt無いのであれば実装にエラーが入りやすくなる。
    • ホットキー・ホットパーティションがサポートされてない。プロビジョンモデルは自動ではないので、ホットキーも自動で負荷分散しない。特定のキーやパーティションに対する読み込みが大量にあると、プログラマーがその問題を修復する必要があり、DynamoDBは何もしない。NoOpは通用しない。
    • バックアップをサポートしていない。データをバックアップするには、Hadoopを使う必要がある。これは解決される問題らしいが、現時点では抜けている。
    • 64KB以上のデータ。 64KB以上のデータを保存するトリックは、スループットの性能低下を引き起こす。
  • データ閲覧にHiveを使う。 DynamoDBは巨大なデータ集合をターゲットにしているので、データを見るには Hadoop/Hiveを使う。そのうち、より便利な機能がダッシュボードに実装されるだろうが。。

ホットデータはDynamoDBにコールドデータはS3に、そして同じように見るためにHadoop/Hiveを使え

最も興味深い考えの一つは、DynamoDBとS3をつなぐ新しいエコシステムとしてHadoop/Hiveがとても機能しているということ。DynamoDBに保存されているデータのコストはS3よりも10倍高いので、古いデータやコールドデータはできる限りS3に移してほっとデータのみDynamoDBにおいておきたい。例えば、時系列データはだいたい、日・週・月単位で保存されるが、すべてのデータをDynamoDBに保存するのではなく、S3に移してコストを削減する。

問題は、データにアクセスする方法が大きく異なること。DynamoDBは純粋にテーブル経由のプログラム的アクセスだが、S3はファイル経由である。コードの修正を少なくしてどのようにこの差異を埋めるか?

EMRとHiveの洗練されたクエリを使うことでDynamoDBとS3のデータを共通のアクセスレイヤで実行可能になる。強力なエコシステムを提供する上でこのようにツールが使えることは良い例になる。

 

 

2012-05-09

CF: CloudFront のIPアドレスレンジ

CloudFrontのフォーラムの、Forum Announceに載っている。

 

AWS Developer Forums: Amazon CloudFront Public IP Ranges

によると、2012/3/11時点では、以下のレンジが使われるらしい。

54.240.128.0/18 
204.246.164.0/22
204.246.168.0/22
204.246.174.0/23 
204.246.176.0/20 
205.251.192.0/19 
205.251.240.0/22 
205.251.249.0/24 
205.251.250.0/23 
205.251.252.0/23 
205.251.254.0/24 
216.137.32.0/19 

エッジが増えた時には要チェック。  

ちなみに、EC2のIPレンジについてはこちら

AWS Developer Forums: Amazon EC2 Public IP Ranges

2012-05-08

SQS: SupervisordでSQSのワーカープロセスを管理実行する

まずは、Supervisordのスクラップ

Supervisord 本家

PHP+Kestrel+Supervisorでお手軽タスクキューイング : アシアルブログ

スーパーサーバーSupervisorの導入手順メモ - Glide Note - グライドノート

Supervisord を Amazon Linux AMI にインストール - massatの日記

=====

インストールはだいたい上のリンクから。

管理は、付属の supervisorctl で行う。主に使うのは

  • supervisorctl status 子プロセスの様子を見る
  • supervisorctl stop 子プロセスを停止する
  • supervisorctl start 子プロセスを開始する
  • supervisorctl restart 子プロセスを再起動する
  • supervisorctl reload Supervisord自体を再起動する
  • supervisorctl reread 設定ファイルを読みなおして変更を反映させる
  • supervisorctl avail 全プロセスの情報を表示

あたり。

一部の操作はWebUIからでも操作可能。(inet_http_serverの設定をしていた場合)

2012-05-08

SQS: ワーカープロセスの稼働管理にSupervisordが便利

SQS等のキューを介して非同期に処理を行う Queue Chain パターンを実装する場合、SQSに突っ込む処理はWebアプリ等の処理中に書けばよいので特に考えることはないが、SQSからメッセージを抜いて後続の非同期処理を実行するワーカープロセスをどのように起動管理するか?が肝になる。非同期処理を出来るだけ早く処理したい場合は特に。

JavaならMDB(Message Driven Bean)のような仕組みがすでにあるが、軽量言語(PHP,Pearl, Ruby, Python,etc)向けに何かうまい方法を用意したい。Cronで1分間隔起動だと、処理時間によっては重複起動になるし、そもそも分単位での制御しかできないので出来れば常駐化させたい。言語ごとには解決策があるのかもしれないが、もう少し汎用的な仕組みが欲しい。

で、辿り着いたのが Supervisord というプロセスをデーモン化(daemonize)するデーモン。昔で言うところの daemontools のイメージ。

daemontoolsから改善されている点としては

  • 複数の種類のプログラムを一つのSupervisord配下で管理できる
  • あるプログラムを任意の数のプロセスだけ起動できる
  • 管理ツール( supervisorclt )で各種の情報取得や制御が可能
  • Web UIが付いている
  • 動的に設定変更が可能

あたりか。

んで、結局どうなるのか?というと

f:id:understeer:20120508184224p:plain

という感じ。上図は、SQSを定期的に監視・取得するプロセス群、CloudWatchを定期的に監視・取得するプロセス群、クローラがいる例。

 

  • 「一定回数だけキューを監視・取得して処理をするスクリプト」を書く
  • スクリプトをSupervisordに登録する
  • スクリプトを実行するプロセスがSupervisordによって複数起動する。
  • 各プロセスはスクリプトを実行する(キュー監視・実行を行為、一定回数ループすると終了)。
  • 終了したプロセスのスロットは、Supervisordによって、新しくプロセスが生成される。

あとは、ループごとに行うsleepの間隔と、同時実行プロセス数の調整をすることで、キューの捌きの処理能力をある程度制御出来るようになる。

具体的な例は後ほど。

2012-05-02

EC2: GPGPUクラスタインスタンス cg1.4xlargeのメモリ

cg1.4xlargeは、cc1.4xlargeにGPUとして NVIDIA Tesla M2050 "Fermi"  が2個刺さっている、という認識だったので、利用可能メモリもcc1.4xlargeと同じ23GiBだという認識だった。

http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/using_cluster_computing.html#concepts_cluster_compute_specifications

を見ると、

Note: The cluster GPU instances can use up to 22 GiB, with 1 GiB reserved for GPU operation. The 22 GiB doesn't include the GPU on-board memory, which is 3 GiB per GPU for the NVIDIA Tesla M2050 GPU.
注意: クラスタGPUインスタンスは22GiBまで使える。1GiBはGPU操作のため予約済みである。22GiBは GPUオンボードメモリを含んでいない。NVIDIA Tesla M2050 GPUでは、GPU毎に3GiBのオンボードメモリがある。

ということで、実際は22GiBと、cc1.4xlargeより1GiB少ない。実際にやってみると

 free 
             total       used       free     shared    buffers     cached
Mem:      22059784     286708   21773076          0       8412     145948
-/+ buffers/cache:     132348   21927436
Swap:            0          0          0

となっている。ちなみに、NVIDIAのドライバも手動でダウンロード&インストールする必要がある。

Manual Installation of the NVIDIA Driver

2012-05-02

EC2: cc2.8xlargeのリザーブドインスタンスを比較してみた

特にどうってこと無いんですが。1年モノのcc2.8xlargeのRI(Reserved Instance)の利用度合いと費用についてグラフ化。

http://aws.amazon.com/jp/ec2/pricing/

f:id:understeer:20120502203338p:plain

縦軸はドル。横軸は累積の利用時間割合。1年(24h x 365d)で100%の計算。

つまり、1年のうち10数%しか使わない(月平均で3日とか)だと、オンデマンドがお得。

20%~80%くらいの利用率(月平均で5日~25日使う、もしくは ぶっ続けで2ヶ月以上使う)だとlightがお得。

80%以上使う(ほぼ24x365で使うイメージ)だと、heavyがお得、となる。

(mediumのスイートスポットが殆ど無いのは内緒だ)

いずれにせよ、RIを買っておくとAWSのキャパシティが不足してインスタンスを起動できない(Insufficient Capacity Errors , ICE)に遭遇しなくなるので、なるべく買っておいたほうがよさそう。

 

最低限必要な台数分のRIを買っておいて、一時的に台数を増やしたい時は スポットインスタンスを使ってコストを下げるとか工夫している企業が多い。スポットを使ってEMR(Hadoopクラスタ)のコストを下げる説明のビデオはこちら。