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=VALUE
を podman run
コマンドに渡して初期化中に設定できる以下の環境変数を認識します。
変数名 | 説明 |
---|---|
| 作成される PostgreSQL アカウントのユーザー名 |
| ユーザーアカウントのパスワード |
| データベース名 |
| postgres 管理アカウントのパスワード (任意) |
postgres
管理者アカウントには、デフォルトでパスワードが設定されず、ローカル接続のみが許可されます。コンテナーを初期化するときに POSTGRESQL_ADMIN_PASSWORD
環境変数を設定することで設定できます。これにより、postgres
アカウントにリモートでログインすることができます。ローカル接続にはパスワードは必要ありません。
パスワードはイメージ設定の一部であるため、データベースユーザーと postgres 管理ユーザーのパスワードを変更するためにサポートされている唯一の方法は、環境変数 POSTGRESQL_PASSWORD
および POSTGRESQL_ADMIN_PASSWORD
をそれぞれ変更することです。SQL ステートメントまたは前述の環境変数以外の方法でデータベースのパスワードを変更すると、変数に格納されている値と実際のパスワードが一致しなくなります。データベースのコンテナーイメージを起動するたびに、パスワードは環境変数に保存されている値にリセットされます。
以下のオプションは移行に関するものです。
変数名 | 説明 | デフォルト |
---|---|---|
| 移行元となるホスト名/IP | |
|
リモートの | |
| オプション: sql のインポートエラーを無視する | いいえ |
以下の環境変数は PostgreSQL 設定ファイルに影響があり、すべて任意です。
変数名 | 説明 | デフォルト |
---|---|---|
| 許可されるクライアント接続の最大数。これにより、準備済みトランザクションの最大数も設定します。 | 100 |
| 準備状態にあるトランザクションの最大数を設定します。準備済みトランザクションを使用している場合は、max_connections よりも大きい値にする必要があります。 | 0 |
| データのキャッシュに使用する PostgreSQL 専用のメモリー容量を設定します。 | 32M |
| オペレーティングシステムおよびデータベース自体によるディスクキャッシュで利用できるメモリーの推定値に設定します。 | 128M |
PostgreSQL イメージが --memory
パラメーターセットで実行され、POSTGRESQL_SHARED_BUFFERS
および POSTGRESQL_EFFECTIVE_CACHE_SIZE
に値が指定されていない場合は、--memory
パラメーターで提供される値をもとにこれらの値が自動的に算出されます。値はアップストリームの式に基づいて計算され、指定されたメモリーの 1/4 および 1/2 に設定されます。
-v /host:/container
オプションを podman run
コマンドに渡すと、以下のマウントポイントを設定することもできます。
ボリュームマウントポイント | 説明 |
---|---|
| 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
変数を設定します。
| データファイルは古いデータディレクトリーから新しいディレクトリーにコピーされます。このオプションは、アップグレードに失敗した場合にデータ損失のリスクが低くなります。 |
| データファイルは、以前のデータディレクトリーから新しいデータディレクトリーにハードリンクされるため、パフォーマンスが最適化されます。ただし、障害が発生した場合でも、古いディレクトリーは使用できなくなります。 |
コピーしたデータ用に十分な容量があることを確認してください。領域が不十分なためにアップグレードが失敗すると、データが失われる可能性があります。
14.3.6. イメージの拡張
PostgreSQL イメージは、source-to-image を使用して拡張できます。
たとえば、~/image-configuration/
ディレクトリーの設定が含まれるカスタマイズされた new-postgresql
イメージをビルドするには、以下のコマンドを使用します。
$ s2i build ~/image-configuration/ postgresql new-postgresql
S2I ビルドに渡されるディレクトリーには、以下のディレクトリーを 1 つ以上含める必要があります。
|
コンテナーを起動する初期段階で、このディレクトリーから |
|
含まれる設定ファイル ( |
|
含まれるシェルスクリプト ( |
|
|
S2I ビルドでは、提供されたすべてのファイルが新しいイメージの /opt/app-root/src/
ディレクトリーにコピーされます。カスタマイズには同じ名前のファイルのみがカスタマイズでき、ユーザーが提供するファイルは /usr/share/container-scripts/
ディレクトリーのデフォルトファイルよりも優先されるため、上書きできます。