AWS: データベースサービス

# データベースサービス
- RDS
- Redshift
- DynamoDB
- ElasticSearch

### データベースの2大アーキテクチャ
- RDB
    - 各表の関係を定義・関連付けすることでデータを管理するDatabase
    - SQL(Structured Query Language)を使用する
    - サービス例：Orale, Microsoft SQL Server, MySQL, PostgreSQL, Sqlite
- NoSQL(Not Only SQL)
    - SQLを使わないDatabase Architecture(= NoSQL)
    - 様々なデータモデルがある：スキーマレスなデータモデル, 水平スケーラビリティ, 分散アーキテクチャ, 高速な処理
    - サービス例：DynamoDB, ElasticCache, Neptune, Redis

## RDS
### RDSで使えるストレージタイプ
- 汎用SSD
- プロビジョン度IOPS SSD
- マグネティック

の3つが利用することできる。

### RDSの特徴
- マルチAZ構成
    - 1つのリージョン内の2つのAZにDBインスタンスをそれぞれ配置し、障害発生時やメンテナンス時のダウンタイムを短くする
    - 2つのAZ間でデータを動機するためシングルAZ構成よりも書き込みやコミットにかかる時間が長くなる
    - フェイルオーバーには60~120秒かかる
        - フェイルオーバー時、RDSへの接続用FQDNのDNSレコードが、スタンバイ側のIPアドレスに書き換えられる
        - アプリケーション側でDB接続先のIPのキャッシュを持っている場合、RDSに接続できるようになるまでに120秒以上かかる事がある
- リードレプリカ
    - 通常のRDSとは別に、参照専用のDBインスタンスを作成することができるサービス
    - リードレプリカを作成することで、マスターDBの負荷を抑えたり、読み込みが多いアプリケーションにおいてDBリソースのスケールアウトを容易に実現することができる
    - マスターとリードレプリカのデータ動機は非同期レプリケーション方式のため、タイミングによってマスターの更新がリードレプリカに反映されないことがある
- バックアップ/リストア
    - 自動バックアップ
        - バックアップウィンドウと保存期間を指定することで1日に1回自動バックアップを取得してくれるサービ
    - 手動スナップショット
        - 任意のタイミングでRDSのバックアップを取得できるサービス
    - データのリストア
        - RDSにデータをリストアする場合、自動・手動バックアップで作成したスナップショットからRDSを作成できる
    - ポイントインタイムリカバリー
        - 直近5分~最大35日前までの任意のタイミングの状態のRDSを新規に作成することができるサービス
- セキュリティ
    - ネットーワークセキュリティ
        - RDSはVPCに対応しているため、インターネットに接続できないAWSのVPCネットワーク内で利用可能
        - DBインスタンスを生成する際にインターネットから接続するというオプションも選択可能(Default: False)
    - データ暗号化
        - 暗号化オプションをTrueにすることで、データが保存されるストレージやスナップショットだけでなく、ログなどのRDSに関連するすべてのデータが暗号化された状態で保持される

### Amazon Aurora
- Auroraの構成要素
    - Auroraでは、DBインスタンスを作成すると同時にDBクラスタが作成される
    - DBクラスタは1つ以上のDBインスタンスと、各DBインスタンスから参照するデータストレージで構成される
- Auroraレプリカ
    - Auroraは他のRDSと異なりマルチAZ構成オプションはない
    - Auroraクラスタ内に参照専用のレプリカインスタンスを作成することができる
    - プライマリインスタンスに障害が発生した場合にレプリカインスタンスがプライマリインスタンスに昇格することでフェイルオーバーを実現可能
- エンドポイント
    - クラスタエンドポイント
        - Auroraクラスタのうち、プライマリインスタンスに接続するためのエンドポイント
    - 読み取りエンドポイント
        - Auroraクラスタのうち、レプリカインスタンスに接続するためのエンドポイント
    - インスタンスエンドポイント
        - Auroraクラスタを構成する場合、各DBインスタンスに接続するためのエンドポイント

