AWS Database Specialty 対策2

前回に引き続いて、試験勉強で学んだことを箇条書きにしています。
あくまで個人用メモレベルです。

LSIとGSIの使い分け

公式ドキュメントはこちら。

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html

  • そもそもセカンダリインデックス
    • プライマリキー(DynamoDBの場合はパーティションキー+ソートキーによる複合PKを指す)以外の属性を使って効率的にアクセスするため
    • テーブル単位
    • ベストプラクティスとしてはGSIの使用を推奨
      • 例外となるのは強力な整合性を求める場合、など
  • グローバルセカンダリインデックス(GSI)
    • パーティションキーとソートキーを独自に持つ。複合PK。
      • キーの属性は任意(文字列、数値、バイナリ)
    • パーティションキーによるサイズ制限なし
      - 既存テーブルへの追加OK
    • テーブル全体に対してクエリ実行
    • 結果整合性のみ
    • 独自のスループット設定を使用(ベーステーブルのキャパは使わない)
    • 射影はインデックスに射影されたもののみ
  • ローカルセカンダリインデックス(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を追加して対策
おすすめの記事