Alibaba CloudのPolarDBの徹底分析(2)_RDSよりはなぜPolarDBを選ぶべきか？

# PolarDBとRDS
## PolarDBとは
PolarDBはAlibaba Cloudが開発したCloud Native Databaseサービスです。MySQL・PostgreSQLは100%、Oracleは高い互換性を持ちながら、ユーザーのワークロードに応じて垂直・水平スケーリングすることが出来るため、コストを大幅に削減できることが特徴です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/7975cec7-634d-3263-d6c3-a77e2bdb3a97.png)

https://www.alibabacloud.com/product/polardb

## RDSとは
Alibaba Cloud Relationnal Database Serviceの略語であ、その名の通りRDBのサービスです。自前でRDBを構築する時にあたって面倒なシステムインストール、設定、バックアップ、可用性など面倒なところを、Alibaba Cloudがよしなりにやってくれる`managed service`です。

# RDSとPolarDBどちらを選ぶべきか
## PolarDBを第一に選択肢にする
基本的にはPolarDBを推奨します。性能、可用性、耐久性など各性能が高い上に便利な機能がいろいろ揃っているからです。
とはいえ、PolarDBが使えないケースやあえてRDSをつかうべきケースもあります。

## PolarDBが使えないケース
### 使いたいデータベースエンジンのバージョンがPolarDBで使えない場合
RDSで現在使えるdatabaseエンジンはMySQL,PostgreSQL,MariaDB,Microsoft SQL Serverの４つです。
PolarDBと100%互換性を持つのはMySQLとPostgreSQLのみですので、他の２つを使いたい場合は、RDSを選択するしかありません。
仮にMySQLやPostgreSQLを使う場合でも、使えるバージョンがRDSとPolarDBが異なる。

- 現在RDSで使えるversion list：
    - MySQL
        - 5.5
        - 5.6
        - 5.7
        - 8.0
    - PostgreSQL
        - 11
        - 12
        - 13
        - 14
        - 15

- PolarDBで使えるversion list:
    - MySQL
        - 5.6
        - 5.7
        - 8.0
    - PostgreSQL
        - 11
        - 14
    - Oracle:高い互換性(SQL文法上)

ということ、使いたいバージョンがPolarDBで使えない場合は、RDSを選択するしかありません。

### Database エンジンの新機能をいち早く使いたい場合
基本的に新機能先にRDSのほうが対応することになります。なぜかというと、PolarDBはあくまでもMySQLとPostgreSQLと「互換性」のもつDBであるからです。MySQLとPostgreSQLの新機能がリリースされてから、Alibaba CloudのDeveloperたちはPolarDBのアーキテクチャに合わせてPolarDBを改修する必要があるため、時間がかかるのです。
そのため、DBエンジンの新機能や新バージョンをいち早く試したい場合は、RDSを使ったほうがよいでしょう。
あまりおすすめできないのですが、場合によってはECSにMySQLやPostgreSQLを自前に構築し使うしかないかもしれない。

## RDSとPolarDBはどちらが安いのか？
RDSもPolarDBも主な課金ポイントはインスタンスとストレージの稼働時間による従量課金です。
PolaDBはRDSよりはインスタンスの従量課金の単位時間あたりの料金がちょっと高いです。
料金の比較は以下の記事をご参考ください。

https://qiita.com/dennis_wang/items/7ce9b4954a7a70a4a89b


## それでもなぜPolarDBを選ぶべきか
### master slaveの構成が不要
PolarDBはDBインスタンスが一台でもストレージ部分は3AZにまたがって6つのコピーをもつアーキテクチャです。つまりこの状態でも十分な耐久性があるわけです。

### stand-byレプリケーション不要
PolarDBはプライマリインスタンスがクラッシュした場合は、リードレプリカをプライマリインスタンスに自動的に昇格させることができる。
ところがRDSはこれができません。
RDSでは「ハイアベイラビリティ」構成(AWSの「Multi-AZ」の構成と似ていますが、内部ではmasterとslaveは同じAZと異なるAZのどちらでも自由に選択)を取る場合は、stand-byインスタンス(slave インスタンス)が自動的に作られますが、該当のインスタンスは普段はユーザーにサービスを提供せず、プライマリインスタンスが異常クラッシュした場合は自動的にfailoverし、プライマリインスタンスに自動的に昇格するというstand-byという役割だけを担い、リードレプリカとしてデータベースへの読み取り負荷分担することができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/9d3b51a0-1e94-e58b-5d4f-7f46bdc038f4.png)

