14.3. PostgreSQL

14.3.1. 詳細

rhscl/postgresql-13-rhel7 イメージは、PostgreSQL 13 SQL データベースサーバーを提供します。rhscl/postgresql-12-rhel7 イメージは、PostgreSQL 12 サーバーを提供します。rhscl/postgresql-10-rhel7 イメージは、PostgreSQL 10 サーバーを提供します。

14.3.2. アクセスと使用方法

rhscl/postgresql-13-rhel7 イメージをプルするには、root で以下のコマンドを実行します。

# podman pull registry.redhat.io/rhscl/postgresql-13-rhel7

rhscl/postgresql-12-rhel7 イメージをプルするには、root で以下のコマンドを実行します。

# podman pull registry.redhat.io/rhscl/postgresql-12-rhel7

rhscl/postgresql-10-rhel7 イメージをプルするには、root で以下のコマンドを実行します。

# podman pull registry.redhat.io/rhscl/postgresql-10-rhel7

必須の環境変数のみを設定し、データベースをホストディレクトリーに保存しないようにするには、以下のコマンドを実行します。

# podman run -d --name postgresql_database -e POSTGRESQL_USER=<user> \
  -e POSTGRESQL_PASSWORD=<pass> -e POSTGRESQL_DATABASE=<db> \
  -p 5432:5432 <image_name>

これにより、データベース db を使用する MySQL を実行する postgresql_database という名前のコンテナーと、認証情報 user:pass を持つユーザーが作成されます。ポート 5432 が公開され、ホストにマッピングされます。コンテナーの実行後もデータベースを永続化する必要がある場合には、-v /host/db/path:/var/lib/pgsql/data 引数も追加します。これは、PostgreSQL データベースクラスターのディレクトリーになります。

データベースクラスターディレクトリーが初期化されていない場合、エントリーポイントスクリプトは最初に initdb を実行し、必要なデータベースユーザーおよびパスワードを設定します。データベースを初期化するか、すでに存在する場合は、postgres が実行され、PID 1 として実行されます。podman stop postgresql_database コマンドを実行して、デタッチされたコンテナーを停止できます。

postgres デーモンは、まずログを標準出力に書き込みます。コンテナーイメージのログを確認するには、podman logs <image_name> コマンドを使用します。ログの出力はロギングコレクタープロセスにリダイレクトされ、pg_log/ ディレクトリーに表示されます。

14.3.3. 設定

イメージは、-e VAR=VALUEpodman run コマンドに渡して初期化中に設定できる以下の環境変数を認識します。

変数名説明

POSTGRESQL_USER

作成される PostgreSQL アカウントのユーザー名

POSTGRESQL_PASSWORD

ユーザーアカウントのパスワード

POSTGRESQL_DATABASE

データベース名

POSTGRESQL_ADMIN_PASSWORD

postgres 管理アカウントのパスワード (任意)

注記

postgres 管理者アカウントには、デフォルトでパスワードが設定されず、ローカル接続のみが許可されます。コンテナーを初期化するときに POSTGRESQL_ADMIN_PASSWORD 環境変数を設定することで設定できます。これにより、postgres アカウントにリモートでログインすることができます。ローカル接続にはパスワードは必要ありません。

重要

パスワードはイメージ設定の一部であるため、データベースユーザーと postgres 管理ユーザーのパスワードを変更するためにサポートされている唯一の方法は、環境変数 POSTGRESQL_PASSWORD および POSTGRESQL_ADMIN_PASSWORD をそれぞれ変更することです。SQL ステートメントまたは前述の環境変数以外の方法でデータベースのパスワードを変更すると、変数に格納されている値と実際のパスワードが一致しなくなります。データベースのコンテナーイメージを起動するたびに、パスワードは環境変数に保存されている値にリセットされます。

以下のオプションは移行に関するものです。

変数名説明デフォルト

POSTGRESQL_MIGRATION_REMOTE_HOST

移行元となるホスト名/IP

 

POSTGRESQL_MIGRATION_ADMIN_PASSWORD

リモートの postgres 管理ユーザーのパスワード

 

POSTGRESQL_MIGRATION_IGNORE_ERRORS

オプション: sql のインポートエラーを無視する

いいえ

以下の環境変数は PostgreSQL 設定ファイルに影響があり、すべて任意です。

変数名説明デフォルト

