第3章 外部データベースへの移行

Red Hat Satellite のインストールプロセスの一部として、satellite-installer コマンドは MongoDB および PostgreSQL のデータベースを Satellite と同じサーバー上にインストールします。Satellite のデプロイメントによっては、外部データベースがサーバーの負荷を軽減する場合もあります。お使いの Satellite デプロイメントが外部データベースを必要とする場合は、内部データベースをこの外部データベースに移行することが可能です。

外部データベースに MongoDB と PostgreSQL のどちらのデータベースが使用できるかについては、要件によって異なります。

Red Hat では、外部データベースのメンテナンスのサポートやそのためのツールは提供していません。これにはバックアップ、アップグレード、データベースのチューニングが含まれます。外部データベースを使用しているお客様は、外部データベースをサポート、メンテナンスする独自のデータベース管理者が必要になります。

お使いの Satellite Server のデータベースが内部のものか、それとも外部のものかを判断するには、データベースのステータスをクエリーします。たとえば、以下のコマンドに --onlypostgresql または rh-mongodb34-mongod を追加して実行します。

PostgreSQL の場合は、以下のコマンドを実行します。

# foreman-maintain service status --only postgresql

MongoDB の場合は、以下のコマンドを実行します。

# foreman-maintain service status --only rh-mongodb34-mongod

お使いの Satellite デプロイメントで外部データベースを必要とする場合は、以下の情報を使用して、Satellite から外部データベースに参照するように設定します。

3.1. 外部データベースとして MongoDB を使用する際の注意点

Pulp は MongoDB データベースを使用します。MongoDB を外部データベースとして使用する場合は、以下の情報を参照してお使いの Satellite 設定にこのオプションが適しているかどうかを判定してください。

外部 MongoDB の利点

  • Satellite 上の空きメモリーと空き CPU が増えます。
  • Satellite 操作にマイナスの影響をもたらすことなく MongoDB サーバーのシステムを調整する柔軟性が得られます。

外部 MongoDB のマイナス点

  • デプロイメントの複雑性が増し、問題解決がより困難になります。
  • 外部 MongoDB サーバーだと、パッチおよびメンテナンス対象に新たなシステムが加わることになります。
  • Satellite または Mongo データベースサーバーのいずれかにハードウェアまたはストレージ障害が発生すると、Satellite が機能しなくなります。
  • Satellite と外部データベースサーバーの間でレイテンシーが発生すると、パフォーマンスに影響が出ます。

お使いの Mongo データベースが遅いと感じられる場合は、Red Hat サポートチームと協力して問題解決に当たることができます。Satellite 6 での設定問題や既存のパフォーマンス問題については、外部データベースサーバーに移行したとしても解決が期待できないものもあります。Red Hat サポートチームは既知の問題を調査するほか、Satellite エンジニアリングチームとも協力して根本原因を見つけ出します。

3.2. 外部データベースとして PostgreSQL を使用する際の注意点

Foreman、Katello、および Candlepin は PostgreSQL データベースを使用します。PostgreSQL を外部データベースとして使用する場合は、以下の情報を参照してお使いの Satellite 設定にこのオプションが適しているかどうかを判定してください。

外部 PostgreSQL の利点

  • Satellite 上の空きメモリーと空き CPU が増えます。
  • PostgreSQL データベースで shared_buffers を高い値に設定しても、Satellite 上の他のサービスの妨げるリスクがありません。
  • Satellite 操作にマイナスの影響をもたらすことなく PostgreSQL サーバーのシステムを調整する柔軟性が得られます。

外部 PostgreSQL のマイナス点

  • デプロイメントの複雑性が増し、問題解決がより困難になります。
  • 外部 PostgreSQL サーバーだと、パッチおよびメンテナンス対象に新たなシステムが加わることになります。
  • Satellite または PostgreSQL データベースサーバーのいずれかにハードウェアまたはストレージ障害が発生すると、Satellite が機能しなくなります。
  • Satellite と外部データベースサーバーの間でレイテンシーが発生すると、パフォーマンスに影響が出ます。

