【PostgreSQL】クラスターを作成して、ポート別にデータベースを起動する

2024/04/28に公開

はじめに

データベースを使う際、アプリ(機能)や用途ごとにポート別でデータベースを管理したい場面が出てくるかと思います。
例えば私の場合、個人開発を行う際に「同じサーバーでデータベースを管理したいが、アプリA・アプリBでそれぞれデータベースを分離させるために、データベースを起動するポートは変更したい」と考えていました。データベースとしてPostgreSQLを使用することを前提として、上記を実現するためにクラスターを作成したので、その手順を記録として残します。

PostgreSQLのクラスターとは、使うメリットとは

PostgreSQLのクラスターとは、複数のデータベースをまとめる「データベースの集合体のこと」です。DBクラスターとも呼ばれます。

クラスターを複数使用するメリットとしては、アプリごとにデータベースサーバーを複数用意するのと同じような形でデータベース管理することができるようになります。
例えば、アプリA・アプリBを同じサーバー上で稼働させる場合、クラスターが1つしかないと、アプリA用のデータベース・アプリB用のデータベースと言うふうにデータベース単位での分離が考えられます。しかし、その1つのクラスターが動作停止してしまうとアプリA・アプリBの両方のデータベースが停止してしまします。また、アプリAで高負荷となった場合、同じクラスターで動いているアプリBのデータベースアクセスにも負荷的に影響しかねません。
対して、アプリAとアプリBでクラスターを分けると、1つのクラスターが停止しても片方のクラスターには影響を与えません。 また、1つのクラスターは1つのポートで起動している(サービスが分かれている)ため、アプリAで高負荷となってもアプリBが負荷的に影響を受けにくくなります。
このように、可用性や負荷を考えた時にもクラスターを分けることが有用になります。

環境

Ubuntuを使うことを前提とします。

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
PRETTY_NAME="Ubuntu 20.04.1 LTS"
VERSION_ID="20.04"

PostgreSQLのインストール

$ sudo apt install postgresql postgresql-contrib

バージョン確認によって、インストール成功したことを確認します。

$ psql --version
psql (PostgreSQL) 12.16 (Ubuntu 12.16-0ubuntu0.20.04.1)

クラスター作成

以下情報を前提としてクラスターを作成します。

$ sudo pg_createcluster 12 cluster_name -p 6000 -u hoge_user_name -g hoge_user_name
Creating new PostgreSQL cluster 12/cluster_name ...
/usr/lib/postgresql/12/bin/initdb -D /var/lib/postgresql/12/cluster_name --auth-local peer --auth-host md5
The files belonging to this database system will be owned by user "hoge_user_name".
This user must also own the server process.

The database cluster will be initialized with locale "C.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/12/cluster_name ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Asia/Tokyo
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

Success. You can now start the database server using:

    pg_ctlcluster 12 cluster_name start

Warning: The parent /var/run/postgresql of the selected
stats_temp_directory is not writable for the cluster owner. Not adding this
setting in postgresql.conf.
Ver Cluster Port  Status Owner                            Data directory               Log file
12  cluster_name   6000 down   hoge_user_name /var/lib/postgresql/12/cluster_name /var/log/postgresql/postgresql-12-cluster_name.log

上記で表示される最後の行の表示12 cluster_name 6000 downによってまだクラスターが停止状態であることがわかるので、次に作成したクラスターを起動します。

複数のクラスターを作成する場合は、以下のようにクラスターに割り当てるポートに未使用ポートを指定して、コマンドを実行してください。 他のクラスターとは別のポートで起動できるようになります。

$ sudo pg_createcluster 12 cluster_name -p 6001 -u hoge_user_name -g hoge_user_name

クラスター起動

$ sudo systemctl start postgresql@12-cluster_name

以下コマンドでクラスターが起動したことを確認します。
Statusがonlineとなっていれば起動していることを意味します。

$ pg_lsclusters
Ver Cluster           Port  Status Owner          Data directory                           Log file
12  cluster_name      6000  online hoge_user_name /var/lib/postgresql/12/cluster_name      /var/log/postgresql/postgresql-12-cluster_name.log

PostgreSQLにログインして、SQLの初期実行

ここまでの手順で目標としていたクラスターの作成・起動は完了しました。
ここからは、起動したクラスターで動くdatabaseにSQLが実行できることを確認するため、以下のようにSQLの初期実行を行ってみます。
今回は、/home/database/hoge.sqlにSQLファイルを作成して、このSQLファイルを使ってSQLの初期実行を行うこととします。

以下、今回実行したいSQLファイルの中身です。

$ cat /home/database/hoge.sql
CREATE DATABASE hoge_database;

\c hoge_database;
ALTER DATABASE hoge_database SET timezone TO 'UTC';

GRANT ALL PRIVILEGES ON DATABASE hoge_database TO hoge_user_name;

コマンド実行ユーザーをクラスターOwnerであるhoge_user_nameに切り替えます。

$ sudo -i -u hoge_user_name

PostgreSQLにログインしつつ、SQLを実行します。
-fオプションで実行するSQLファイルを指定します。

$ psql -h /tmp -p 6000 -d postgres -f /home/database/hoge.sql
CREATE DATABASE
You are now connected to database "hoge_database" as user "hoge_user_name".
ALTER DATABASE
GRANT

実行後、上記メッセージが表示されてPostgreSQLにログインできていればOKです。
データベースの作成と権限変更が出てきていることが確認できます。

参考

Discussion