TOP> コラム一覧>

いまさら聞けないRDSのお話し

はじめに

こんにちは、園田です。

前回に引き続き、「いまさら聞けない」シリーズを開催したいと思います。
いまさら聞けないシリーズの第3弾は「RDS」になります。

今回はみんな大好きリレーショナルデータベースのAWSマネージドサービスであるRDSについて語ります。
前回同様、基本から応用(?)まで幅広く記載していくつもりです。

なお、公式資料としてはAWSさんからBlack Beltシリーズが詳しくサービス説明をしています。URLを載せておきます。
いつも通り、AWS Black Beltは見ずに園田がAWSのサービスについて紹介したいと思います。

AWS サービス別資料

https://aws.amazon.com/jp/events/aws-event-resource/archive/?cards.sort-by=item.additionalFields.SortDate&cards.sort-order=desc&awsf.tech-category=*all

※ フィルターにてサービス名(今回だとRDS)を入力してください。

RDSってなに?

まずは、RDSの説明から実施しましょう。
RDSはAmazon Relational Database Serviceの略になります。

なのでリレーショナルデータベース(以下、RDB)になります。

ちなみにAWSでは以下のように色々なDBサービスがありますが、その中で最もメジャーなのがRDSになります。
簡単に各種類のDBを見てみましょう。

  1. Amazon RDS
    リレーショナルデータベースです。今回説明するDBとなります。
  2. Amazon Redshift
    DWH(データウェアハウス)になります。
    まぁ、大体RDBと一緒ですが、RDBが行指向となっているのに対し、DWHは列指向となっているのが異なる点です。
  3. Amazon DynamoDB
    NoSQLデータベースになります。
    一貫性を保証しない代わりに柔軟性、拡張性に優れています。
  4. Amazon ElastiCache
    インメモリのNoSQLデータベースになります。
    一時的にデータを保存する(セッション保持、よく使うデータの一時的な置き場)際に利用します。
  5. Amazon DocumentDB
    MongoDBと互換性がある高速なドキュメント型データベースサービスです。
    こちらもNoSQLデータベースになります。
    基本はDynamoDBでよいと思いますが、MongoDBからの移行という事であればDocumentDBを使う方が良いでしょう
  6. Amazon Keyspaces
    Apache Cassandraと互換性のある分散データベース管理システムです。
    分散データベースなので、大量のデータを収集し、解析や分析を行う際に良く利用されます。
  7. Amazon Neptune
    グラフ指向データベースサービスになります。
    友達とかを管理する際にグラフ指向データベースだと効率よく管理が出来ます。(というか、RDBだと無理)
  8. Amazon Timestream
    時系列データベースサービスになります。
    IOTの機器などから収集したデータを時系列に分析する際に効率よく利用が出来ます。
  9. Amazon QLDB
    台帳データベースサービスになります。
    ブロックチェーン技術を応用しており、改竄が実施できないようになっています。
  10. Amazon Aurora DSQL
    リージョンを跨いで、アクティブ/アクティブの高可用性を持つ分散SQLデータベースになります。
    Google Cloud の Spannerに対抗するサービスとなります。

簡単といいましたが、たくさん種類があるので説明は簡単でも読むのは大変です。
実際にはRedshiftの中にもRedshiftサーバレスとか、DynamoDBの中にもグローバルテーブルとかDAXがあることを考えると、恐ろしい種類のDBがあることが分かります。

いっぱいあって大変ですね。

DBがいっぱいあって大変なんですけどー

こんなにたくさんDBがあって大変なので1つにして欲しいんですけどー。
という事を思う人もいるかもしれませんね。

これだけ種類がたくさんあるのはAWSの思想によるものです。
思想というと分かり難いので、まずはこれの対極となる製品でもご紹介しましょう。

その製品とはみんな大好き、Oracleの「Exadata」になります。
Exadataいいですよね。Exadataがあれば大体何でもできます。(グラフ指向とか無理ですけど)

