3.3. PostgreSQL
3.3.1. 概要
OpenShift Online は、PostgreSQL の実行用のコンテナーイメージを提供します。このイメージでは、設定で指定されるユーザー名、パスワード、データベース名を基にデータベースサービスが提供されます。
3.3.2. バージョン
現時点で、OpenShift Online は PostgreSQL のバージョン 9.4 および 9.5 をサポートします。
3.3.3. イメージ
RHEL 7 イメージは、Red Hat レジストリーから入手できます。
$ docker pull registry.access.redhat.com/rhscl/postgresql-94-rhel7 $ docker pull registry.access.redhat.com/rhscl/postgresql-95-rhel7
これらのイメージは、postgresql
イメージストリームで使用することができます。
3.3.4. 設定および用途
3.3.4.1. データベースの初期化
共有ボリュームを初めて使用する場合には、データベース、データベースの管理ユーザー、PostgreSQL root ユーザー (POSTGRESQL_ADMIN_PASSWORD
環境変数を指定した場合) が作成され、次に PostgreSQL デーモンが起動します。その後、PostgreSQL デーモンが起動します。別のコンテナーにボリュームを再アタッチする場合には、データベース、データベースユーザー、管理者ユーザーは作成されず、PostgreSQL デーモンが開始されます。
以下のコマンドは、新しいデータベースの Pod を作成し、さらにコンテナー内で PostgreSQL を実行します。
$ oc new-app \ -e POSTGRESQL_USER=<username> \ -e POSTGRESQL_PASSWORD=<password> \ -e POSTGRESQL_DATABASE=<database_name> \ postgresql:9.5
3.3.4.2. コンテナーでの PostgreSQL コマンドの実行
OpenShift Online は Software Collections (SCL) を使用して、PostgreSQL をインストールし、起動します。(デバッグ用に) 実行中のコンテナー内で PostgreSQL コマンドを実行する場合には bash を使用して呼び出す必要があります。
これには、まず、実行中の PostgreSQL Pod の名前を特定します。たとえば、現在のプロジェクトで Pod の一覧を表示できます。
$ oc get pods
次に、任意の Pod に対してリモートシェルセッションを開きます。
$ oc rsh <pod>
コンテナーに入ると、必要な SCL が自動的に有効になります。
Bash シェルから psql コマンドを実行し、PostgreSQL の対話セッションを開始して通常の PostgreSQL 操作が実行できるようになりました。たとえば、データベースユーザーとして認証するには、以下を実行します。
bash-4.2$ PGPASSWORD=$POSTGRESQL_PASSWORD psql -h postgresql $POSTGRESQL_DATABASE $POSTGRESQL_USER psql (9.5.16) Type "help" for help. default=>
完了したら、\q と入力して PostgreSQL セッションを終了します。
3.3.4.3. 環境変数
PostgreSQL ユーザー名、パスワード、データベース名は、以下の環境変数で設定する必要があります。
変数名 | 説明 |
---|---|
| 作成予定の PostgreSQL アカウントのユーザー名。このユーザーには、対象のデータベースに対する完全な権限があります。 |
| ユーザーアカウントのパスワード |
| データベース名 |
| postgres 管理ユーザーの任意パスワード。これが設定されていない場合には、postgres アカウントにリモートからログインができません。コンテナーからはいつでも、パスワードなしにローカル接続が可能です。 |
ユーザー名、パスワード、データベース名を指定する必要があります。この 3 つすべてを指定しない場合には、Pod は起動に失敗し、OpenShift Online は Pod の再起動を継続的に試行します。
PostgreSQL 設定は、以下の環境変数で設定できます。
変数名 | 説明 | デフォルト |
---|---|---|
| 許容範囲の最大クライアント接続数 | 100 |
|
「準備」状態にすることのできる最大トランザクション数。準備状態のトランザクションを使用する場合には、値は | 0 |
| データのキャッシュ用に PostgreSQL 専用に割り当てられたメモリー量 | 32M |
| オペレーティングシステム別または PostgreSQL 自体で、ディスクキャッシュに利用可能な予想メモリー量 | 128M |
3.3.4.4. ボリュームのマウントポイント
PostgreSQL イメージは、マウントしたボリュームで実行して、データベース用に永続ストレージを有効化できます。
- /var/lib/pgsql/data: これは、PostgreSQL がデータベースファイルを保存するデータベースクラスターのディレクトリーです。
3.3.4.5. パスワードの変更
パスワードはイメージ設定の一部であるため、データベースユーザー (POSTGRESQL_USER
) と postgres 管理者ユーザーのパスワードを変更する唯一のサポートされている方法として、環境変数 POSTGRESQL_PASSWORD
と POSTGRESQL_ADMIN_PASSWORD
をそれぞれ変更することができます。
現在のパスワードは、Pod またはデプロイメント設定を Web コンソールで表示するか、CLI で環境変数を表示して、確認できます。
$ oc set env pod <pod_name> --list
SQL ステートメントや、前述した環境変数以外の方法でデータベースのパスワードを変更すると、変数に保存されている値と、実際のパスワードが一致しなくなる可能性があります。データベースコンテナーが起動するたびに、パスワードは環境変数に保存されている値にリセットされます。
これらのパスワードを変更するには、oc set env
コマンドを使用して、関連するデプロイメント設定の任意の環境変数 1 つまたは両方を更新します。たとえば、テンプレートからアプリケーションを作成する場合など、複数のデプロイメント設定がこれらの環境変数を使用する場合には、デプロイメント設定ごとに変数を更新し、パスワードがどこでも同期されるようにします。これは、すべて同じコマンドで実行できます。
$ oc set env dc <dc_name> [<dc_name_2> ...] \ POSTGRESQL_PASSWORD=<new_password> \ POSTGRESQL_ADMIN_PASSWORD=<new_admin_password>
アプリケーションによっては、アプリケーションの他の場所にあるパスワードの他の環境変数を更新して一致させる必要があるものもあります。たとえば、フロントエンド Pod のより一般的な DATABASE_USER
変数などは、データベースユーザーのパスワードと一致する必要がある場合があります。必要とされる環境変数すべてにおいて、パスワードがアプリケーションごとに一致しているようにしてください。 一致しない場合には、トリガーされた時点で、Pod の再デプロイメントが失敗する場合があります。
設定変更トリガーが設定されている場合には、環境変数を更新すると、データベースサーバーの再デプロイメントがトリガーされます。設定されていない場合には、新しいデプロイメントを手動で起動して、パスワードの変更を適用する必要があります。
新規パスワードが有効になっていることを確認するには、まず、実行中の PostgreSQL Pod に対してリモートシェルセッションを開きます。
$ oc rsh <pod>
Bash シェルから、データベースユーザーの新規パスワードを確認します。
bash-4.2$ PGPASSWORD=<new_password> psql -h postgresql $POSTGRESQL_DATABASE $POSTGRESQL_USER -c "SELECT * FROM (SELECT current_database()) cdb CROSS JOIN (SELECT current_user) cu"
パスワードが正しく変更された場合には、以下のような表が表示されるはずです。
current_database | current_user ------------------+-------------- default | django (1 row)
Bash シェルから postgres 管理者ユーザーの新規パスワードを検証します。
bash-4.2$ PGPASSWORD=<new_admin_password> psql -h postgresql $POSTGRESQL_DATABASE postgres -c "SELECT * FROM (SELECT current_database()) cdb CROSS JOIN (SELECT current_user) cu"
パスワードが正しく変更された場合には、以下のような表が表示されるはずです。
current_database | current_user ------------------+-------------- default | postgres (1 row)
3.3.5. テンプレートからのデータベースサービスの作成
OpenShift Online には テンプレートが含まれており、新規データベースサービスの作成を簡素化します。テンプレートには、必須の環境変数をすべて定義するパラメーターフィールドがあり (ユーザー、パスワード、データベース名など)、自動生成されたパスワード値など、事前定義済みのデフォルト値が設定されます。また、テンプレートは デプロイメント設定 および サービス の両方を定義します。
PostgreSQL テンプレートは、クラスターの初期設定時にクラスター管理者により、デフォルトの openshift プロジェクトに登録しておく必要があります。
以下のテンプレートを使用できます。
-
PostgreSQL-persistent
は、データベースのデータ用に永続ボリュームストアを使用するので、データは Pod が再起動されても残ります。
この説明に従い、テンプレートをインスタンス化できます。
サービスをインスタンス化したら、データベースにアクセスする予定のある別のコンポーネントのデプロイメント設定に、ユーザー名、パスワード、データベース名の環境変数をコピーできます。このコンポーネントは、定義したサービスを使用してこのデータベースにアクセスできます。