
前回に引き続いて、試験勉強で学んだことを箇条書きにしています。
あくまで個人用メモレベルです。
LSIとGSIの使い分け
公式ドキュメントはこちら。
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html
- そもそもセカンダリインデックス
- プライマリキー(DynamoDBの場合はパーティションキー+ソートキーによる複合PKを指す)以外の属性を使って効率的にアクセスするため
- テーブル単位
- ベストプラクティスとしてはGSIの使用を推奨
- 例外となるのは強力な整合性を求める場合、など
- グローバルセカンダリインデックス(GSI)
- パーティションキーとソートキーを独自に持つ。複合PK。
- キーの属性は任意(文字列、数値、バイナリ)
- パーティションキーによるサイズ制限なし
- 既存テーブルへの追加OK - テーブル全体に対してクエリ実行
- 結果整合性のみ
- 独自のスループット設定を使用(ベーステーブルのキャパは使わない)
- 射影はインデックスに射影されたもののみ
- パーティションキーとソートキーを独自に持つ。複合PK。
- ローカルセカンダリインデックス(LSI)
- パーティションキーはベースと同じで、ソートキーのみ異なる。
- キーの属性はベースと同じ
- パーティションキーごとに合計サイズが10GB以下
- 作成タイミングはテーブル作成時。既存テーブルへの追加NG
- パーティション単位でクエリ実行
- 結果整合性か強い整合性か選択可能
- ベーステーブルのキャパを使用
- 射影はインデックスに追加されてなくてもテーブル内の属性を指定可能
- パーティションキーはベースと同じで、ソートキーのみ異なる。
ElastiCacheのクラスターモード
https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Replication.Redis-RedisCluster.html
- クラスター有効
- データはパーティション化されている
- エンドポイントが複数提供されるため、負荷分散できる
- シャードが500まで増やせる(リードレプリカもシャードに応じて)
- クラスターのスケーリングが発生するとパフォーマンス(主にCPU)に影響が出る
- リシャーディングが必要となるため、時間がかかる
- オフピーク時にリシャーディングさせるような計画が必要
- データはパーティション化されている
- クラスター無効
- ノードに対して最大5つのリードレプリカが上限
- 書き込み負荷に対しては単一ノードしか提供されない
Aurora グローバルデータベース vs DynamoDB グローバルテーブル
- グローバルデータベース
- リージョン間で1秒未満のレプリケーションを提供
- マスターはシングル(レプリケーションは読み込みのみ)
- プライマリに障害発生時、FOするまで書き込み使用不可
- 書き込んだ内容はマスターインスタンスに同期される
- グローバルテーブル
- 書き込み用インスタンスもグローバルに展開
- 容量計画には注意、展開したリージョン分の考慮が必要
- トランザクション機能を使用する場合、最初に書き込みが行われたリージョンのみACIDが担保される
ElastiCache キャッシュ方式
https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/mem-ug/Strategies.html
- 遅延読み込み
- 必要なときだけキャッシュにデータを読み込む
- 具体的には、キャッシュミスした場合、データストアから取得したデータをキャッシュに書き込む
- メリット
- リクエストされたデータのみをキャッシュするから、データがいっぱいになることは少ない
- ノード障害が発生してデータが無くなっても、レイテンシの増加だけで致命的ではない
- デメリット
- キャッシュミスをするとデータ取得にレイテンシが発生する
- キャッシュのデータが古い事がある
- 問題になる場合は、ライトスルーかTTLの追加を検討
- ライトスルー
- データがデータストアに書き込まれると常にキャッシュを更新する
- メリット
- データが常に最新を保つ
- データの取得が早い。対して書き込みは遅いが、一般的にはそこまで問題視されない
- デメリット
- ノード障害やスケールアウトが発生し、新規ノードになるとデータが欠落する
- ライトスルーを伴った遅延読み込みで対応
- キャッシュの殆どは読み込まれないので、無駄なリソースが発生する
- TTLを追加して対策
- ノード障害やスケールアウトが発生し、新規ノードになるとデータが欠落する