Google Cloud の AlloyDB for PostgreSQL が GA されたので試してみる

# 概要

* 2022/12/13 に GCP より AlloyDB for PostgreSQL が GA したというニュースが発表された。
* 以前より気になってはいたのだが、今回はこの AlloyDB for PostgreSQL についてをざっくりまとめながら検証をしていこうと思います。
* そして T村さん GCP アカウント手配ありがとうございます。w

https://cloud.google.com/alloydb/docs/release-notes#December_13_2022

# AlloyDB for PostgreSQL

https://cloud.google.com/alloydb

* AlloyDB for PostgreSQL とは、要求の激しいエンタープライズレベルのデータベースワークロードに向いている PostgreSQL 互換のデータベースサービスです。

### 特徴１
* **標準の PostgreSQL と比較した時のパフォーマンステストで AlloyDB は トランザクションで4倍以上、分析クエリで最大100倍以上早かった**と公式ブログで伝えています。
* また、**Amazon の PostgreSQL 互換サービスと比較して 2 倍の速度でトランザクションを処理できるとも伝えています。驚きですね。**

### 特徴2

* AlloyDB は、メンテナンスを含めて99.99% のSLAを提供しています。
* データベースのサイズや負荷に関係なく、ほとんどのデータベース障害を数秒以内に自動的に検出して復旧すると明言しています。
* また、インスタンスのサイズ変更やメンテナンスにおいてデータベースが中断されない構造になっているとも言われていますね。

### 特徴3

* 冒頭でもお話ししたように、標準的な PostgreSQL と比較すると最大100倍以上の速度で分析クエリを実現するようです。
* これは、スキャンと集計を高速化するためにカラム型でメモリにデータを格納しているからのようですね。

### 特徴4

* 不要なコストを抑えることができます。
* 価格の算出方法がドキュメントにあるように予測可能で、独自のライセンスや不透明な I/O 料金みたいなものはありません。

### 特徴5

* マネージドなDBサービスなら当たり前だとは思いますが、AlloyDB はデータベースのパッチ適用、バックアップ、スケーリング、レプリケーションを自動的に処理してくれます。
* ただ、他と違うことが一点。
* それは、従来の PostgreSQL におけるバキューム管理、ストレージとメモリの管理、分析の高速化を行うためにワークロードを機械学習にかけストレージ全体でデータを整理してくれるようです。

## 使用できるリージョン

* asia-northeast1 (東京)
* asia-southeast1 (シンガポール)
* europe-west1 (ベルギー)
* europe-west3 (フランクフルト)
* us-central1 (アイオワ)
* us-west4 (ラスベガス)

## 料金

* 2022/12/13 になったものの、2022/12/31 までは 一定の利用であれば無料で使えるようです。
* 「Fair usage limits」が定められているので、そちらの条件は下記のドキュメントをご参照ください。

https://cloud.google.com/alloydb/pricing#fair-usage-limits

* じゃあ、2022/12/31 以降はどうなるかというと、AlloyDB for PostgreSQL の構成要素に依存し使用した分で課金されます。主にCPU、メモリ、ストレージ、ネットワークなどが料金に関係してくる要素です。
* 詳しくは上記のドキュメントをご参照ください。

# 検証してみた

* AlloyDB のアーキテクチャ的な解説記事は別途書かせていただきます。
* ということで、早速試してみましょう！

## はじめに

* まずはGCPにログインし、AlloyDB、Compute Engine、Resource Manager、Service Networking API を有効にする必要があります。

![スクリーンショット 2022-12-15 1.10.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/e312958a-27ad-f958-4f2f-db0aff3b9336.png)

## クラスターとインスタンスの作成

* GCP のコンソール画面からクラスターページに移動します。

![スクリーンショット 2022-12-15 1.15.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/0e24f486-196b-1177-2b71-b277ebae5d8f.png)


* いくつかクラスタタイプの選択を求められていますね。
* ここでは、高可用性としましょう。
* 「続行」を押すと次はクラスターの構成情報の入力を求められます。

![スクリーンショット 2022-12-15 1.16.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/0502d260-556f-0785-bed1-45eb5f9440ae.png)

* 諸々入力を求められるので、入力していきます。
* **１つ特徴的なのが、データベースのバージョンですね。PostgreSQL 14 互換がデフォルトで選択されており、変更できなさそうでした。**

