「データベースクラスタ」はPostgreSQL独自の用語で、1つのサーバインスタンスによって管理されるデータベースの集合体を意味します。「クラスタ」という言葉からは、複製して冗長化されたシステムをイメージする人も多いかと思いますが、そのような意味ではないので注意してください。
initdb コマンドによって作成された直後のデータベースクラスタには、template0、template1という2つのテンプレートデータベースと、postgresというデータベースが存在します。
この中に、さらにデータベースを追加するには、OSのコマンドラインからcreatedb コマンドを実行するか、psqlでデータベースに接続して CREATE DATABASE 文を実行します。
データベースクラスタという用語自体はPostgreSQL独自のものですが、CREATE DATABASE 文によって、1つのデータベース内に複数のデータベースを作ることは、他のいくつかのRDBMSでもできます。
ただし、インスタンス内の個々のデータベースが、どの程度、互いに独立しているかはRDBMSの種類によって違いが大きいようです。
データベースクラスタ内のデータベースは、それぞれテーブルや関数などのオブジェクトを独立して管理します。
一方で、ユーザ情報(ユーザ名、パスワードなど)は、データベースクラスタ内のグローバルオブジェクトとして管理されているため、すべてのデータベースで共通となります。
ただし、個々のユーザについて、それぞれのデータベースへの接続を許可するかどうか、また接続時の方式(パスワードの有無、SSLの有無など)はpg_hba.confという設定ファイルを使うことで、データベース毎、ユーザ毎に設定が可能なので、ユーザ情報がグローバルであることについてセキュリティ上の懸念はないように設計されています。
共有メモリや同時接続クライアント数などといったパフォーマンスに絡むパラメータはデータベースクラスタ内で共通のため、データベース毎の設定はできません。サーバプロセスや共有メモリバッファはデータベースクラスタで共有されていますが、クライアントから見ると、それぞれのデータベースはまったく独立した別のものとなっています。例えば、psql で postgres データベースに接続しているとき、他のデータベース内のオブジェクト(テーブル、関数など)を参照することは同じデータベースクラスタ内であってもできません。
pg_dumpで作成するバックアップは、データベース毎に別々に取得しますが、ポイントインタイムリカバリ(PITR)によるバックアップとリカバリやストリーミングレプリケーションは、データベースクラスタ全体が対象で、データベース毎に別々に実行することはできません。
データベースクラスタ内に複数のデータベースを作成するか、それとも複数のデータベースクラスタを作成するかは、様々な要因を考慮し、ケースバイケースで判断することになるでしょう。
複数のデータベースクラスタを作成する場合、initdb コマンドで作成された postgresql.conf を編集して、port パラメータをデフォルトの5432から変更する必要があることに注意してください。データベースクラスタのディレクトリと、ポート番号を別にすれば、同一マシン上で複数のデータベースクラスタを同時に稼働させることができます。
解説:松田神一
© EDUCO All Rights Reserved.