HA PEM using the SM architecture with Patroni#

このページでは、リファレンスアーキテクチャSMに従って高可用性HAPEM展開をインストールおよび構成するための詳細な手順を提供します。

この例では、クラスター管理にPatroniを使用し、PEMバックエンドデータベースとしてPostgreSQL 17を、プライマリにトラフィックをルーティングするメカニズムとしてマルチホスト文字列を使用します。私たちのオペレーティングシステムはRHEL 9 x86です。

他のオプションを理解するには、 High availability patterns for PEM deployment を参照してください。以下の例では、次のIPアドレスを使用します。

  • 172.16.161.200-PEMバックエンドプライマリ

  • 172.16.161.201-PEMバックエンドスタンバイ1

  • 172.16.161.202-PEMバックエンドスタンバイ2

  • 172.16.161.211-PEM Webアプリケーション1

  • 172.16.161.212-PEM Webアプリケーション2

  • 172.16.161.213-PEM Webアプリケーション3

  • 172.16.161.111 - etcd-node-1

  • 172.16.161.112 - etcd-node-2

  • 172.16.161.113 - etcd-node-3

etcdを使用した分散コンセンサスストアの設定#

Patroniには分散コンセンサスストアDCSが必要です。 etcdを使用してDCSを設定している場合、この手順をスキップして、既存のDCSを使用できます。ここでは、 HA PEMアプリケーションクラスターとは別に、3つのホストに最小限の3ノードDCSを作成します。

各ノードで

  1. PGDGリポジトリからetcdをインストールする

dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
dnf --enablerepo=pgdg-rhel9-extras install -y etcd
  1. /etc/etcd/etcd.conf の内容を次のものに置き換え、 <node-ip> およびnode-name の適切な値を置き換えます。例、172.16.161.111 、etcd-node-1 。

#[Member]
ETCD_LISTEN_PEER_URLS="http://<node-ip>:2380"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://<node-ip>:2379"
ETCD_NAME="<node-name>"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://<node-ip>:2380"
ETCD_INITIAL_CLUSTER="etcd-node-1=http://172.16.161.111:2380,etcd-node-2=http://172.16.161.112:2380,etcd-node-3=http://172.16.161.113:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://<node-ip>:2379"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_INITIAL_CLUSTER_STATE="new"
  1. ポート2380 および2379 がファイアウォールで開いていることを確認します。

firewall-cmd --zone=public --add-port=2380/tcp --permanent
firewall-cmd --zone=public --add-port=2379/tcp --permanent
firewall-cmd --reload
  1. etcdサービスが再起動され有効になっていることを確認します。

systemctl enable etcd
systemctl restart etcd

EDBリポジトリの構成#

すべてのバックエンドおよびWebアプリケーションノードで、EDB Reposを構成します。詳細については、 Getting started with repositories を参照してください。

curl -1sLf  https://downloads.enterprisedb.com/<token>/<repo>/setup.rpm.sh | bash

PEMバックエンドの展開#

初期パッケージのインストールとPostgres構成#

特に記載がない限り、すべてのバックエンドノードで次の手順を実行します。

  1. 次のパッケージをインストールします。

dnf -qy module disable postgresql
dnf -y --allowerasing install postgresql17-server postgresql17-contrib edb-pem sslutils_17 edb-patroni
  1. Postgresデータベースを初期化し、サービスを開始します。

PGSETUP_INITDB_OPTIONS="-E UTF-8" /usr/pgsql-17/bin/postgresql-17-setup initdb
systemctl start postgresql-17
systemctl enable postgresql-17
  1. ファイアウォールでポート5432 を開きます。

firewall-cmd --zone=public --add-port=5432/tcp --permanent
firewall-cmd --reload

プライマリバックエンドノードでPEMを構成する#

PEMデータベースのインストール プライマリバックエンドサーバーのみ を構成します。

プライマリで次の手順を実行します。

  1. パスワードを使用してログインできるスーパーユーザーを作成します。これは、PEMのインストールに使用するユーザーです。また、PEMバックエンドホストで実行されているエージェントのエージェントサーバーバインディングユーザーにもなります。

su - postgres -c "psql -c \"create role pemserver login superuser password your-password-here;\""
  1. オプション3データベースと3つのバックエンドホストすべてのIPをpemserver ユーザーとして指定して、PEM構成スクリプトを実行します。プライマリの外部IPアドレスではなく、ループバックIPアドレスを提供します。 PEM 10.3以降を使用している場合、agent-server-bind hostをループバックIPとして指定します。

/usr/edb/pem/bin/configure-pem-server.sh -t 3 \
                                         -ho 127.0.0.1,172.16.161.201,172.16.161.202 \
                                         -su pemserver \
                                         -asb-host-name 127.0.0.1

さまざまな追加の詳細の入力を求められます。 構成オプションについては、 Configuring the PEM server on Linux を参照してください。

  1. オプションで、インスタンス間でPEM Webアプリケーションのユーザー設定を同期するには、 configure central storage of user preferences 。この段階では、バックエンド構成のみを完了できます。 後でWebアプリケーションを構成します。

構成レコードをスタンバイにコピーする#

