Google Cloudの新データベースサービス AlloyDB for PostgreSQLを使ってみた

  • Google Cloudに関する記事
10min

前回のコラムから引き続き、まずはAlloyDB for PostgreSQL(以降、AlloyDBと表記)の基本的な機能を使ってみます。

クラスタ作成

必要な権限

AlloyDBクラスタの作成には、以下のロールを付与したアカウントで作業する必要があります。

  • roles/alloydb.admin (the AlloyDB Admin predefined IAM role)
  • roles/owner (the Owner basic IAM role)
  • roles/editor (the Editor basic IAM role)

作成手順

最初に、 https://console.cloud.google.com を開き、左上のメニューリストからデータベース→PostgreSQL向けAlloyDB→クラスタをクリックします。


初回はAlloyDB APIの有効化を行う画面が表示されますので「有効化」ボタンをクリックします。


API有効化が完了すると、「最初のAlloyDBクラスタを作成」の画面が表示されます。「クラスタを作成」ボタンをクリックします。


このとき、Compute Engine VMやCloud SQLのPrivate IP設定で使うAPIを使ったことがない場合は以下のような画面が表示されます。この画面が表示された場合は「APIを有効にする」をクリックします。(表示されない場合は特に問題ありません。)


クラスタ作成画面では、最初に「高可用性」か「読み取りプールによる高可用性」のクラスタタイプ選択を行う項目が表示されます。今回は「高可用性」を選択し続行ボタンをクリックします。


クラスタIDと管理ユーザーのパスワード入力です。クラスタIDは小文字、数字、ハイフンのみ使用できます。今回は「alloydb-test」と入力します。パスワードは、自動的に作成される管理ユーザー(postgres)のパスワードです。


場所はAlloyDBを構築する地域(リージョン)の選択です。Preview段階で13リージョンを選択できるようになっています。東京リージョン(asia-northeast1)も選択できるため、今回は東京リージョンを選択しました。


ネットワーキングはちょっと設定がややこしいです。まず、AlloyDBを使いたいVPCネットワークを選択します。今回はdefaultを使用しました。
「プライベート サービス アクセス接続は必須です」というメッセージが表示されます。(既にプライベートサービスアクセス接続設定済みの場合は表示されません)これが表示された場合は「接続を設定」ボタンをクリックします。


右側からプライベートサービスアクセス接続作成の画面がせり出してきます。今回はAlloyDBの推奨(/16の範囲をもつIPアドレス)に基づき 10.10.0.0/16を設定したいと思います。「1 つ以上の既存の IP 範囲を選択するか、新しい IP 範囲を作成する」を選択し、「IP範囲を選択または作成」と表示されているボックスをクリックします。


「新しいIP範囲を割り振る」をクリックします。


名前と割り当てられたIPアドレス範囲を入力するテキストボックスが表示されます。名前は何でもよいはずですが今回は「alloydb-subnet」と入力します。割り当てられたIPアドレス範囲には「10.10.0.0/16」を入力します。入力できたら「続行」ボタンをクリックします。


設定内容を確認し、問題無ければ「接続を作成」ボタンをクリックします。


AlloyDBのネットワーキング設定の画面に戻ってきます。「ネットワーク default のプライベート サービス アクセス接続が正常に作成されました。」というメッセージが表示されていれば問題ありません。「続行」ボタンをクリックします。


プライマリインスタンスの構成画面に遷移します。インスタンスID入力画面が表示されます。ここでは「alloydb-primary」と入力します。


下にスクロールするとマシンタイプを選択できます。今回はお試しなので4vCPU, 32GBを選択しました。


更に下にスクロールするとフラグを設定できます。ここでは、AlloyDBやPostgreSQLのデータベースフラグを設定することが可能です。今回はお試しなので特にフラグは設定しませんでした。


これでクラスタ設定は入力完了です。「クラスタを作成」ボタンをクリックします。数分程度で作成は完了します。ステータスが準備完了の表示になれば使用可能です。

アクセス方法

アクセス方法について説明していきます。

クライアント準備

最初に、アクセス用のVMをdefaultネットワークに用意します。Cloud Shellで以下のコマンドを実行してVMを作成します。

gcloud compute instances create alloydb-test \
	--zone=asia-northeast1-b --machine-type=e2-medium --network-interface=subnet=default \
	--image-family=ubuntu-2204-lts --image-project=ubuntu-os-cloud

