AWS DynamoDB
DynamoDB
RDB vs. DynamoDB
コンセプトから学ぶAmazon DynamoDB【Amazon RDSとの比較篇】
RDB の ACID: データベースが持つ強い整合性を伴う特徴を、ACID(Atomicity, Consistency, Isolation, Durability)特性という。
- consistency: どこからアクセスしても同じデータが観測できること
- Atomicity: 一連の操作を全て適用commitするか全てキャンセルrollbackするかの二択として実現できること
RDB の検索性: where 句などによる検索性の高さ
RDB の可用性: Multi-AZの構成にしたとしても、稀に何らかの障害等により、MasterからSlaveへのフェイルオーバーが発生することがあり、この処理を行っている数分間は、可用性が損なわれる。また、障害以外にもセキュリティパッチの適用等の目的で、メンテナンスウィンドウにおける再起動が起こることがあります。つまり、RDSにおいてはサービスレベルの設計時点でメンテナンスウィンドウにおいて可用性が損なわれることは織り込み済みの事象と言えます。
RDB の拡張性: RDSはスケールアップのみをサポート。つまり、インスタンスタイプの変更です。規模の拡大に伴ってスケールアップを繰り返すと、すぐに限界が訪れてしまう可能性があります。読み込みだけに絞れば、Read replicaによるスケールアウトに対応しますが、レプリカをぶら下げられる数にも一定の制限があり、比較的天井が低いかも知れない
DynamoDB, NoSQL の BASE: Basically Available, Soft state, Eventually consistent
- Basically Available: 可用性低下は想定せず、基本的にいつでも利用可能
- Eventually consistent: データを更新した瞬間、複数ノードに分散している場合は一時的に返す値がばらつく(更新前のものと更新後のもの)が、最後には一緒になる(DynamoDB では 1秒 以内だとのこと)
DynamoDB の検索性: 予め決めた 1つの primary key と 5つの secondary index で検索する以外は、全走査になるため性能が落ちる
複合キーを使うには: 1つをハッシュキーとして、もう一つをレンジキーとして指定すると良いらしい. 参考
DynamoDB のオートスケーリングとスロットリング
オートスケーリングとバーストキャパシティ
- burst capacity は 過去 300 秒の未使用 capacity から割り当てられる
- オートスケーリングのアルゴリズム
- Write Capacity Unit (WCU) や Read Capacity Unit (RCU) は動的に増減できる (autoscaling: enabled ならば)
target tracking algorithm
というらしい- キャパシティが拡大するのは 5-30 分かかる
- ターゲット使用率 を設定する必要がある
- スケールダウンは消費キャパシティがずーっと 0 では発生しない! 最小キャパシティにスケールダウンするまでは低レートでリクエストし続ける必要があるっぽい
ほかベストプラクティス
- パーティションキーを設計してワークロードを均等に分散する
DynamoDB on-demand について
2018年11月の re:Invent にて、 Amazon DynamoDB On-Demand のリリースが案内されました。
- 従来: provisioned mode, 今回: on-demand mode
- 事前のキャパシティプランニングが一切不要、リクエスト分だけ応答でき、使った量に応じて課金
自分の用途に合うか?今のところ不要に思うんだけど、理由は以下:
理由1. このグラフほどスパイキーなトラフィックは通常発生しない
理由2. 平常時のトラフィック特性に対して割高。
キャパシティの70% = 実レート
のバランスが維持されるようにオートスケールしているけど、以下のコスト比較している感じ、 キャパシティの70%を常に使っている状態なら provisioned のほうが圧倒的に安そう。- DynamoDBのオンデマンドとプロビジョニングの料金を比較をしてみた #reinvent | DevelopersIO
理由3. スパイクすると今のprovisionedだと捌ききれないけど、限られた場合な気がするのと、オートスケールすれば一過性。
- そして溢れた時それが実際にどれくらい影響あるか、食らってみないとわからない ≒ 食らってからon-demand検討すればよくね?って舐めた考えしている(実感を持ってon-demandにしたいとも言う)
DynamoDB Global Table
- global table の途中からの有効化は難しく、空のグローバルテーブル作成、 data pipeline を使ってデータの移行が必要.
DynamoDB の消費キャパシティをちゃんとグラフ化する
普通に既存のメトリックを選んでいじっても出来なくて、 Metric Math を取り入れて自分で計算しないといけない。 (詳細は https://www.georgeorge.com/blog/article/tech/aws-cloudwatch.html を参照。)
疑問: なんでこんなに需要がありそうなメトリックが提供されていないの???