データベースに関して（AWS）

### データベースに関して
データベースとは関連したデータの形式をそろえ、収集・整理し検索などの操作やデータ管理を実行するシステム。データを集めるだけでなくコントロールしたり制御したりする役割がある。このデータベースを実現したシステムをDBMSという。データベースはデータの追加・参照・更新・削除などのデータ操作を容易に実行するソフトウェアやデータモデルと一体になったものです。この追加・参照・更新・削除を総称してCRUDと呼び、このCRUDを実現するのがデータベースになります。データベースはデータベースを異状なく実行することが出来、データを安全に保護しつつ、保存・操作ができる仕組みを提供している。
データベースには大きく「リレーショナルデータベース」と「非リレーショナルデータベース」の2つに分けられる。非リレーショナルデータベースをNoSQL DBとも言い、リレーショナルデータ構造を持たないデータであるため、画像・音声・JSON・テキストなどが例としてあげられる。


・データベースとストレージの違い
データベースとストレージの違いは、ストレージはコンピューターの主要な構成要素の一つで、データを永続的に記憶する装置である。単純にデータを保存するものとしてとらえておけばいいでしょう。対して、データベースはストレージやデータを管理し運用するソフトウェアと一体となったもの。

### AWSのサービス

リレーショナルデータベース…RDS
データウェアハウス…Redshift
データレイク…S3
キーバリュー型…ElastiCache,DynamoDB
ワイドカラム型…DynamoDB

データの蓄積…S3、Glacier,Glue
ストリームデータ処理…Kinesis
大量データの解析手法…Athena,EMR,QuickSight,Redshift

### RDS
RDSはさまざまなデータベースソフトウエアに対応したフルマネージドなリレーショナルデータベースです。AWSでのデータベース構築では大きく2つの方法があります。一つはEC2に自らインストールを行い構築する方法。2つ目はRDSやDynamoDBといった専用DBサービスを利用する方法の二通りです。RDSは後者になります。EC2は自ら構築・運用をする反面、専用DBは構築や管理が容易です。
RDSの特徴としてはマネージド型の高可用であり、マルチAZによるMaster/Slave構成を容易に構築することができる。(Slave:スレーブはサブのデータベースみたいなもの,masterは複数のslaveを持つことが出来てもslaveは複数のmasterを持つことはできない。slaveはmasterを一つしか持てない。)また、参照専用のレプリカ（リードレプリカ）を最大5台（Auroraは15台）設置しDBの読みとり処理をスケールアウトすることができる。これは更新用と読みとり用でデータベースを分けて負荷を分散させることができるということ。自動/主導でスナップショットを取得・保存・管理し耐障害性を確保することができる。
データベースシャーディングを利用してRDSの書き込み処理をスケーリングすることも可能。簡単に言うと複数のRDSを用意しID0~100はAのRDSに書き込み、ID101~200はBのRDSに書き込み……みたいな感じのことがデータベースシャーディングを利用することで可能。
暗号化の対象としてはスナップショット・DBインスタンス・リードレプリカ・自動バックアップがある。
EC2からRDSにつなげるにはRDSのエンドポイントが必要になってくる。

### DynamoDB

DynamoDBは完全マネージド型のNoSQLデータベースサービスです。完全マネージド型であるため、データベーステーブルを作り、スループットを設定するだけで処理を自動的に行ってくれます。DynamoDBはデータの格納と取得に特化（高度な最適化）されており、1桁ミリ秒単位のレイテンシーを要求するアプリケーションにも対応している。プロビジョンスループットという特徴があり、CRUDに応じて実用なスループットキャパシティを割り当てることも可能です。高速に処理を行うためにDynamoDBはパーティショニングを行っています。AWSではプライマリーkeyを設定する項目があるのでそこでパーティションkeyも同時に設定する。
できることとしてはキーに対するバリューのCRUD操作であったり、簡易なクエリやオーダーが出来たりします。逆に不向きなこととしては、COMMIT,ROLLBACK,TRANSACTIONや詳細なクエリやオーダーがあげられます。ゲームのようにアクセスが多いものはDynamoDBが有用。
テーブルの設計手順としてはテーブル→項目（アイテム）→属性の順番で設計を行う。テーブルの中に複数の項目があり、各項目の中に複数の属性があるという感じ。
ハッシュキーはキーバリュー型でいうキーに相当するデータを一意に特定するためのIDなどのこと。パーティションを決定する際にも使用する。またDynamodbではハッシュキーのみでデータを特定できないことがあったりする。その際にはレンジキーというものがあり、このレンジキーとハッシュキーの2つの組み合わせによって一つの項目を特定するといったことができる。ただ、これだけでも特定することが難しいときがある。その際にはLSIやGSIを使用して特定する。くわしくは「<a href ="https://qiita.com/shibataka000/items/e3f3792201d6fcc397fd">DynamoDBのキー・インデックスについてまとめてみた</a>」を参照するといいです。

### Aurora
Auroraは新しい分散型のリレーショナルデータベースとして誕生した。MYSQLに比べて2.5~5倍の性能があるといわれている。これはRDSにおいてデータベースソフトウエアの一つとして選択される。高い並列処理によって大量の読み書きをするのに適したデータベース。MySQL/PostgreSQLとの互換性がある。詳しい内容は「<a href ="https://agency-star.co.jp/column/amazon-aurora">Amazon Auroraの特徴と使い方を解説！Amazon AuroraとRDSの違いや料金設定・導入のメリットも比較</a>」を参照。