- そのため、「ハイアベイラビリティ」かつリードレプリカ構成をする場合は、RDSでは最低インスタンス4台(プライマリインスタンス、stand-byインスタンス ２つ、リードレプリカインスタンス)から始める必要があります。
- PolarDBでは最小2台から始めることが可能です。
    - primary instance(readとwrite両方対応) 1台
    - read-only instance(standbyの役割を兼ねる) 1台
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/08031e02-3bae-b990-f179-0ee346be247f.png)

### ストレージ容量の指定が不要
RDSはインスタンスを作成する時に、明示的にストレージ容量を指定する必要があります(事前にどれぐらい容量が必要なのかは設計が必要)。多めにストレージ容量を用意することなので、使われていない分も課金されます。
PolarDB　はclusterを作成する時に、そもそもストレージ容量の指定不要です。必要に応じてデータベースインスタンスごとに最大100TBまで自動的にスケールされます。　`自動`でスケールアップするので、監視して対応する運用も不要です。


### レプリカ分のストレージ料金がかからない
RDSの場合は、レプリカごとにインスタンスとストレージを持っているため、インスタンスとストレージ両方課金されます。一方PolarDBはインスタンス間でストレージを共有するアーキテクチャなので、レプリカインスタンスをたくさん作ったとしても、追加課金されるのはインスタンスも従量課金だけです。

### レプリカインスタンスのスケールイン・スケールアウトの可能性
RDSではレプリカごとにインスタンスとストレージを持っています。レプリカはプライマリインスタンス本来やる読み込み処理をリードレプリカが代わりに処理することでプライマリインスタンスの負荷が下げられる。そして、リードレプリカはユーザーから書き込みのリクエストを受付しないのですが、内部ではプライマリインスタンスで実施された書き込み処理はすべて同期されて、すべての内容を自分のストレージに書き込む必要があります。したがって、RDSの場合、リードレプリカは読み込み処理も、書き込み処理もどちらも行っているわけです。
一方、PolarDBはインスタンス間でストレージを共有しているため、リードレプリカは書き込み処理をする必要がないため、PolarDBのリードレプリカは読み込み処理のみに集中できる。RDSで書き込みに使っていた分のリソースを節約できるため、レプリカインスタンスの台数を減らしたり、スペックを下げたりすることで料金を下げられる可能性が高いです。

### スケールイン・スケールアウトとスケールアップ・スケールダウンの速さ
RDSはレプリカごとにインスタンスとストレージを持っているアーキテクチャです。スケールアウトする時にはバックアップから新しいリードレプリカインスタンスを起動してから、binlogを取得し、バックアップ取ってからその時点までのすべての処理(create,update,deleteのクエリ)を順次的に実行する必要があります。リードレプリカが使えるまでの時間はやはり`データ量に応じて、数時間かかる`場合も非常に多いです。
一方、PolarDBはインスタンス間でストレージを共有するため、`5分程度`リードレプリカが使えることになります。
同様にインスタンスのスペックを上げたり下げたりすることもRDSはデータ量によりますが、PolaDBはデータ量によらず`5分程度`できることです。

### トータルコストで考える
PolarDBを利用する場合は、人的コストを抑えられるということです。
PolarDBには作業負荷を下げられる部分がたくさんあります。そもそもパフォーマンスがRDSよりは高いのでクエリチューニングを突き詰めなくても求められるパフォーマンスが出やすかったり、オペレーションミスしてもすぐ復旧できたりなどです。

https://qiita.com/dennis_wang/items/7ce9b4954a7a70a4a89b

# まとめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/cb580535-14c2-6147-b055-e975ae3ed3f8.png)


- 既存のサービスでは特定のデータベースエンジンのバージョンを使用しており、それをPolarDBに移行する場合は膨大な人的コストがかかります。そのため、同じデータベースエンジンを使用せざるを得ない特別な事情がない限り、基本的にはPolarDBの使用を推奨します。