お使いの Satellite 上の PostgreSQL データベースがパフォーマンスを低下させていることが疑われる場合は、Satellite 6: How to enable postgres query logging to detect slow running queries を参照して遅いクエリーがあるかどうか判定します。1 秒以上かかるクエリーがある場合は、通常、大規模インストールのパフォーマンスが原因であることが多く、外部データベースに移行しても問題解決が期待できません。遅いクエリーがある場合は、Red Hat サポートチームまでお問い合わせください。

3.3. 概要

Satellite 用に外部データベースを作成、使用するには、以下の手順を実行します。

  1. オンラインネットワークからの Satellite Server のインストール』の「ストレージの要件とガイドライン」を参照して、外部データベースのストレージ要件をプラニングします。
  2. PostgreSQL で Foreman および Candlepin 用のデータベースを準備し、Foreman と Candlepin のそれぞれのユーザーに対して所有者ロールを用意します。
  3. pulp_database を所有している Pulp ユーザーで MongoDB を準備します。
  4. 既存の Satellite データベースのバックアップを作成します。
  5. 内部 Satellite データベースを外部データベースに移行します。
  6. satellite-installer コマンドの引数を編集して新規データベースを参照するようにし、satellite-installer を実行します。

データベースをインストールするための Red Hat Enterprise Linux Server 7 の準備

必要となるのは最新の Red Hat Enterprise Linux Server 7 でプロビジョニングされた新たなシステムで、これは『オンラインネットワークからの Satellite Server のインストール』の「ストレージの要件とガイドライン」に記載されているストレージ要件を満たしている必要があります。

Red Hat Software Collections および Red Hat Enterprise Linux のサブスクリプションでは、外部データベースと Satellite を併用する場合に、正しいサービスレベルアグリーメントが提供されません。外部データベースに使用するベースシステムに、Satellite サブスクリプションもアタッチする必要があります。

  1. Satellite サブスクリプションをお使いのサーバーに割り当てます。詳細については、『オンラインネットワークからの Satellite Server のインストール』の「Satellite サブスクリプションの確認、およびホストへのサブスクリプションの割り当て」を参照してください。
  2. MongoDB および PostgreSQL サーバーを Red Hat Enterprise Linux Server 7 にインストールするには、すべてのリポジトリーを無効にし、以下のリポジトリーのみを有効にする必要があります。

    # subscription-manager repos --disable '*'
    # subscription-manager repos --enable=rhel-server-rhscl-7-rpms \
    --enable=rhel-7-server-rpms

3.4. MongoDB のインストール

インストール可能な MongoDB は、内部データベースのインストール中に satellite-installer ツールでインストールされたものと同じバージョンの MongoDB のみになります。MongoDB はサポート対象のバージョンであれば、Red Hat Software Collections (RHSCL) リポジトリーからまたは外部ソースからインストールすることが可能です。Satellite は MongoDB バージョン 3.4 をサポートしています。

  1. MongoDB をインストールするには、以下のコマンドを入力します。

    # yum install rh-mongodb34 rh-mongodb34-syspaths
  2. rh-mongodb34-mongod サービスを起動して有効にします。

    # systemctl start rh-mongodb34-mongod
    # systemctl enable rh-mongodb34-mongod
  3. MongoDB で Pulp ユーザーを作成します。

    # mongo pulp_database \
    --eval "db.createUser({user:'pulp',pwd:'pulp_password',roles:[{role:'dbOwner', db:'pulp_database'},{ role: 'readWrite', db: 'pulp_database'}]})"
  4. /etc/opt/rh/rh-mongodb34/mongod.conf ファイルを編集して security セクションの認証を有効にします。

    security:
      authorization: enabled
  5. /etc/opt/rh/rh-mongodb34/mongod.conf ファイルでバインド IP を指定します。

    bindIp: your_mongodb_server_bind_IP,::1
  6. rh-mongodb34-mongod サービスを再起動します。

    # systemctl restart rh-mongodb34-mongod
  7. MongoDB にポート 27017 を開きます。

    # firewall-cmd --add-port=27017/tcp
    # firewall-cmd --add-port=27017/tcp --permanent
  8. Satellite Server からデータベースにアクセスできることをテストします。接続が成功すると、コマンドから 1 が返ります。

    # scl enable rh-mongodb34 " mongo --host mongo.example.com \
    -u pulp -p pulp_password --port 27017 --eval 'ping:1' pulp_database"

3.5. PostgreSQL のインストール