POSTGRESQL_MAX_CONNECTIONS

許可されるクライアント接続の最大数。これにより、準備済みトランザクションの最大数も設定します。

100

POSTGRESQL_MAX_PREPARED_TRANSACTIONS

準備状態にあるトランザクションの最大数を設定します。準備済みトランザクションを使用している場合は、max_connections よりも大きい値にする必要があります。

0

POSTGRESQL_SHARED_BUFFERS

データのキャッシュに使用する PostgreSQL 専用のメモリー容量を設定します。

32M

POSTGRESQL_EFFECTIVE_CACHE_SIZE

オペレーティングシステムおよびデータベース自体によるディスクキャッシュで利用できるメモリーの推定値に設定します。

128M

注記

PostgreSQL イメージが --memory パラメーターセットで実行され、POSTGRESQL_SHARED_BUFFERS および POSTGRESQL_EFFECTIVE_CACHE_SIZE に値が指定されていない場合は、--memory パラメーターで提供される値をもとにこれらの値が自動的に算出されます。値はアップストリームの式に基づいて計算され、指定されたメモリーの 1/4 および 1/2 に設定されます。

-v /host:/container オプションを podman run コマンドに渡すと、以下のマウントポイントを設定することもできます。

ボリュームマウントポイント説明

/var/lib/pgsql/data

PostgreSQL データベースクラスターのディレクトリー

注記

ホストからコンテナーにディレクトリーをマウントする場合は、マウントされたディレクトリーに適切なパーミッションがあり、ディレクトリーの所有者とグループが、コンテナー内で実行中のユーザー UID または名前と一致していることを確認します。

podman run コマンドで -u オプションを使用しない限り、コンテナーのプロセスは通常 UID 26 で実行されます。データディレクトリーのパーミッションを変更するには、以下のコマンドを使用します。

$ setfacl -m u:26:-wx /your/data/dir
$ podman run <...> -v /your/data/dir:/var/lib/pgsql/data:Z <...>

14.3.4. データの移行

PostgreSQL コンテナーイメージは、リモート PostgreSQL サーバーからのデータの移行をサポートします。以下のコマンドを使用して、イメージ名を変更し、必要に応じて任意の設定変数を追加します。

$ podman run -d --name postgresql_database \
    -e POSTGRESQL_MIGRATION_REMOTE_HOST=172.17.0.2 \
    -e POSTGRESQL_MIGRATION_ADMIN_PASSWORD=remoteAdminP@ssword \
    [ OPTIONAL_CONFIGURATION_VARIABLES ]
    rhscl/postgresql-12-rhel7

移行は、ダンプと復元の方法を行います (リモートクラスターに対して pg_dumpall を実行し、psql でローカルにダンプをインポート)。プロセスがストリーミング (unix パイプライン) されるため、このプロセス中に作成された中間ダンプファイルは、追加のストレージ領域を消費しないようにします。

適用中に SQL コマンドの一部が失敗すると、移行スクリプトのデフォルト動作も失敗し、スクリプト化された無人移行の結果がすべてまたはゼロであることを確認してください。同じ原則を使用して作成された以前のバージョンの PostgreSQL サーバーコンテナーから移行する場合 (たとえば、rhscl/postgresql-10-rhel7 から rhscl/postgresql-12-rhel7 への移行)、最も一般的なケースでは、正常な移行が期待されます (保証はされません)。異なる種類の PostgreSQL コンテナーイメージからの移行に失敗する可能性があります。

このすべてまたはゼロの原則が適切ではない場合は、任意の POSTGRESQL_MIGRATION_IGNORE_ERRORS オプションがあり、このオプションでベストエフォートの移行が行われます。ただし、データの一部が失われ、ユーザーが標準エラー出力を確認し、移行後の時間に手動で問題を修正する必要があります。

注記

コンテナーイメージはユーザーの利便性のための移行に役立ちますが、完全に自動移行は保証されません。そのため、データベースの移行に進む前に、データをすべて移行するために手動の手順を実施する必要があります。

移行シナリオで POSTGRESQL_USER などの変数を使用しない場合があります。データベース、ロール、パスワードに関する情報を含むすべてのデータは、古いクラスターからコピーされます。古い PostgreSQL コンテナーイメージの初期化に使用するオプションの設定変数を使用するようにしてください。リモートクラスターでデフォルト以外の設定が行われる場合は、設定ファイルも手動でコピーする必要がある場合があります。