ファイル/usr/edb/pem/share/.install-config をプライマリからすべてのスタンバイにコピーします。これにより、将来的に現在のプライマリノードからPEMをアップグレードできることが保証されます。

プライマリノードでPatroniを設定する#

Patroniユーザーを作成し、構成ファイルを生成する#

  1. Patroniスーパーユーザー、レプリケーション、およびリワインドロールを作成します。スーパーユーザーとして次のSQLを実行します。

-- Patroni superuser
CREATE USER patroni_super WITH SUPERUSER ENCRYPTED PASSWORD your-password-here;

-- Patroni replication user
CREATE USER patroni_rep WITH REPLICATION ENCRYPTED PASSWORD your-password-here;

-- Patroni rewind user, if you intend to enable use_pg_rewind in your Patroni configuration
CREATE USER patroni_rew WITH ENCRYPTED PASSWORD your-password-here;
GRANT EXECUTE ON function pg_catalog.pg_ls_dir(text, boolean, boolean) TO patroni_rew;
GRANT EXECUTE ON function pg_catalog.pg_stat_file(text, boolean) TO patroni_rew;
GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text) TO patroni_rew;
GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text, bigint, bigint, boolean) TO patroni_rew;

選択したパスワードを入力します。

  1. 現在のインスタンスからPatroni構成ファイルを生成します。ユーザーpostgres が所有していることを確認します。

patroni --generate-config --dsn host=localhost user=patroni_super dbname=postgres /etc/patroni/patroni.yml
chown postgres:postgres /etc/patroni/patroni.yml

生成された構成ファイルを編集します#

生成されたファイルでは

  1. クラスターの名前をscope の下に設定し、ノードの一意の名前をname の下に設定します。

  2. etcdクラスターをDCSとして使用するようにPatroniに指示します。以下をトップレベルファイルに追加します。

etcd3:
  hosts:
    - 172.16.161.111:2379
    - 172.16.161.112:2379
    - 172.16.161.113:2379
  1. 手順1で構成したユーザーの詳細をpostgresql.authentication の下に追加します。例

authentication:
    replication:
        username: patroni_rep
        password: your-password-here
    superuser:
        username: patroni_super
        password: your-password-here
    rewind:
        username: patroni_rew
        password: your-password-here
  1. postgresql.listen を'*:5432' に変更します

  2. postgresql.bin_dir を/usr/pgsql-17/bin に変更します。この行が存在しない場合は追加します。

  3. pg_hba: キー自分自身を含むpostgresql.pg_hba セクション全体を削除します。保持するルールを作成した場合、次のステップに向けてコピーを取っておくことができます。

  4. bootstrap.dcs.postgresql の下にpg_hba セクションを作成し、すべてのノードに共通のHBAルールのセットを入力します。次の例は、この例のPEMとPatroniに必要なすべてのアクセスを提供します。

# Allow users of the web interface to connect to pem and postgres databases
- hostssl pem      +pem_user   127.0.0.1/32      scram-sha-256
- hostssl postgres +pem_user   127.0.0.1/32      scram-sha-256
- hostssl pem      +pem_user   172.16.161.211/32  scram-sha-256
- hostssl postgres +pem_user   172.16.161.211/32  scram-sha-256
- hostssl pem      +pem_user   172.16.161.212/32  scram-sha-256
- hostssl postgres +pem_user   172.16.161.212/32  scram-sha-256
- hostssl pem      +pem_user   172.16.161.213/32  scram-sha-256
- hostssl postgres +pem_user   172.16.161.213/32  scram-sha-256

# Allow the PEM server agents to register and connect to send data to PEM server
- hostssl pem      +pem_agent  127.0.0.1/32            cert
- hostssl pem      +pem_admin  172.16.161.200/32        scram-sha-256
- hostssl pem      +pem_agent  172.16.161.200/32        cert
- hostssl pem      +pem_admin  172.16.161.201/32        scram-sha-256
- hostssl pem      +pem_agent  172.16.161.201/32        cert
- hostssl pem      +pem_admin  172.16.161.202/32        scram-sha-256
- hostssl pem      +pem_agent  172.16.161.202/32        cert

# Allow monitoring agents to connect to PEM
# Specify the subnet you selected during PEM configuration
- hostssl pem      +pem_user   0.0.0.0/0               scram-sha-256
- hostssl pem      +pem_agent  0.0.0.0/0               cert

# Allow our Patroni users to connect as required
# Superuser only requires local connection
- host    all             patroni_super     127.0.0.1/32            scram-sha-256
# Replication and rewind users require connection from other Patroni hosts
- hostssl replication     patroni_rep     127.0.0.1/32            scram-sha-256
- hostssl all             patroni_rew     127.0.0.1/32            scram-sha-256
- hostssl replication     patroni_rep     172.16.161.200/32        scram-sha-256
- hostssl all             patroni_rew     172.16.161.200/32        scram-sha-256
- hostssl replication     patroni_rep     172.16.161.201/32        scram-sha-256
- hostssl all             patroni_rew     172.16.161.201/32        scram-sha-256
- hostssl replication     patroni_rep     172.16.161.202/32        scram-sha-256
- hostssl all             patroni_rew     172.16.161.202/32        scram-sha-256

