🏎

AlloyDB Omni : AlloyDB が Google Cloud 以外でも利用可能に

2023/12/18に公開

AlloyDB Omni : AlloyDB が Google Cloud 以外でも利用可能に


この記事は Google Cloud Japan Advent Calendar 2023 (入門編) の 14 日目の記事です。

AlloyDB Omni 一般提供開始!

Google Cloud で 昨年リリースされた AlloyDB for PostgreSQL と併せて、ダウンロード可能な AlloyDB Omni が一般提供されていることをご存知でしょうか?

https://cloud.google.com/alloydb/omni?hl=ja

AlloyDB for PostgreSQL は PostgreSQL 互換でありながら、性能、可用性、スケーラビリティに優れ、様々な機能が拡張されているGoogle Cloud のデータベースサービスです。
そのダウンロード版となる AlloyDB Omni でも、下記のようにクラウド版が持つ多くの機能を利用することが出来ます。

  • トランザクション ワークロードで標準 PostgreSQL より 2 倍以上高速な優れたパフォーマンス
  • 標準 PostgreSQL と比較して分析クエリが最大 100 倍高速な統合カラム型エンジン
  • 標準 PostgreSQL と比較して最大 10 倍高速にベクトルクエリを実行できる、高パフォーマンスの pgvector 互換検索
  • 各種自動パイロット機能(自動メモリ管理、適応型自動バキューム機能、自動列形式キャッシュ管理)

さすがにクラウド版の特徴の一つである スケーラブルなインテリジェントデータベースストレージ は含まないということで、性能面ではクラウド版には劣るようですが、標準 PostgreSQL への優位性は一部引き継がれています。

Debian や RedHat などの Linux 環境上であればどこでも動作するコンテナ形式の提供のため、オンプレミスサーバ、AWS や Azure などの IaaS 環境、開発用ラップトップなどユーザーの要件に合わせた好きな場所で AlloyDB の機能を利用することが出来るのが嬉しいですね。
(詳細なシステム要件は こちら)

本ブログではこの AlloyDB Omni の機能が、実際にどのように機能するのか、試してみたいと思います。

AlloyDB Omni 環境構築

環境構築手順は、以前 Preview 中に RyuSA さんのBlog にて紹介されておりましたが、一般提供までに管理ツールである AlloyDB Omni CLI が追加されるなど大きく変更されました。

Linux 環境の準備

AlloyDB Omni をインストールするためのLinux 環境を準備します。
AWS EC2 や ラップトップの Hyper-V 仮想環境でも構いませんが、システム要件 に気をつけましょう。
本ブログでは Google Cloud の Compute Engine (Debian) 上へ導入してみます。
Cloud shell を使用 して、インスタンスを作成します。

# 利用するプロジェクトの確認
gcloud config get project 

# GCE環境の作成
gcloud compute instances create omni1 \
    --zone=asia-northeast1-b \
    --machine-type=n2-highcpu-16 \
    --tags=postgresql \
    --boot-disk-size=50GB \
    --image-project=debian-cloud \
    --image=debian-11-bullseye-v20231212

# PostgreSQL の通信 (TCP:5432) について VPC 内 (10.0.0.0/8) からの Ingress を許可
gcloud compute firewall-rules create allow-ingress-oracle \
--allow=tcp:5432 \
--target-tags=postgresql \
--source-ranges="10.0.0.0/8"

今回は HammerDB を利用したデータ生成を行うため、要件よりも大きめのマシンタイプ (n2-highcpu-16 : 16 vCPU, 16GB Mem) とストレージサイズ (50GB) を選択しました。

サービスアカウントの作成

AlloyDB Omni は Vertex AI との統合機能も連携して、エンべディングなどを行うことが可能です。連携に必要となる、サービスアカウントを事前に作成します。

# Vertex AI API の有効化
gcloud services enable aiplatform.googleapis.com

# サービスアカウントの作成
gcloud iam service-accounts create sa1

# Vertex AI User ロールの付与
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
    --member="serviceAccount:omni1-vertexai@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
    --role="roles/aiplatform.user"

# サービスアカウントキーを作成して、GCE 環境へUpload
gcloud iam service-accounts keys create ~/sa1.key \
    --iam-account=sa1@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com
gcloud compute scp ~/sa1.key omni1:/tmp --zone=asia-northeast1-b --tunnel-through-iap 

AlloyDB Omni CLI インストール

新たに提供されている AlloyDB Omni CLI は、AlloyDB Omni のインストールを含めた管理手順を自動化してくれます。
作成したGCE環境にログインします。