## Redshift
### Redshiftの構成
- Redshiftクラスタ: 1つのRedshiftを構成する複数のノードの集合
- クラスタは、1つのリーダーノードと複数のコンピュートノードから構成される
    - リーダーノード: SQLクライアント・BIツールからの実行クエリを受け付けてクエリの解析や実行プランの作成を行う
    - コンピュートノード: リーダーノードからの実行クエリを実行クエリを処理する
    - ノードスライス: Redshiftで分散並列処理をする最小の単位

### Redshiftの特徴
- 列指向型のデータベース
    - 集計処理に使われっるデータをまとめて(列単位で)管理し、ストレージからのデータ取得を効率化する
    - 大容量のデータに対して集計処理を実行する場合に優れたパフォーマンスを発揮する
- ゾーンマップ
    - Redshiftではブロック単位でデータが格納される
    - ブロック内に格納されているデータの最小値と最大値をメモリに保存する仕組みを指す
    - この仕組を活用することで、データ検索条件に該当する値の有無を効率的に判断でき、データが存在しない場合はそのブロックを読み飛ばして処理を高速化する
- 柔軟な拡張性
    - MPP: 1回の集計処理を複数のノードに分散して実行する仕組み
    - シェアードナッシング: 各ノードがディスクを共有せず、ディスクセットで拡張する仕組み
- Redshift Spectrum
    - S3に置かれたデータを外部テーブルとして定義できるようにし、Redshift内にデータを取り込むことなくクエリの実行を可能にする拡張サービス

## DynamoDB
### DynamoDBの特徴
- 高可用性設計
    - 単一障害点(SPOF)を持たない構成
    - サービス面で障害対応やメンテナンス時の運用を考える必要がほとんどない
- スループットキャパシティ
    - Read Capacity Unit(RCU)
        - 1RCUは、最大4KBの項目に対して、1秒あたり1回の強力な整合性のある読み取り性能
    - Write Capacity Unit(WCU)
        - 1RCUは、最大1KBの項目に対して、1秒あたり1回の強力な整合性のある書き込み性能
- データパーティショニング
    - DynamoDBはデータをパーティションという単位で分散保存する
    - 1つのパーティションに対して、保存できる容量やスループットキャパシティが決まっている
- プライマリーキーとインデックス
    - プライマリーキー
        - Key-Value型のデータベースである
        - プライマリキーには、パーティションキー単独のものと、「パーティションキー+ソートキー」の組み合わせで構成されるもの(複合キーテーブル)がある
    - セカンダリインデックス
        - プライマリキーだけでは高速な検索要件を満たすことができない場合もあるため、セカンダリインデックスを利用する
        - ローカルセカンダリインデックス&グローバルセカンダリインデックス
            - ローカルセカンダリインデックス
                - プライマリキーはテーブルで指定したパーティションキーと同じで、別おの属性をソートキーとして作成するインデックスのこと
            - グローバルセカンダリインデックス
                - プライマリキーはテーブルで指定したパーティションキーと同じで、別の属性をソートキーとして作成するインデックス
- 期限切れのデータの自動メンテナンス(Time to Live(TTL))
    - DynamoDB内の各項目には有効期限を設定でき、有効期限を過ぎたデータは自動的に削除される
- DynamoDB Stream
    - DynamoDBに対して行われた直近24時間の追加・更新・削除の変更履歴を保持する機能
- DynamoDB Accelerator(DAX)
    - DynamoDBの前段にキャッシュクラスタを構成する拡張サービス

## ElastiCache
### Memcached版ElastiCacheの特徴
- クラスタ構成
    - Memcachedクラスタは、最大20のElasticCacheインスタンスで構成される
    - エンドポイント
        - ノードエンドポイント: 各ノードに個別アクセスするためのエンドポイント
        - 設定エンドポイント: クラスタ全体に割り当てられるエンドポイント
- スケーリング
    - 「スケールアウト」「スケールイン」「スケールアップ」「スケールダウン」の4つのスケーリングから必要に応じてリソースを調整可能

### Redis版ElastiCacheの特徴
- クラスタ構成
    - クラスタモードの有効/無効に応じて冗長化の構成が変わる
    - クラスタモード無効: キャッシュデータはすべて1つのElasticCacheインスタンスに保存される
    - クラスタモード有効: 最大15のシャードにデータを分割して保存する構成が可能