![スクリーンショット 2022-12-15 1.19.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/113c96fe-bdf1-b393-5444-14b9529ed25a.png)

* ネットワーキングの設定が完了すると、「プライベートサービスアクセス接続は必須です」というラベルの付いたダイアログが表示されます。
* 「接続の設定」をクリックすると下記のようなモーダルが表示されます。
* 今回は、[自動的に割り当てられた IP 範囲を使用する] を選択します。

![スクリーンショット 2022-12-15 1.23.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/59b57e23-1800-9b59-86c8-0b3dbd7022d4.png)

![スクリーンショット 2022-12-15 1.25.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/6ed4d183-ded8-7d9c-1c66-af7ec755ac8f.png)

* 次にプライマリインスタンスのマシンスペックとID名を求められるので、入力していきます。
* マシンの値には、8 vCPU、 64 GB を使っちゃいましょう。w

![スクリーンショット 2022-12-15 1.25.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/4b52c7b9-f6cd-82a3-ab4d-df25ee0f40c1.png)

* すべての入力を終え、「継続」を選択すると作成が始まります。
![スクリーンショット 2022-12-15 1.27.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/6d9d8a93-e5a2-5332-d849-08a5a5e4c350.png)

## VPC 内に VM インスタンス を作成する

* そしたら次は、Compute Engine よりVMインスタンスを作成していきます。
* 「インスタンスを作成」をクリックします。

![スクリーンショット 2022-12-15 1.39.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/e571aa05-3492-0353-14a6-7e2a95d44c91.png)

* 踏み台のインスタンスになるので、まあいい感じに作っていきましょう。w

![スクリーンショット 2022-12-15 1.41.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/bf01767f-f695-7cff-3aeb-13968f0899da.png)

## VM インスタンスに psql をインストールする

* VM インスタンスが作成されると下記のように表示されます。
* なので、SSH でインスタンスに入っていきます。
* ちなみにインスタンス にある「SSH」をクリックいただければブラウザからアクセスできます。

![スクリーンショット 2022-12-15 1.43.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/10954b77-415c-230b-9f0a-e4459cb26ae7.png)

![スクリーンショット 2022-12-15 1.48.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/04447195-4460-c49f-32b2-4ca9d0205ef2.png)

* インスタンス内でpsqlクライアントをインストールしていきます。

```bash
sudo apt-get update
sudo apt-get install --yes postgresql-client
```

## 新しいインスタンスの プライベート IP アドレスを確認する

* AlloyDB の画面に戻り、先ほど作成したリソース名(インスタンス)を選択し、プライベート IP アドレスを確認します。
* 今回だと、「10.100.0.2」となっていますね。

![スクリーンショット 2022-12-15 1.50.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/309c0303-fddc-6907-2ba2-39fd012fc3c3.png)

## インスタンスに接続してデータベースを作成する


* ここまできたらあとは、作成した VM インスタンスから AlloyDB のインスタンスに接続するだけです。


```sql
psql -h [IP_ADDRESS: 10.100.0.2] -U postgres
```

* いけましたね！
![スクリーンショット 2022-12-15 1.53.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/63e04922-2cec-5f25-f53e-95548288140f.png)

* データベースを作成してみましょう

```
CREATE DATABASE guestbook;
\c guestbook
```

* 作成したデータベースにテーブルを作成し、データを INSERT していきます。

```
CREATE TABLE entries (guestName VARCHAR(255), content VARCHAR(255),
                        entryID SERIAL PRIMARY KEY);
INSERT INTO entries (guestName, content) values ('first guest', 'I got here!');
INSERT INTO entries (guestName, content) values ('second guest', 'Me too!');
```

![スクリーンショット 2022-12-15 1.55.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/9b802154-c30d-135c-07ca-e5e5d7d39c9b.png)


* 最後に、INSERT したデータを確認してみましょう。
* いい感じですね！
```
SELECT * FROM entries;
```

![スクリーンショット 2022-12-15 1.55.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/08832f38-0e0a-9e93-41f0-d014927d972e.png)


# 参考文献

https://cloud.google.com/blog/products/databases/introducing-alloydb-for-postgresql?hl=en

https://cloud.google.com/blog/products/databases/alloydb-for-postgresql-intelligent-scalable-storage?hl=en

https://dev.classmethod.jp/articles/alloydb-for-postgresql-is-generally-available/