VM作成後SSHログインします。
gcloud compute ssh alloydb-test --zone=asia-northeast1-b
下記のコマンドでPostgreSQLのコマンドラインをインストールします。
sudo apt update && sudo apt install postgresql-client

VPCネットワークから直接接続

VPCネットワークから接続するためには、AlloyDBのPrimary InstanceのプライベートIPを知る必要があります。Cloud Console(https://console.cloud.google.com)からPostgreSQL向けAlloyDBのクラスタ一覧画面を開きます。先ほど作成したalloydb-testクラスタのプライベートIP列に、10.10.0.2というIPが表示されていると思います。このIPがdefaultネットワークから接続可能なIPアドレスになります。


先ほど準備したクライアントVMから、psqlコマンドを実行します。
psql -h 10.10.0.2 -U postgres
以下の通り接続することができました。

psql (14.2 (Ubuntu 14.2-1ubuntu1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=>

読み取りプールインスタンスの操作

AlloyDBの読み取りプールインスタンス(Read pool instance)を追加します。読み取りプールインスタンスはPostgreSQL標準機能のリードレプリカに相当する機能です。

読み取りプールインスタンスの追加操作

Cloud Console(https://console.cloud.google.com)からPostgreSQL向けAlloyDBのクラスタ一覧画面を開きます。画面からalloydb-testをクリックします。

クラスタの概要ページに遷移します。ページ最下部までスクロールして、クラスタ内のインスタンスの箇所を表示します。「読み取りプールインスタンスを追加」ボタンをクリックします。

読み取りプールインスタンスの追加画面が表示されます。基本情報としてインスタンスIDとノード数を入力する必要があります。ここでは、インスタンスIDに「alloydb-read」、ノード数に1を入力します。

次に、プライマリインスタンスと同様に読み取りプールインスタンスのマシンタイプとフラグを設定します。ここでは、マシンタイプは4vCPU, 32GBを選択し、フラグは未設定のままとします。

一通り入力できたら、「読み取りプールを作成」ボタンをクリックします。数分程度待つと、クラスタ概要画面で読み取りプールインスタンスのステータスが準備完了になります。

読み取りプールインスタンスはプライマリインスタンスとは別のプライベートIPを持っています。
実際にアクセスできるか確認するにはプライマリインスタンスと同様にVMからpgsqlコマンドを実行して確認してみます。
Cloud Shellから以下のコマンドを実行してSSHログインします。
gcloud compute ssh alloydb-test --zone=asia-northeast1-b
次に、読み取りプールインスタンスのプライベートIPに接続します。
psql -h 10.10.0.5 -U postgres
以下の通り接続できました。書き込み操作が行えないこと以外はプライマリインスタンスと同様です。

psql (14.2 (Ubuntu 14.2-1ubuntu1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=>

読み取りプールインスタンスのスケールアウト操作

先ほど追加した読み取りプールインスタンスをスケールアウトさせてみます。
Cloud Console(https://console.cloud.google.com)からPostgreSQL向けAlloyDBのクラスタ一覧画面を開きます。画面からalloydb-testをクリックします。

クラスタの概要ページに遷移します。ページ最下部までスクロールして、クラスタ内のインスタンスの箇所を表示します。読み取りプールインスタンスのセクションの「読み取りプールの編集」ボタンをクリックします。

読み取りプールインスタンスの編集画面が表示されますので、スケールさせたいノード数を入力します。今回は1から3に変更します。変更した後、「読み取りプールを更新」ボタンをクリックします。

数分経過すると、読み取りプールインスタンスのノード数が3に変更されました。なお、読み取りプールインスタンスのスケーリング中でも、psqlコマンド等からアクセスは可能でした。

バックアップ・リストア

AlloyDBはPostgreSQLの機能ではないバックアップ・リストア機能を備えています。どのような感じになるか試してみます。

データ準備

バックアップからリストアできたかを確認するため、先にデータを作成しておきます。
Cloud Shellから以下のコマンドを実行してSSHログインします。
gcloud compute ssh alloydb-test --zone=asia-northeast1-b
次に、VMに以下のようなSQLファイルを作成します。(5行ほどの小さなデータです)

CREATE TABLE IF NOT EXISTS users (
id integer PRIMARY KEY,
 name varchar(100)
);

BEGIN;
INSERT INTO users (id, name) VALUES
 (1, 'Ellie Gray'),
 (2, 'Jon Baird'),
 (3, 'Lars Ericsson'),
 (4, 'Samantha Morse'),
 (5, 'Tim Lee');
COMMIT;

SELECT * FROM users;

以下のコマンドを実行し、データを作成します。
psql -h 10.10.0.5 -U postgres -f testdata.sql

バックアップを実行する

Cloud Console(https://console.cloud.google.com)からPostgreSQL向けAlloyDBのクラスタ一覧画面を開きます。この時の画面左にある「バックアップ」をクリックして、バックアップ一覧画面を開きます。バックアップ一覧画面にある「バックアップの作成」をクリックします。

バックアップの作成画面が表示されます。ソースクラスタとバックアップIDの入力を行う必要があります。ソースクラスタはバックアップ対象とするAlloyDBクラスタをプルダウンから指定します。バックアップIDは名前を指定します。今回はクラスタ名に日付を付けて「alloydb-test-20220513」としました。入力が完了したら「作成」ボタンをクリックします。

バックアップ取得が完了すると、バックアップ一覧に先ほど作成した「alloydb-test-20220513」が表示され、作成日のところにチェックマークが付きます。

リストア(復元)を実行する

先ほど作成したバックアップからリストア(復元)を実施します。AlloyDBのリストアは、既存のAlloyDBクラスタにデータを復元するのではなく、バックアップデータから新規にAlloyDBクラスタを作り直す機能になるようです。
バックアップ一覧画面から復元したいバックアップの行にある「復元」をクリックします。

バックアップを復元する画面が表示されます。クラスタIDに、バックアップから復元するクラスタ名を入力します。クラスタIDは他と重複できないため、「alloydb-test-2」という名前にしました。また、ネットワークはdefaultネットワークを選択しました。
なお、同じプライベートサービスアクセス接続を使い回す際、十分なIPアドレス範囲がないとAlloyDBクラスタは作成できないため、そのような場合は別のVPCネットワークを指定するか、プライベートサービスアクセスで使用しているIPアドレス範囲を拡張する必要があります。
クラスタIDとネットワークを指定したら「作成」をクリックします。

数分経過したら、クラスタ一覧画面を表示します。「alloydb-test-2」クラスタが作成されていることを確認します。この段階ではプライマリインスタンスは作成されていません。

プライマリインスタンスを作成するため、「alloydb-test-2」をクリックしてクラスタ概要画面を開きます。ページ最下部までスクロールし、クラスタ内のインスタンスにある「プライマリインスタンスを作成」ボタンをクリックします。

プライマリインスタンス作成画面が表示されます。入力する項目はクラスタ新規作成時と同様のため説明は割愛します。プライマリインスタンスIDは他のクラスタで使っている名前と重複していても問題無いようです。インスタンスIDを「alloydb-primary」、マシンタイプを4vCPU, 32GBとして「インスタンスを作成」ボタンをクリックします。

数分後、プライマリインスタンスの作成が完了し、プライベートIPが割り当てられたことが確認できました。(復元後のプライベートIPは10.10.0.18です)

念のため、データが復元されているかを確認します。Cloud ShellからクライアントVMにSSHログインします。
gcloud compute ssh alloydb-test --zone=asia-northeast1-b
ログイン後、以下のコマンドでAlloyDBに接続します。
psql -h 10.10.0.18 -U postgres
usersテーブルへのSELECTを実行します。

postgres=> SELECT * FROM users;
 id |      name
----+----------------
  1 | Ellie Gray
  2 | Jon Baird
  3 | Lars Ericsson
  4 | Samantha Morse
  5 | Tim Lee
(5 rows)

バックアップとして使えるかについて

今回使ったAlloyDBのバックアップ機能は、クラスタ全体のデータをバックアップし、復元時は新規クラスタを作成する仕様です。そのため、きめ細やかなデータのリストア(例えば、スキーマ単位やテーブル単位といったもの)には向いていないと思います。ユースケースとしては、複数のデータベースにまたがるような大がかりな変更や、オンプレミスPostgreSQLからデータを移行作業した後等に取得するようなケースが考えられます。
データベース、スキーマ、テーブルといった単位でバックアップを取得したい場合は、PostgreSQL標準のpg_dumpコマンドを使う方法が良さそうです。

まとめ

AlloyDBはVPCネットワーク内からプライベートIPで接続するPostgreSQLのクラスタを数分で構築できることが分かりました。Cloud SQLは作成に十数分かかるので、それより速く実行できるのは驚きです。現状でも必要最低限の機能はあると感じます。
今後もAlloyDBの検証記事を投稿する予定ですので、楽しみにお待ち下さい!

合わせて読みたい