DWHは列指向になるため、基本DWHではオンライントランザクションは向いていません。
一方RDBは行指向となるため、オンライントランザクションには向いていますが、大量のデータを取り扱うには時間が掛かります。
そのため、ユーザがデータの特性を考え、DBを変えるのが一般的ですが、Exadataの場合はExadataにお任せすることが出来ます。
要するに考えなくてもイイ感じ使えるわけです。

その一方でExadataのネックは価格です。Exadataが色々やってくれる分、お値段に上乗せされています。

AWSでは
「それぞれの環境において、最適なサービスは実現したい要件により異なり、ユーザがそれを選択するのが最もパフォーマンスが出る」と考え、様々なサービスを提供しています。

そのため誤ったサービスを使ってしまうとパフォーマンス的な問題(併せてコスト的な問題)が出てしまいますが、一方できちんとアーキテクチャを考慮し正しいサービスを選択することで、高パフォーマンス・低価格が実現できるという思想になります。

AWSを使うという事は「アーキテクチャをきちんと知ること」、「考えること」を要求されるわけです。
めんどくさい話ですね。

RDSってどんなサービスなの

AWSの思想を理解した所で、RDSのお話に戻りましょう。
RDSはAWSがマネージドサービスとして提供しているRDBのサービスになります。

要するにRDSを作成するとDBがインストールされている状態になっている。という事ですね。
DBの種類はこんな感じで選択が可能です。

エンジンのオプション
  • Aurora(MySQL互換) ← AWS独自
  • Aurora(PostgreSQL互換) ← AWS独自
  • MySQL
  • PostgreSQL
  • MariaDB
  • Oracle
  • Microsoft SQL Server
  • IBM Db2

AuroraはAWSが開発したDBとなります。
Oracleについてはstandard、Enterpriseのどちらのエディションも利用可能です。(Enterpriseはライセンス持ち込みのみ対応)

大体メジャーなRDBは網羅しているのではないでしょうか。
以前、Db2は対応していませんでしたが、アップデートにより対応しました。

このようにDBを選択して構築する形になるため、構築完了後は既にDBがインストール、初期設定が実施されている状態となり、いきなりSQLコマンドでDBにログインが可能です。

簡易に確認したい場合、cloud shellをVPC内部で起動し、mysqlコマンドなどDBへの接続コマンドを実行することで接続確認が可能です。意外と稼働確認にも便利です。cloud shell

初期設定についてですが、SQLでアクセスするとDBが出来ている状態(create dbコマンドが実行された状態)となっています。DB名はRDS作成時に使用した名称となっています。

RDS内でcreate dbコマンドを実行することでいくらでもDBを作成することが出来ますが、基本はマネジメントコンソール上のRDSと実際のDBを1対1にしておいた方が管理性に優れると考えるのでDBを作ることは個人的にはお勧めしません。
(作ってもいいけど、きちんと管理しようね)

RDSの可用性について

可用性ですが、シングル(1台構成)、マルチ(冗長構成)を構築時選択可能です。(後でも変更可能です)
それぞれのSLAはこんな感じです。

シングル

稼働率 返金
99.0%以上、99.5%未満 10%
95.0%以上、99.0%未満 25%
95.0%未満 100%

マルチ

稼働率 返金
99.0%以上、99.95%未満 10%
95.0%以上、99.0%未満 25%
95.0%未満 100%

まとめるとシングルは99.5%/月、マルチは99.95%/月となります。
可用性が必要なときはマルチ(冗長構成)にしておきましょう。

シングルとマルチの差異

シングルは1台構成、マルチは2台構成となり、機器の構成が異なるのですが、機器の構成以外にも以下のような差異があります。

コミット時の動作

コミット時の動作ですが、シングル構成の場合、当たり前ですが1台のサーバに書き込みを行い完了となります。シンプルですね。
マルチの場合、例えば「DB A(プライマリ)」、「DB B(セカンダリ)」という構成であった際、どのような動作となるか見てみましょう。