gcloud compute ssh omni1 --zone=asia-northeast1-b --tunnel-through-iap 

Debian 上へ インストール します。

curl https://asia-apt.pkg.dev/doc/repo-signing-key.gpg | sudo apt-key add -
sudo apt update
echo "deb https://asia-apt.pkg.dev/projects/alloydb-omni alloydb-omni-apt main" \
  | sudo tee -a /etc/apt/sources.list.d/artifact-registry.list
sudo apt update
sudo apt-get install alloydb-cli

Docker インストール

AlloyDB Omni 動作に必要となる、Docker を Debian へインストール します。

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

AlloyDB Omni インストール

AlloyDB Omni CLI を利用して、インストールします。

# データファイルの配置先パスを準備
mkdir ${HOME}/alloydb-data

# サービスアカウントキーの配置先パスを準備
mv /tmp/sa1.key ${HOME}

# AlloyDB Omni をインストール
sudo alloydb database-server install \
    --data-dir=${HOME}/alloydb-data \
    --enable-alloydb-ai=true \
    --private-key-file-path=${HOME}/omni1-vertexai.key \
    --vertex-ai-region="us-central1"

最後に起動すると、AlloyDB Omniが利用可能となります。

sudo alloydb database-server start

AlloyDB Omni の管理

クラウド版の AlloyDB と大きく異なる点として、AlloyDB Omni の管理は通常の PostgreSQL のような、CLI や pgAdmin を利用した管理となります。
幾つかの管理手順を見てみました。

起動状況の確認

起動状況は、AlloyDB Omni CLI で確認できます。3つのサービスが起動するようですね。

$ sudo alloydb database-server status
pg-service
Status: Running
ID: 07259bd8d632af7c787628cc8b9c731d26eed6627832364fd1f2c18cc4c1826d
Image: sha256:933fc68bb56d4f28b0ca5bb4e0a10da8fe442a249ef3b32f3301b5b468e3671f
Started at: 2023-12-14T00:00:00.000000000Z

memory-agent
Status: Running
ID: b5b010a002088aa3772de16f6ac7c14db21c5224fd0612e182ce76f80a1df5f0
Image: sha256:8985c0597a3f8e94a2be2930d5da6668b83f217f6da40d4d972cf0e0403c6a43
Started at: 2023-12-14T00:00:00.000000000Z

ml-agent
Status: Running
ID: 590d35bb4caa836c1f6fd62e465d1beb5486aa7a5f3aa4a1de66084c923c1fde
Image: sha256:859d0dcf9f913ac091a7429738a15b3c78881e85a10f4c97232979f3d86508f2
Started at: 2023-12-14T00:00:00.000000000Z

AlloyDB Omni is currently running.

データベース接続

AlloyDB Omni は PostgreSQL 互換なので、PostgreSQL へ対応している psql や pgAdmin などのツールを用いて接続することが可能です。
取り急ぎアクセスを試したいということであれば、docker 内の psql コマンドを利用した接続を試せます。
ついでに postgres ユーザのパスワードも設定しておきます。

$ sudo docker exec -it pg-service psql -h localhost -U postgres
postgres=# \l
                                                    List of databases
     Name     |    Owner     | Encoding | Collate | Ctype | ICU Locale | Locale Provider |       Access privileges       
--------------+--------------+----------+---------+-------+------------+-----------------+-------------------------------
 alloydbadmin | alloydbadmin | UTF8     | C       | C     | und-x-icu  | icu             | 
 postgres     | alloydbadmin | UTF8     | C       | C     | und-x-icu  | icu             | 
 template0    | alloydbadmin | UTF8     | C       | C     | und-x-icu  | icu             | =c/alloydbadmin              +
              |              |          |         |       |            |                 | alloydbadmin=CTc/alloydbadmin
 template1    | alloydbadmin | UTF8     | C       | C     | und-x-icu  | icu             | =c/alloydbadmin              +
              |              |          |         |       |            |                 | alloydbadmin=CTc/alloydbadmin
(4 rows)

postgres=# ALTER USER postgres WITH PASSWORD 'Welcome1';
ALTER ROLE
postgres=# \q

またホストへ psql を導入して接続することも可能です。

$ sudo apt-get install postgresql-client
$ psql -h localhost -U postgres

postgres=# \q

設定ファイル

クラウド版の AlloDB では、各種パラメータ(フラグ)の設定は、Google Cloud の管理コンソールや API を通して実施します。
AlloyDB Omni では通常の PostgreSQL と同じく postgresql.conf などの設定ファイルへ /var/alloydb/config 配下からアクセスできるため、こちらを編集することで対応します。

