【PostgreSQL】クラスターを作成して、ポート別にデータベースを起動する
はじめに
データベースを使う際、アプリ(機能)や用途ごとにポート別でデータベースを管理したい場面が出てくるかと思います。
例えば私の場合、個人開発を行う際に「同じサーバーでデータベースを管理したいが、アプリ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)
クラスター作成
以下情報を前提としてクラスターを作成します。
- PostgreSQLのバージョンは12
- クラスター名は
cluster_name
- クラスターを起動するポート番号は
6000
- クラスターOwnerのユーザー名は
hoge_user_name
- ユーザー作成はUbuntuでユーザーの作成とsudo権限を付与するるを参考にしてください。
$ 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