データをinsertしてcommitする場合の動作は以下の通りです。

  1. DB Aにデータを書き込み
  2. DB Bにデータを書き込み
  3. DB Bでデータをcommit
  4. DB Aでデータをcommit

何が言いたいかというとデータをcommitするためには両方のDBにcommitする必要がある。という事です。
この両方のDBにコミットすることでRDSはDBの完全同期を実現しています。

これ自体は特に問題ではありませんが、
AZが異なるDBに書き込み必要がある、ということで多少のオーバヘッドが発生します。
(マルチ構成の場合、必ず別のAZにDBが作成される形となります。)

具体的には1~2ミリsecの遅延となります。

AWSはリージョン内でAZを「100km (60 マイル) 以内に配置」としていますが、これはこれ以上AZの距離を離してしまうとRDSを適切に利用できない。という課題があるため、100km以内の距離としています。
(光の速度であれば100kmにかかる時間は333マイクロ秒程度ですが、色々機器を挟んでいるので1ミリ程度はかかります。)

なので、シングル構成と比較し、マルチ構成は若干動作が遅くなります。
(書き込み処理だけです。読み込みはマスターから読み込むだけなので、速度は一緒です。)
どうしても書き込み処理に速度が重要という場合は、「シングル」にするという選択肢もありえます。

DBのサブネット

シングルの場合、サブネットを選択可能です。
マルチの場合は、AZを跨ぐサブネットを2つ選択する形となりますが、「マスターをどのサブネットにする」という選択はできません。
要するに、「APサーバ、RDSのプライマリを必ずサブネットAに配置したい」という場合、マルチ構成では実現できないという事です。

なお、マルチ構成の場合、望ましくないサブネット側がプライマリになってしまったという場合、RDSを再起動することで、強制的にプライマリを変更することが可能です。

とはいえ、AWSのメンテナンスとかでプライマリ、セカンダリは変更なることもあるので、そんな運用をするのであれば、シングルにすれば、と思いますが…。

メンテナンス時の動作の差異

細かい点ですが、メンテナンス時に動作も異なります。
シングルの場合、対象に対しバージョンアップを実施するため、数分(大体5分程度ですかね。DBの種類によって異なります。)DBが利用不可となります。
※ Auroraのみアーキテクチャが異なります。こちらはDBがMysqlやPostgreSQLの場合です。

一方マルチ構成(「DB A(プライマリ)」、「DB B(セカンダリ)」)の場合、

  1. 「DB B(セカンダリ)」をアップデート
  2. プライマリ、セカンダリの入れ替え
  3. 「DB A(プライマリ→セカンダリに変更された)」のアップデート

という動作となります。

使えない時間は「2.プライマリ、セカンダリの入れ替え」の時間帯のみとなります。
要するにメンテナンス時間が短いという事です。

なお、プライマリ、セカンダリは入れ替わったままです。戻したい場合は、手動でマスターをリブートする必要があります。

RDSのいいところ

EC2の上にDBを作成するのと比較して、RDSのいいところを挙げていきましょう。
AWSのBlack Beltだとこんな感じで記載されていますね。

データベース管理のフルマネージド化による運用負荷の軽減
データベース管理のフルマネージド化による運用負荷の軽減

ブラックベルトは置いておいて園田が考えるメリットでも記載しておきましょう。
大きく分けて3つです。

  1. パッチあてなどを自動で実施してくれる
    マイナーパッチを自動で適用してくれます。(適用しない設定にもできます。)
    また、EOSの管理はAWS側で実施してくれます。
    • 裏を返せば、自動的にパッチが適用されちゃう。EOSに伴うバージョンアップを実施しないといけないという事です。塩漬けは出来ません。
      こちらは個人的には良いことだと思いますが、アプリ等の要件によりバージョン等が固定されている場合は使えない理由になってしまいます。
      (そんなアプリは捨ててしまったほうが良いのでは、と思いますが…)
  2. 冗長化が簡単
    ボタン一つでマルチ構成に実施できます。
    DBの種別にも依りますが、リードレプリカなど負荷を分散する仕組みも簡単に実装可能です。
  3. パフォーマンスの確認が簡単
    パフォーマンスを分析してチューニングを実施する、障害発生時のトラブルシュートをしたい、という時に「RDS Performance Insights」でDBの状況を把握できます。
    (もう、STATSPACKでデータを取得しなくても大丈夫!)