$ ls /var/alloydb/config
dataplane.conf  dataplane.env  pg_hba.conf  postgresql.conf

例えば初期では、ローカルホスト以外からの接続は許可されていないので、こちらを許可してみます。

$ PGPASSWORD=Welcome1 psql -h omni1 -U postgres
psql: error: FATAL:  no pg_hba.conf entry for host "10.146.15.219", user "postgres", database "postgres", no encryption

pg_hba.conf を修正して、ローカルホスト以外からのパスワード接続を許可します。設定後の再起動は AlloyDB Omni CLIで行います。

cd /var/alloydb/config/
sudo cp -p pg_hba.conf pg_hba.conf.org
echo "host all all 0.0.0.0/0 md5" | sudo tee -a pg_hba.conf
sudo alloydb database-server stop
sudo alloydb database-server start

無事に接続できるようになりました。

$ PGPASSWORD=Welcome1  psql -h omni1 -U postgres                                                                
postgres=# \q

その他の管理手順は、公式ドキュメント をご参照ください。

カラムナーエンジンによる高速分析クエリを試してみる

AlloyDB Omni のセットアップが完了したので、ここからは AlloyDB の特徴的な機能が実際に使えるのかを確認したいと思います。
まずはカラムナーエンジンを試してみます。

カラムナーエンジンの有効化

まずは AlloyDB Omni の設定ファイルを編集し、AlloyDB Omni を再起動することで、カラムナーエンジンを有効化します。

cd /var/alloydb/config/
sudo cp postgresql.conf postgresql.conf.org
echo "google_columnar_engine.enabled=on" | sudo tee -a postgresql.conf
sudo alloydb database-server stop
sudo alloydb database-server start

分析対象データの準備

分析対象のデータとして、HammerDB を使って疑似データを投入してみます。
HammerDB をインストールします。

mkdir hammerdb
cd hammerdb
curl -OL https://github.com/TPC-Council/HammerDB/releases/download/v4.9/HammerDB-4.9-Linux.tar.gz
tar zxvfn HammerDB-4.9-Linux.tar.gz
cd HammerDB-4.9

動作確認用のデータベース mytpch を作成し、疑似データを投入します。

psql -h localhost -U postgres -c "CREATE DATABASE mytpch;"
./hammerdbcli << EOF
dbset db pg
dbset bm tpc-h
diset connection pg_host localhost
diset connection pg_sslmode disable
diset tpch pg_scale_fact 10
diset tpch pg_tpch_superuserpass postgres
diset tpch pg_tpch_defaultdbase mytpch
diset tpch pg_degree_of_parallel 1
diset tpch pg_num_tpch_threads 16
diset tpch pg_tpch_user postgres
diset tpch pg_tpch_dbase mytpch
buildschema
quit
EOF

カラムナエンジンを使用しない分析クエリの実行

カラムナエンジンは、列形式のカラムナキャッシュへキャッシュされたデータに対して、分析クエリを高速化します。
初期状態ではカラムナキャッシュは空の状態となっているので、この状況でまずは分析クエリを実行してみます。

$ psql -h localhost -U postgres -d mytpch
mytpch=> \timing

分析クエリを (念のため、明示的にカラムナエンジンを無効化して) 実行すると、クエリの実行完了まで数分かかることが確認できました。

SET google_columnar_engine.enable_columnar_scan=off;
SELECT COUNT(l_orderkey), AVG(l_extendedprice) FROM lineitem;

カラムナキャッシュの構成

今回分析対象としている列 (テーブル lineitem の l_orderkey と l_extendedprice) のカラムナキャッシュを構成し、クエリが早くなるかを確認してみます。
AlloyDB では過去のワークロードとメモリサイズから、自動で推奨構成を提示してカラムナキャッシュを構成する、自動列形式キャッシュ管理機能がありますが、本ブログでは明示的に手動で構成します。

SELECT google_columnar_engine_add(
    relation => 'lineitem',
    columns => 'l_orderkey,l_extendedprice');

カラムナエンジンを使用した分析クエリの実行

改めて、先程の分析クエリを再度実行してみると、1秒もかからず完了し、実行時間がかなり短縮されたことが確認できました。
今回の環境では少なくとも100倍以上、レイテンシが向上しました。

SET google_columnar_engine.enable_columnar_scan=on;
SELECT COUNT(l_orderkey), AVG(l_extendedprice) FROM lineitem;

実行プランを表示すると、確かにカラムナキャッシュが利用されているのが 確認 できます。