インストール可能な PostgreSQL は、内部データベースのインストール中に satellite-installer ツールでインストールされたものと同じバージョンの PostgreSQL のみになります。Satellite がサポートするのは、Red Hat Enterprise Linux Server 7 リポジトリーから入手可能な特定バージョンの PostgreSQL のみになります。PostgreSQL はサポート対象のバージョンであれば、Red Hat Enterprise Linux Server 7 リポジトリーからまたは外部ソースからインストールすることが可能です。サポート対象の PostgreSQL バージョンを格納しているリポジトリーについての情報は、『Package Manifest』を参照してください。

  1. PostgreSQL をインストールするには、以下のコマンドを入力します。

    # yum install postgresql-server

    PostgreSQL を初期化して起動、有効にするには、以下のコマンドを実行します。

    # postgresql-setup initdb
    # systemctl start postgresql
    # systemctl enable postgresql
  2. /var/lib/pgsql/data/postgresql.conf ファイルを編集します。

    # vi /var/lib/pgsql/data/postgresql.conf
  3. 以下の行から # を削除して、着信接続をリッスンするようにします。

    listen_addresses = '*'
  4. /var/lib/pgsql/data/pg_hba.conf ファイルを編集します。

    # vi /var/lib/pgsql/data/pg_hba.conf
  5. 以下の行を追加します。

      host  all   all   satellite_server_ip/24   md5
  6. postgreSQL サービスを再起動して、変更を適用します。

    # systemctl restart postgresql
  7. postgres ユーザーに切り替え、PostgreSQL クライアントを起動します。

    $ su - postgres -c psql
  8. Foreman と Candlepin 用にそれぞれ、ユーザー、データベース、および専用ロールを作成します。

    CREATE USER "foreman" WITH PASSWORD 'Foreman_Password';
    CREATE USER "candlepin" WITH PASSWORD 'Candlepin_Password';
    CREATE DATABASE foreman OWNER foreman;
    CREATE DATABASE candlepin OWNER candlepin;
  9. 外部 PostgreSQL サーバーで postgresql ポートを開きます。

    # firewall-cmd --add-service=postgresql
    # firewall-cmd --add-service=postgresql --permanent
  10. Satellite Server から、データベースにアクセスできることをテストします。接続に成功した場合には、コマンドは 1 を返します。

    # PGPASSWORD='Foreman_Password' psql -h postgres.example.com  -p 5432 -U foreman -d foreman -c "SELECT 1 as ping"
    # PGPASSWORD='Candlepin_Password' psql -h postgres.example.com -p 5432 -U candlepin -d candlepin -c "SELECT 1 as ping"

外部データベースへの移行

内部データベースを外部データベースに移行するには、以下の手順に従います。

  1. Satellite Server で Satellite サービスを停止します。

    # foreman-maintain service stop
  2. postgreSQL および mongod のサービスを起動します。

    # systemctl start postgresql
    # systemctl start mongod
  3. 内部データベースのバックアップを作成します。

    # foreman-maintain backup online --skip-pulp-content --preserve-directory -y /var/migration_backup
  4. データを新規外部データベースに転送します。

    PGPASSWORD='Satellite_Password' pg_restore -h postgres.example.com -U foreman -d foreman < /var/migration_backup/foreman.dump
    PGPASSWORD='Candlepin_Password' pg_restore -h postgres.example.com -U candlepin -d candlepin < /var/migration_backup/candlepin.dump
    mongorestore --host mongo.example.com --db pulp_database --username pulp --password pulp_password /var/migration_backup/mongo_dump
  5. satellite-installer コマンドを使って Satellite が新規データベースを参照するように更新します。

    satellite-installer --scenario satellite \
        --foreman-db-host postgres.example.com \
        --foreman-db-password Foreman_Password \
        --foreman-db-database foreman \
        --foreman-db-manage false \
        --katello-candlepin-db-host postgres.example.com \
        --katello-candlepin-db-name candlepin \
        --katello-candlepin-db-password Candlepin_Password \
        --katello-candlepin-manage-db false \
        --katello-pulp-db-username pulp \
        --katello-pulp-db-password pulp_password \
        --katello-pulp-db-seeds mongo.example.com:27017 \
        --katello-pulp-db-name pulp_database \
        --katello-pulp-manage-db false