ちょっとだけ費用が掛かりますが、何かあった際の保険として必ず有効にしておきましょう。
ちなみにPerformance InsightsはDBの種別とインスタンスタイプによっては利用できないものがあるので必ずこちらを確認しておきましょう。

意外と色々見れたりします。例えば、以下を確認できます。

  • 平均アクティブセッション
    処理中または処理開始を待ちのセッションの数が確認できます。
    処理開始待ちが多いと処理しきれていないことが分かります。
  • トップSQL
    どのクエリ(SQL)がDBロードの最も大きな原因になっているかを確認できます
  • 待機イベント
    データベースで操作を行った際にCPU、ディスクへのI/O、ソケットへのI/Oなど待機が発生するイベントについてクエリやトランザクション単位で確認が出来ます

こんなツールが標準で使えるなんて良い時代になったものです。

Amazon Auroraってなに?

AWSが作ったDBエンジンになります。
さすがにいまさら新規というのは難しいので、MySQLまたはPostgreSQLと互換という形になっています。

どうしてもoracleを使いたい、とかSQLサーバを使いたい、といった要件が無い場合はAmazon Auroraを使いましょう。
AWSが開発しているのでサポートも手厚くなります。

また、基本Oracle等のDBが所謂オンプレミスにて利用することを想定しているのに対し(オンプレミスしかなかったので当たり前ですけど)、Amazon Auroraはクラウド上(AWS上)で利用することを前提としています。

そのため、オンプレミスのようにリソースに制約があるとか、ハードウェアの構成は色んなパターンがある、などの前提をすっ飛ばし無限のリソースがあるクラウド上ではどのようなアーキテクチャが最適か、という視点で作られています。

その結果、

  1. ディスク勝手にスケールアウト
  2. 任意の時点に秒単位で復元可能
  3. 障害発生時、約30秒でフェールオーバ可能
  4. 高耐久性の実現(データは3AZに6つのデータとして保持)
    • AZ障害時も影響を受けず。また同時に3つのディスクに障害が発生しても読み取り可能

など、旧来のDBエンジンでは難しかったことを実現しています。

まぁ、新規でRDBを作る必要がある際は、Auroraが良いです。
AWSのメリットを一番享受できます。

終わりに

という訳で、「いまさら聞けないRDSの話」でした。
結構RDSも長かったですね…。

とはいえ、ただのRDBなので、正直そんなに難しくないですね。
前提知識も要りませんし。

最後にAmazon Auroraの話をしましたが、既存のDBが悪いという訳ではなく色々制約がある中で最善をつくしたアーキテクチャ設計がクラウドの出現により前提が覆されているというのは面白い話だなと思っています。

昔はDBと言えばOracle、100歩譲ってもSQL Serverとか。所謂RDBしかなかったのに、気がつけばRDB以外の色んなDBが利用されるようになっていますね。

DBエンジニアも昔より深い知識と経験が求められる時代になったんだと感じます。
時代に置いて行かれないように頑張って勉強しましょう。

ではまた、別の記事でお会いしましょう。

関連コラム

お問い合わせ

【著者プロフィール】

園田 一史(そのだ かずし)

伊藤忠テクノソリューションズ株式会社 クラウドアーキテクト

AWSの導入・運用支援サービス「CUVIC on AWS(キュービック オンエーダブリューエス)」の運営を担当。大規模DCのNW設計・構築、また国産IaaS型クラウドサービスの企画・導入・設計を歴任。物理・仮想基盤の設計、構築経験を活かし、AWSの導入・構築の支援をサポート。2019年~2025年APN Ambassadorに選任。

園田 一史(そのだ かずし)

pagetop