### EFS
EFSは複数のEC2インスタンスからアクセス可能な共有ストレージです。AWSでのおもなストレージは3つS3,EBS,EFSです。S3はオブジェクトストレージでリージョンに設置し、大容量のデータを長期保存するためのもの。EBSはブロックストレージでAZに配置し、複数のインスタンスにアタッチすることはできない。EFSはNASに似たファイルストレージであり、複数のEC2 インスタンスでの共有アクセスが可能。EFSのデータファイルは複数AZに分散して保存されている。EC2インスタンスは同じAZ内にあるマウントターゲットから接続を行う。そのためEC2は直接EFSに接続するのではなく同じAZ内にあるマウントターゲットからEFSにアクセスすることができる。EFSを使用する場合としては複数のEC2インスタンスでデータを共有する際にEFSを使用するという感じです。EFSはNFSプロトコルを使用するのでNFSを使用できるようにセキュリティーグループを設定する必要がある。

### Kinesis
ストリームデータを収集・処理するためのフルマネージド型サービス。主に3つのサービスで構成されている。
Amazon Kinesis Data Streams…ストリームデータを処理するアプリケーションを構築
Amazon Kinesis Data Firehose…ストリームデータをS3やRedshiftなどへ簡単に配信
Amazon Kinesis Data Analytics…ストリームデータを標準的なSQLクエリでリアルタイムに可視化・分析
ストリーム転送はログのように常時発生し続けるデータで使用すると便利。

Amazon Kinesis Data Streams
Kinesis Streamsは次々と送られる大量のデータをリアルタイムに収集し、次のサービスに配送するためのサービスです。Kinesis Firehoseに比べて速い。Streamsはストリーミング処理をシャードに分散して実行するため、高速処理が可能です。そのため、シャードを増やすことによって負荷を分散しストリームの処理が上がる。
データの流れとしては「プロデューサー」→「ストリーム」→「コンシューマー」です。プロデューサーは、ストリームへデータを送信し、コンシューマーはストリームからデータを受け取って処理を行う。

Amazon Kinesis Data Firehose
Kinesis Firehoseは設定を行うだけで、次々と送られる大量のデータをRedShiftやS3に流し込むサービスです。 lambdaと連携してETLとしても機能することができる。

Amazon Kinesis Data Analytics
コンピュータやAmazon Kinesis Data Streams、Amazon Kinesis Data Firehoseから送信されてくるデータをSQLを使って処理できるサービスです。

### Redshiftに関して
Redshiftは高速でスケーラブルな費用対効果の高いマネージド型のDWH/データレイク分析サービス。かなりのデータ量を処理することができる。処理の負荷が高くなったら、コンピューティングノードを増やすこともできるし、それでも足りない場合はクラスターを追加することもできる。AWSでデータレイクを作成してそこを分析するというのもRedshiftの役割になってくる。Redshiftは列指向型のリレーショナルデータベースであるため、データを分散・高速処理が可能な仕組みになっている。マネジメントコンソール画面からRedShiftデータベースに接続してクエリを実行することも可能。
もし自分自身が管理するS3バケットに対して直接データ解析をしたい場合は、Redshift Spectrumを使用する必要がある。



＜参考にさせていただいたサイト＞
<a href = "https://jpn.nec.com/clusterpro/blog/20180115.html#:~:text=%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D-,1.%20VPC%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88,%E3%81%A7%E3%81%8D%E3%82%8BAWS%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%A7%E3%81%99%E3%80%82">AWS VPCエンドポイントを利用したHAクラスターの構築を試してみました (Windows/Linux) </a>
<a href = "https://www.storage-channel.jp/blog/snapshot-replication.html">ストレージのスナップショットとレプリケーションの違いとは？</a>
<a href ="https://dev.classmethod.jp/articles/cm-advent-calendar-2015-aws-re-entering-dynamodb/">AWS再入門 Amazon DynamoDB 編</a>
<a href ="https://qiita.com/shibataka000/items/e3f3792201d6fcc397fd">DynamoDBのキー・インデックスについてまとめてみた</a>
<a href ="https://agency-star.co.jp/column/amazon-aurora">Amazon Auroraの特徴と使い方を解説！Amazon AuroraとRDSの違いや料金設定・導入のメリットも比較</a>
<a href = "https://dev.classmethod.jp/articles/difference-between-kinesis-streams-and-kinesis-firehose/">Amazon Kinesis StreamsとAmazon Kinesis Firehoseは何が違うのか </a>
<a href = "https://qiita.com/yShig/items/500d4139efed91bc432d">[AWS]kinesisまとめ</a>
<a href = "https://techblog.nhn-techorus.com/archives/8232">Amazon Redshiftって何ができるの？AWSのデータウェアハウスサービスを解説</a>
<a href = "https://qiita.com/leomaro7/items/d72eca73154f0609bf61">Amazon Redshift</a>
<a href = ""></a>
<a href = ""></a>
<a href = ""></a>