警告

以前の PostgreSQL クラスターと新しい PostgreSQL クラスター間の IP 通信はデフォルトでは暗号化されていません。リモートクラスターで SSL を設定するか、異なる手段を使用してセキュリティーを確保するかはユーザー次第となります。

14.3.5. データベースのアップグレード

警告

データディレクトリーのアップグレードを実施する前に、すべてのデータのバックアップを作成していることを確認してください。アップグレードに失敗した場合は、手動でロールバックが必要になる場合があります。

PostreSQL イメージは、以前の rhscl イメージによって提供される PostgreSQL サーバーバージョンによって作成されたデータディレクトリーの自動アップグレードをサポートします。たとえば、rhscl/postgresql-13-rhel7 イメージは rhscl/postgresql-12-rhel7 からのアップグレードをサポートします。アップグレードプロセスは、イメージ A からイメージ B へ切り替え、$POSTGRESQL_UPGRADE 変数を適切に設定して、データベースデータ変換を明示的に要求できるように設計されています。

アップグレードプロセスは、pg_upgrade バイナリーを使用して内部的に実装され、コンテナーには 2 つのバージョンの PostgreSQL サーバーを含める必要があります (詳細は、pg_upgrade の man ページを参照してください)。

pg_upgrade プロセスおよび新しいサーバーバージョンについては、新しいデータディレクトリーを初期化する必要があります。このデータディレクトリーは、通常、外部のバインドマウントポイントである /var/lib/pgsql/data/ ディレクトリーのコンテナーツールによって自動的に作成されます。pg_upgrade の実行は、ダンプと復元のアプローチと似ています。これは、(コンテナー内の) 古い PostgreSQL サーバーと新しい PostgreSQL サーバーの両方を起動し、古いデータディレクトリーをダンプし、同時に新しいデータディレクトリーに復元します。この操作には、データファイルのコピーが多数必要です。選択したアップグレードのタイプに応じて $POSTGRESQL_UPGRADE 変数を設定します。

copy

データファイルは古いデータディレクトリーから新しいディレクトリーにコピーされます。このオプションは、アップグレードに失敗した場合にデータ損失のリスクが低くなります。

hardlink

データファイルは、以前のデータディレクトリーから新しいデータディレクトリーにハードリンクされるため、パフォーマンスが最適化されます。ただし、障害が発生した場合でも、古いディレクトリーは使用できなくなります。

注記

コピーしたデータ用に十分な容量があることを確認してください。領域が不十分なためにアップグレードが失敗すると、データが失われる可能性があります。

14.3.6. イメージの拡張

PostgreSQL イメージは、source-to-image を使用して拡張できます。

たとえば、~/image-configuration/ ディレクトリーの設定が含まれるカスタマイズされた new-postgresql イメージをビルドするには、以下のコマンドを使用します。

$ s2i build ~/image-configuration/ postgresql new-postgresql

S2I ビルドに渡されるディレクトリーには、以下のディレクトリーを 1 つ以上含める必要があります。

postgresql-pre-start/

コンテナーを起動する初期段階で、このディレクトリーから *.sh ファイルが読み込まれます。バックグラウンドで実行している PostgreSQL デーモンはありません。

postgresql-cfg/

含まれる設定ファイル (*.conf) は、イメージの postgresql.conf ファイルの最後に含まれます。

postgresql-init/

含まれるシェルスクリプト (*.sh) は、(initdb の実行に成功した後に) データベースが新規に初期化されると読み込まれます。これにより、データディレクトリーは空ではなくなります。これらのスクリプトを利用する際に、ローカルの PostgreSQL サーバーが稼働している状態です。永続データディレクトリーを含む再デプロイメントのシナリオでは、スクリプトは読み込まれません (no-op)。

postgresql-start/

postgresql-init/ 同様ですが、これらのスクリプトは常に読み込まれます (postgresql-init/ スクリプトが存在する場合はその後に)。

S2I ビルドでは、提供されたすべてのファイルが新しいイメージの /opt/app-root/src/ ディレクトリーにコピーされます。カスタマイズには同じ名前のファイルのみがカスタマイズでき、ユーザーが提供するファイルは /usr/share/container-scripts/ ディレクトリーのデフォルトファイルよりも優先されるため、上書きできます。