# This is the default config for this PG package
- local   all             all                                     peer
- host    all             all             127.0.0.1/32            scram-sha-256
- host    all             all             ::1/128                 scram-sha-256
- local   replication     all                                     peer
- host    replication     all             127.0.0.1/32            scram-sha-256
- host    replication     all             ::1/128                 scram-sha-256
  1. Postgresサービスを停止して無効にし、Patroniを起動します

systemctl disable --now postgresql-17
systemctl enable --now patroni

スタンバイノードのセットアップ#

各スタンバイノードで

  1. Postgresのサービスを停止して無効にします。

systemctl disable --now postgresql-17
  1. データベースサーバーのデータディレクトリを削除します。

rm -rf /var/lib/pgsql/17/data
  1. /etc/patroni/patroni.yml にPatroni構成ファイルを作成します。プライマリと同じコンテンツを使用しますが、次の変更を行います。

    • bootstrap セクション全体を削除します

    • name を各スタンバイの一意の名前に変更します

    • restapi およびpostgresql.connect_address の下のIPアドレスを、構成しているスタンバイのアドレスに変更します。

  2. Patroniを起動して有効にします。

systemctl enable --now patroni

スタンバイにエージェントとサーバーを登録する#

各スタンバイで、次の手順を実行します。

  1. PEMエージェントを登録します。 PEMサーバーホストとしてマルチホスト文字列を指定し、アラートと通知の処理を有効にします。プライマリとの一貫性を保つために、ローカルホストのループバックIPアドレス127.0.0.1を提供します。例、スタンバイ1の場合

export PEM_SERVER_PASSWORD=pemserver-password-here
/usr/edb/pem/agent/bin/pemworker --register-agent \
                                 --pem-server 172.16.161.200,127.0.0.1,172.16.161.202 \
                                 --pem-user pemserver \
                                 --pem-port 5432 \
                                 -o alert_threads=1 \
                                 --enable-snmp true \
                                 --enable-webhook true \
                                 --enable-smtp true \
                                 --max-webhook-retries 3

PEMエージェントサービスを有効にして開始します。

systemctl enable --now pemagent

詳細については、 Registering a PEM Agent を参照してください。

  1. PostgresインスタンスをPEMに登録します。 次のコマンドは、データベースへのクライアント接続を作成するときにPEM Webアプリケーションがサーバーの外部IPを使用しますが、PEMエージェントがループバックインターフェイスを使用してローカルに接続することを意味します。

export PEM_SERVER_PASSWORD=pemserver-password-here
export PEM_MONITORED_SERVER_PASSWORD=pemserver-password-here
/usr/edb/pem/agent/bin/pemworker --register-server \
                                 --pem-user pemserver \
                                 --server-addr 172.16.161.201 \
                                 --server-port 5432 \
                                 --server-database postgres \
                                 --server-user pemserver \
                                 --asb-host-name localhost

詳細は Registering a Postgres Server を参照してください

スタンバイをPEMバックエンドとして登録する#

プライマリで次の手順を実行します。

pem データベースでスーパーユーザーとして次のSQLを実行し、各スタンバイに正しいサーバーとポートを提供します。

SELECT pem.register_pem_server(id) FROM pem.server WHERE server=172.16.161.201 and port=5432;
SELECT pem.register_pem_server(id) FROM pem.server WHERE server=172.16.161.202 and port=5432;

PEM Webアプリケーションの展開#

すべてのWebアプリケーションホストで次の手順を実行します。

  1. PEMパッケージとPostgresクライアントバイナリ用をインストールします。

dnf install edb-pem postgresql17-server
  1. すべてのサーバーのファイアウォールで次のポートを開きます。

  • PEMサーバーHTTPSの8443

例

firewall-cmd --zone=public --add-port=8443/tcp --permanent
firewall-cmd --reload
  1. PEM Webアプリケーションを構成します。プライマリとすべてのスタンバイを含むマルチホスト文字列をPEMサーバーアドレスとして提供します。

/usr/edb/pem/bin/configure-pem-server.sh -t 2 -ho 172.16.161.200,172.16.161.201,172.16.161.202

さまざまな追加の詳細の入力を求められます。 構成オプションについては、 Configuring the PEM server on Linux を参照してください。

  1. configure-selinux.sh スクリプトを実行して、PEMのSELinuxポリシーを構成します。

USE_NGINX=1 /usr/edb/pem/bin/configure-selinux.sh
  1. これで、前に作成したpemserver スーパーユーザーを使用して、Webアプリケーションインスタンスにログインできます。

  2. インスタンス間でPEM Webアプリケーションのユーザー設定を同期することを選択した場合、 configuring each web application instance to use the backend for user settings によって今すぐセットアップを完了します。

  3. PEM 10.2または10.1を使用している場合、PEM Webアプリケーションにログインし、オブジェクトエクスプローラーでプライマリサーバーを右クリックして、Properties > PEM Agent に移動します。 Host の値がマルチホスト文字列の場合、localhost または127.0.0.1 に変更します。