Google Cloudの新DBMS、AlloyDB for PostgreSQLを触ってみた Vol.1
- AlloyDB
- AlloyDB for PostgreSQL
- DBMS
- PostgreSQL
Google Cloudの新DBMS、AlloyDB for PostgreSQLを触ってみた Vol.1
目次
まえがき
初めまして。株式会社トップゲート、2022年12月入社の開発部所属の高井(Peacock)です。
エンジニア経験は2023年3月時点で3年半ほどになります。
2022年11月までは、CMSコミュニケーションズという会社でWeb APIをPythonで書いたりAWSと戯れていました。
トップゲートに入社してからはGoでWeb APIを書いたり、案件のインフラをGCP & Terraformで構築する仕事をしています。
さて、この連載ですが、2022年12月にGAとなったAlloyDB for PostgreSQL(以降AlloyDBと表記します)を実際に触ってみながら紹介していきます。
第1回の本記事は起動までの予定ですが、第2回では主要な機能である、自動FailoverやContinuous backup and recoveryについても検証していきます。
続く第3回ではWebアプリケーションやデータ分析などでの実際のシステム構築例もお届けできたらと思います。
なお、掲載する画面スクリーンショットは記事執筆時点の日本語版でのものとなります。
実際にクラスタ作成
では実際に、画面を見せながらクラスタ作成からやっていきます。
AlloyDBクラスタ
既にGoogle Cloudに慣れている方には説明不要ですが、専用にプロジェクトを作っておいた方が何かと楽なので作っておきます。
最初にAlloyDB APIの有効化が必要です。プロジェクト毎に新しいサービスを使う場合はこれが必要です。
AlloyDBの画面に入るので、作成画面に入ります。ちなみにプロジェクト作成から何もしていないともう2つAPI(compute.googleapis.comとservicenetworking.googleapis.com)有効化が必要でした。
クラスタタイプは高可用性(英語だとHigh-availabilityかな?)を選びます。
名前、パスワードを決めてネットワークはデフォルトのものを選びます。ここで「アドレス割り当てられていない」と警告が出るのでダイアログから作成画面へ。お任せで作って割り当てます。
最後にマシンスペックとプライマリインスタンスの名前を決めて、作成ポチーです。
踏み台用インスタンスの作成
AlloyDBには外部IPが割り当てられていないので、VPC内に踏み台用インスタンスを作ってそこからプロキシを貼ってアクセスできるようにしておきます。
Cloud SQLでやったことある方には見慣れた光景かと思いますが、こんな感じで作成。
接続確認、デモデータ投入
接続確認してみる
SSHログインをしたらとりあえずのapt updateを済ませておきます。
何はともあれ接続確認をしたいのでPostgreSQLクライアントを入れます。
執筆時点(2022/02末)のdebian 11デフォルトだと13が落ちてくるので14を入れるためにPPA追加したりしていますが、そこらは公式ドキュメントへのリファレンスで割愛します。
yoichi@bastion:~$ psql -h <internal_ip> -U postgres
Password for user postgres:
psql (14.7 (Debian 14.7-1.pgdg110+1), server 14.4)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=>
はい。接続できました。
デモ(テスト)データ入れてみる
ビッグデータ系: イギリスの不動産取引データ
イギリスの全国不動産取引データが公開されていて良さそうだったのでテストデータとして使ってみようと思います。
参考: PostgreSQL Wiki
yoichi@bastion:~/tmp$ wget <CSVのURL>
# pp-complete.csvをカレントディレクトリに落としてくる
postgres=> CREATE DATABASE etude;
CREATE DATABASE
postgres=> \c etude
etude=> CREATE TABLE land_registry_price_paid_uk(
transaction uuid,
price numeric,
transfer_date date,
postcode text,
property_type char(1),
newly_built boolean,
duration char(1),
paon text,
saon text,
street text,
locality text,
city text,
district text,
county text,
ppd_category_type char(1),
record_status char(1));
CREATE TABLE
etude=> \copy land_registry_price_paid_uk FROM './pp-complete.csv' with (format csv, encoding 'win1252', header false, null '', quote '"', force_null (postcode, saon, paon, street, locality, city, district));
COPY 27910954
etude=> SELECT count(*) from land_registry_price_paid_uk;
count
----------
27910954
(1 row)
etude=> SELECT * from land_registry_price_paid_uk LIMIT 5;
transaction | price | transfer_date | postcode | property_type | newly_built | duration | paon | saon | street | locality | city | district | county | ppd_category_type | record_status
--------------------------------------+-------+---------------+----------+---------------+-------------+----------+------+------+------------------+--------------+---------------------+---------------------+------------------+-------------------+---------------
5bbe9cb3-6332-4eb0-9cd3-8737cea4a65a | 42000 | 1995-12-21 | NE4 9DN | S | f | F | 8 | | MATFEN PLACE | FENHAM | NEWCASTLE UPON TYNE | NEWCASTLE UPON TYNE | TYNE AND WEAR | A | A
20e2441a-0f16-49ab-97d4-8737e62a5d93 | 95000 | 1995-03-03 | RM16 4UR | S | f | F | 30 | | HEATH ROAD | GRAYS | GRAYS | THURROCK | THURROCK | A | A
d893ee64-4464-44b5-b01b-8e62403ed83c | 74950 | 1995-10-03 | CW10 9ES | D | t | F | 15 | | SHROPSHIRE CLOSE | MIDDLEWICH | MIDDLEWICH | CONGLETON | CHESHIRE | A | A
f9f753a8-e56a-4ecc-9927-8e626a471a92 | 43500 | 1995-11-14 | TS23 3LA | S | f | F | 19 | | SLEDMERE CLOSE | BILLINGHAM | BILLINGHAM | STOCKTON-ON-TEES | STOCKTON-ON-TEES | A | A
e166398a-a19e-470e-bb5a-83b4c254cf6d | 63000 | 1995-09-08 | CA25 5QH | S | f | F | 8 | | CROSSINGS CLOSE | CLEATOR MOOR | CLEATOR MOOR | COPELAND | CUMBRIA | A | A
(5 rows)
投入にそこそこ時間がかかりましたが、数GBレベルのデータなのでこんなもんなのかなと思います。
RDBMS系: Pagila(MySQLのベンチマークSakilaのPostgres移植)
もう1つRDBMS系のデータとしてPagilaというデータを試してみます。
これはMySQLのベンチマーク用プロジェクト、SakilaのPostgres移植です。
git clone https://github.com/devrimgunduz/pagila.git
cd pagila
psql -h <internal_ip> -U postgres < pagila-schema.sql
psql -h <internal_ip> -U postgres < pagila-data.sql
これでマイグレーションとデータ投入が終わりました。
postgres=> SELECT
CONCAT(customer.last_name, ', ', customer.first_name) AS customer,
address.phone,
film.title
FROM
rental
INNER JOIN customer ON rental.customer_id = customer.customer_id
INNER JOIN address ON customer.address_id = address.address_id
INNER JOIN inventory ON rental.inventory_id = inventory.inventory_id
INNER JOIN film ON inventory.film_id = film.film_id
WHERE
rental.return_date IS NULL
AND rental_date < CURRENT_DATE
ORDER BY
title
LIMIT 5;
customer | phone | title
----------------+--------------+------------------
OLVERA, DWAYNE | 62127829280 | ACADEMY DINOSAUR
HUEY, BRANDON | 99883471275 | ACE GOLDFINGER
OWENS, CARMEN | 272234298332 | AFFAIR PREJUDICE
HANNON, SETH | 864392582257 | AFRICAN EGG
COLE, TRACY | 371490777743 | ALI FOREVER
(5 rows)
普通にRDBMSとして使えそうな気配がします。
まとめ
今回はハイパフォーマンスでPostgres互換なGoogle Cloudの新DBMS, AlloyDBを立ち上げてみました。
規約上ベンチマーク結果を公開できないので具体的な速度については言及できませんでしたが、高速そうな印象を受けました。
次回からは、目玉機能の自動FailoverやContinuous backup and recoveryを試してみたり、実際にアプリケーションから使ってみたりとやっていく予定です。