mytpch=> EXPLAIN select count(l_orderkey), avg(l_extendedprice) from lineitem;
...
                     ->  Parallel Custom Scan (columnar scan) on lineitem  (cost=20.00..167158.47 rows=8571202 width=14)
                           Columnar cache search mode: native
                     ->  Parallel Seq Scan on lineitem  (cost=0.00..4.00 rows=1 width=14)
(8 rows)

AlloyDB AI による、ベクトルクエリを試してみる

次に ベクトルクエリ機能 も試してみましょう。

サンプルデータの準備

サンプルデータとして、映画レビューリスト (https://storage.googleapis.com/randall01-public/movie_reviews.tar.gz) を利用します。

cd /tmp
curl -O https://storage.googleapis.com/randall01-public/movie_reviews.tar.gz
tar xfzv movie_reviews.tar.gz

AlloyDB Omni へログインします。

$ psql -h localhost -U postgres -d mytpch
mytpch=> 

データベースへ Vertext AI 統合拡張機能 (google_ml_integration) と pgvector 拡張機能を導入した後、映画レビューリストをロードします。

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE movie_reviews(
    mr_key INTEGER NOT NULL PRIMARY KEY,
    mr_title TEXT,
    mr_review TEXT,
    mr_review_embedding VECTOR(768),
    mr_review_embedding_local VECTOR(50),
    mr_summary TEXT,
    mr_sentiment CHAR(8),
    mr_sentiment_json JSON);
 \copy movie_reviews FROM '/tmp/movie_reviews.csv' with DELIMITER '|' CSV 

ベクトル検索インデックスを作成します。

CREATE INDEX ON movie_reviews
  USING ivf (mr_review_embedding vector_l2_ops)
  WITH (lists = 100, quantizer = 'SQ8');

ベクトルクエリの実行

映画レビューから、「泣けるアクション映画」に近いレビューを持つ映画について上位10社をリストすると、下記のような結果が1秒もかからずにリストされました。

mytpch=> SELECT mr_title,
       mr_review_embedding <-> embedding('textembedding-gecko@002', '泣けるアクション映画') as rank
    FROM movie_reviews
    ORDER BY rank
    LIMIT 10;

             mr_title             |        rank        
----------------------------------+--------------------
 Pleasantville (1998)             | 0.8460370961503944
 Human Traffic (1999)             |  0.848474450474714
 Lola rennt (1998)                | 0.8497369429305394
 Pleasantville (1998)             | 0.8505484816913667
 Ever After (1998)                | 0.8521824950801087
 Dirty Dancing (1987)             | 0.8524649501542307
 Anywhere But Here (1999)         | 0.8536294123660827
 Lawn Dogs (1997)                 | 0.8547654417996758
 Barney's Great Adventure (1998)  | 0.8548844663182612
 New Waterford Girl (1999)        | 0.8553017928011135
(10 rows)

リストの内容については皆様様々なご意見があると思うのですが(笑)、ここで注目したいのは、pgvector では対応できない SQL 内でのエンべディングも実行できている点です。この機能により RAG アプリケーションへのデータベースの組み込み開発等も、だいぶ容易になることが想像できます。現時点では textembedding-gecko モデルのみのサポートとなっていますが、将来的により多くのモデルのサポートが期待されます。

価格体系

AlloyDB は開発者利用であれば無料で利用可能ですが、本番用途での利用では下記のような 価格体系 で提供されています。
サブスクリプションを購入する場合には、Google Cloud の AlloyDB コンソールから購入出来ます。
Google Cloud のエンタープライズサポートとの組み合わせが出来る点も嬉しいですね。
サブスクリプションを購入する場合には、Google Cloud の AlloyDB コンソールから購入出来ます。
Google Cloud のエンタープライズサポートとの組み合わせが出来る点も嬉しいですね。

サブスクリプション vCPU(*) 月額 備考
Developer Text 無料 趣味、個人使用、非本番用途での使用
Starter 16 $1,295 ユーザごとに1サブスクリプションまで
Standard 100 $6,995 100 vCPU 単位で契約。1年、3年割引あり

(*) サブスクリプションの vCPU 数は複数のサーバー、仮想マシンで分割して利用することが可能

まとめ

本ブログでは、AlloyDB Omni のご紹介と、実際の利用手順についてご紹介しました。

AlloyDB が持つ高度な機能が、PostgreSQL の一種のディストリビューションのように場所を選ばずに利用できるようになったことで、データベース選択における魅力的な選択肢が新たに提供されたと思います。AlloyDB 利用時のローカルな開発環境を準備する際にも嬉しいサービスです。

ぜひ一度ダウンロードして、お手元でもお試しください。

Google Cloud Japan

Discussion