Using Failover Manager for high availability#

注釈

この手順は、既存のインストールではなく、新規インストールでPEMサーバーのフェールオーバーマネージャーを設定するための手順です。提供されたコマンドは、WebサーバーサービスにHTTPDが使用されるRHELベースのシステムの構成に適用されます。

Postgres Enterprise ManagerPEMは、データベース管理者、システムアーキテクト、およびパフォーマンスアナリストがPostgresデータベースサーバーを管理、監視、および調整するのに役立ちます。

Failover Managerは、EDBの高可用性ツールで、プライマリでソフトウェアまたはハードウェアに障害が発生しているときにPostgresプライマリノードをスタンバイノードにフェールオーバーできます。以下の例では、次のIPアドレスを使用します。

  • 172.16.161.200-PEMプライマリ

  • 172.16.161.201-PEMスタンバイ1

  • 172.16.161.202-PEMスタンバイ2

  • 172.16.161.203 - EFM Witnessノード

  • 172.16.161.245-PEM VIPエージェントとユーザーが接続するために使用します

以下はVIPアドレスを使用する必要があります。

  • 監視対象データベースサーバーのPEMエージェントバインディング

  • PEM Webクライアントへのアクセス

  • ウェブサーバーサービスへのアクセス

製品の初期インストールと構成#

  1. プライマリと1つ以上のスタンバイに以下をインストールします。

    • PEMサーバーのバックエンドデータベース

これらのリンクを使用して製品ドキュメントのインストール手順を参照するか、

EDB repos website の手順を参照してください。

EDBリポジトリにアクセスする手順の USERNAME:PASSWORD を自分のユーザー名とパスワードに置き換えます。

PEMサーバー構成スクリプトは信頼できる認証では機能しないため、データベースサーバーがscram-sha-256認証方法を使用するように構成されていることを確認します。

EFMをインストールするには、java-1.8.0-openjdk パッケージをインストールする必要があります。

  1. プライマリサーバーとすべてのスタンバイサーバーで、タイプ1 Webサービスとデータベースの初期構成を使用してPEMサーバーを構成します。

    /usr/edb/pem/bin/configure-pem-server.sh -t 1
``` 構成タイプの詳細については、を参照してください。

3. プライマリサーバーとすべてのスタンバイサーバーのファイアウォールに次のポートを追加して、アクセスを許可します。

   -  `8443`  for PEM Server https)
   -  `5444`  EPAS 13の場合
   -  `7800`  EFM
   -  EFM Adminの場合 `7908`

例

```shell
        $ sudo firewall-cmd --zone=public --add-port=5444/tcp --permanent
        success
        $ sudo firewall-cmd --zone=public --add-port=8443/tcp --permanent
        success
        $ sudo firewall-cmd --zone=public --add-port=7800/tcp --permanent
        success
        $ sudo firewall-cmd --zone=public --add-port=7809/tcp --permanent
        success
        $ sudo firewall-cmd --reload
        success

ストリーミングレプリケーションのプライマリノードを設定する#

  1. レプリケーションロールを作成します。

$ /usr/edb/as13/bin/psql -h 172.16.161.200 -p 5444 -U enterprisedb edb -c “CREATE ROLE repl REPLICATION LOGIN PASSWORD password”;
CREATE ROLE

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

  1. postgresql.conf ファイルで次を構成します。

wal_level = replica
max_wal_senders = 10
wal_keep_size = 500
max_replication_slots = 10
ストリーミングレプリケーションのパラメーターの構成の詳細については、

PostgreSQL documentation を参照してください。

注釈

構成パラメーターは、データベースサーバーのバージョンが異なると異なる場合があります。これらのパラメーターの設定についてのヘルプが必要な場合は、EDBサポート techsupport@enterprisedb.com に電子メールを送信できます。

  1. ホストベースの認証/var/lib/edb/as13/data/pg_hba.conf ファイルに次のエントリを追加して、レプリケーションユーザーがすべてのスタンバイから接続できるようにします。

hostssl  replication  repl  172.16.161.201/24  scram-sha-256

注釈

必要に応じて、IPアドレスのcidrレンジを変更できます。

  1. pem_userロールのホストベースの認証/var/lib/edb/as13/data/pg_hba.conf ファイルを変更して、scram-sha-256認証方法を使用してすべてのデータベースに接続します。

# Allow local PEM agents and admins to connect to PEM server
hostssl all    +pem_user   172.16.161.201/24  scram-sha-256
hostssl pem    +pem_user   127.0.0.1/32       scram-sha-256
hostssl pem    +pem_agent  127.0.0.1/32         cert
# Allow remote PEM agents and users to connect to PEM server
hostssl pem   +pem_user    0.0.0.0/0          scram-sha-256
hostssl pem   +pem_agent   0.0.0.0/0          cert
  1. EPAS 13サーバーを再起動します。

systemctl restart edb-as-13.service

ストリーミングレプリケーションのスタンバイノードを設定する#

  1. すべてのスタンバイノードでEPAS 13のサービスを停止します。

$ systemctl stop edb-as-13.service

注釈

この例では、 pg_basebackupユーティリティを使用して、スタンバイサーバーにPEMバックエンドデータベースサーバーのレプリカを作成します。 pg_basebackupを使用する場合、既存のデータベースサーバーを停止し、既存のデータディレクトリを削除する必要があります。

  1. すべてのスタンバイノードでデータベースサーバーのデータディレクトリを削除します。

$ sudo su - enterprisedb

$ rm -rf /var/lib/edb/as13/data/*
  1. すべてのスタンバイノードのenterprisedbユーザーのホームディレクトリに.pgpass ファイルを作成します。

$ sudo su - enterprisedb

$ cat > ~/.pgpass << _EOF_
172.16.161.200:5444:replication:repl:CHANGE_ME
172.16.161.201:5444:replication:repl:CHANGE_ME
172.16.161.202:5444:replication:repl:CHANGE_ME
_EOF_

$ chmod 600 ~/.pgpass
  1. pg_basebackupを使用して、各スタンバイノードでプライマリノードのバックアップを取得します。

$ sudo su - enterprisedb /usr/edb/as13/bin/pg_basebackup -h 172.16.161.200 \
-D /var/lib/edb/as13/data -U repl -v -P -Fp -R -p 5444

backup コマンドは、スタンバイノードにpostgresql.auto.conf およびstandby.signal ファイルを作成します。 postgresql.auto.conf ファイルには次のコンテンツが含まれています。

sudo su - enterprisedb cat /var/lib/edb/as13/data/postgresql.auto.conf
# Do not edit this file manually
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = ‘user=repl passfile=’’/var/lib/edb/.pgpass’’ channel_binding=prefer host=172.16.161.200 port=5444 sslmode=prefer sslcompression=0 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsvrname=postgres target_session_attrs=any’
  1. 各スタンバイノードのpostgresql.conf ファイルで、次のパラメーターを編集します。

hot_standby = on
  1. 各スタンバイノードでEPAS 13データベースサーバーを起動します。

$ systemctl enable edb-as-13

$ systemctl start edb-as-13
  1. 次のファイルをプライマリノードからスタンバイノードの同じ場所にコピーし、既存のファイルを上書きします。ファイルのアクセス許可を設定します。

    • /etc/httpd/conf.d/edb-pem.conf

    • /etc/httpd/conf.d/edb-ssl-pem.conf

    • /root/.pem/agent1.crt

    • /root/.pem/agent1.key

    • /usr/edb/pem/agent/etc/agent.cfg

    • /usr/edb/pem/share/.install-config

    • /usr/edb/pem/web/pem.wsgi /usr/edb/pem/web/config_setup.py

例

$ mkdir -p /root/.pem
$ chown root:root /root/.pem
$ chmod 0755      /root/.pem
$ mkdir -p        /var/lib/pemhome/.pem
$ chown pem:pem   /var/lib/pemhome/.pem
$ chmod 0700      /var/lib/pemhome/.pem
$ mkdir -p        /usr/edb/pem/logs
$ chown root:root /usr/edb/pem/logs
$ chmod 0755      /usr/edb/pem/logs
$ for file in /etc/httpd/conf.d/edb-pem.conf     \
              /etc/httpd/conf.d/edb-ssl-pem.conf \
              /root/.pem/agent1.crt \
              /usr/edb/pem/agent/etc/agent.cfg \
              /usr/edb/pem/share/.install-config \
              /usr/edb/pem/web/pem.wsgi \
              /usr/edb/pem/web/config_setup.py; do \
       chown root:root ${file}; \
       chmod 0644      ${file}; \
    done;
$ chmod 0600 /root/.pem/agent1.key
$ chown root:root /root/.pem/agent1.key

このコードは、ウェブサーバーがスタンバイで構成され、デフォルトで無効になっていることを確認します。 EFMによるスイッチオーバーにより、Webサーバーが有効になります。

注釈

証明書が更新されるたびに、マスターとスタンバイで証明書の同期を手動で維持します。

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

$ /usr/edb/pem/bin/configure-selinux.sh
getenforce found, now executing getenforce command
Configure the httpd to work with the SELinux
Allow the httpd to connect the database (httpd_can_network_connect_db = on)
Allow the httpd to connect the network (httpd_can_network_connect = on)
Allow the httpd to work with cgi (httpd_enable_cgi = on)
Allow to read & write permission on the pem user home directory
SELinux policy is configured for PEM

$ sudo chmod 640 /root/.pem/agent1.crt
  1. HTTPDおよびPEMエージェントサービスがすべてのレプリカノードで実行されている場合、無効にして停止します。

systemctl stop pemagent
systemctl stop httpd
systemctl disable pemagent
systemctl disable httpd

注釈

この時点で、PEMプライマリサーバーと2つのスタンバイは、必要に応じてプライマリから引き継ぐ準備が整います。

すべてのホストでフェールオーバーを管理するようにEFMを設定する#

  1. EFMをサポートするようにプライマリノードを準備する

    • データベースサーバーに接続するデータベースユーザーefmを作成します。

    • WALログに関連する機能の実行特権とモニタリング特権をユーザーに付与します。

    • pg_hba.conf にエントリを追加して許可しますすべてのホストのすべてのノードからデータベースサーバーに接続するefmデータベースユーザー。

    • すべてのデータベースサーバーの構成をリロードします。例

$ cat > /tmp/efm-role.sql << _EOF_
-- Create a role for EFM
CREATE ROLE efm LOGIN PASSWORD password;

-- Give privilege to efm user to connect to a database
GRANT CONNECT ON DATABASE edb TO efm;

-- Give privilege to efm user to do backup operations
GRANT EXECUTE ON FUNCTION pg_current_wal_lsn() TO efm;
GRANT EXECUTE ON FUNCTION pg_last_wal_replay_lsn() TO efm;
GRANT EXECUTE ON FUNCTION pg_wal_replay_resume() TO efm;
GRANT EXECUTE ON FUNCTION pg_wal_replay_pause() TO efm;
GRANT EXECUTE ON FUNCTION pg_reload_conf() TO efm;

-- Grant monitoring privilege to the efm user
GRANT pg_monitor TO efm;
_EOF_

$ /usr/edb/as13/bin/psql -h 172.16.161.200 -p 5444 -U enterprisedb edb -f /tmp/efm-role.sql
CREATE ROLE
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT ROLE

$ rm -f /tmp/efm-role.sql

$ cat > /var/lib/edb/as13/data/pg_hba.conf <<< _EOF_
hostssl      edb     efm     172.16.161.200/32     scram-sha-256
hostssl      edb     efm     172.16.161.201/32     scram-sha-256
hostssl      edb     efm     172.16.161.202/32     scram-sha-256
hostssl      edb     efm     172.16.161.203/32     scram-sha-256
_EOF_

$ /usr/edb/as13/bin/psql -h 172.16.161.200 -p 5444 -U enterprisedb edb -c “SELECT pg_reload_conf();”
  1. 各ノードでスクリプトを作成して、PEMエージェントを起動/停止します。

$ sudo cat > /usr/local/bin/start-httpd-pemagent.sh << _EOF_
#!/bin/sh
/bin/sudo /bin/systemctl enable httpd
/bin/sudo /bin/systemctl start httpd
/bin/sudo /bin/systemctl enable pemagent
/bin/sudo /bin/systemctl start pemagent
_EOF_
$ sudo cat > /usr/local/bin/stop-httpd-pemagent.sh << _EOF_
#!/bin/sh

/bin/sudo /bin/systemctl stop pemagent
/bin/sudo /bin/systemctl disable pemagent
/bin/sudo /bin/systemctl stop httpd
/bin/sudo /bin/systemctl disable httpd
_EOF_
$ sudo chmod 770 /usr/local/bin/start-pemagent.sh
$ sudo chmod 770 /usr/local/bin/stop-pemagent.sh
  1. 各ノードでsudoers ファイル /etc/sudoers.d/efm-pem を作成して、efmユーザーがpemagentを起動/停止できるようにします。

$ sudo cat > /etc/sudoers.d/efm-pem << _EOF_
efm    ALL=(ALL)           NOPASSWD:   /bin/systemctl enable pemagent
efm    ALL=(ALL)           NOPASSWD:   /bin/systemctl disable pemagent
efm    ALL=(ALL)           NOPASSWD:   /bin/systemctl stop pemagent
efm    ALL=(ALL)           NOPASSWD:   /bin/systemctl start pemagent
efm    ALL=(ALL)           NOPASSWD:   /bin/systemctl status pemagent
_EOF_
  1. サンプルファイル/etc/edb/efm-4.1/efm.nodes.in を使用してすべてのノードでefm.nodes ファイルを作成し、efm OSユーザーに読み取り/書き込みアクセスを付与します。

$ sudo cp /etc/edb/efm-4.1/efm.nodes.in /etc/edb/efm-4.1/efm.nodes
$ sudo chown efm:efm /etc/edb/efm-4.1/efm.nodes
$ sudo chmod 600 /etc/edb/efm-4.1/efm.nodes
  1. スタンバイノードの/etc/edb/efm-4.1/efm.nodes ファイルに、プライマリノードのIPアドレスとefmポートを追加します。

$ sudo cat > /etc/edb/efm-4.1/efm.nodes <<< _EOF_
172.16.161.200:7800
_EOF_
  1. サンプルファイル/etc/edb/efm-4.1/efm.properties.in を使用して、すべてのノードでefm.properties ファイルを作成します。すべてのユーザーに読み取りアクセスを付与します。

$ sudo cp /etc/edb/efm-4.1/efm.properties.in /etc/edb/efm-4.1/efm.properties
$ sudo chown efm:efm /etc/edb/efm-4.1/efm.properties
$ sudo chmod a+r /etc/edb/efm-4.1/efm.properties
  1. efmユーティリティを使用してefmユーザーのパスワードを暗号化します。

$ export EFMPASS=password
$ /usr/edb/efm-4.1/bin/efm encrypt efm --from-env
096666746b05b081d1a98e43d94c9dad
  1. プロパティファイルの次のパラメーターを編集します。

db.user=efm
db.password.encrypted=096666746b05b081d1a98e43d94c9dad
db.port=5444
db.database=edb
db.service.owner=enterprisedb
db.service.name=edb-as-13
db.bin=/usr/edb/as13/bin
db.data.dir=/var/lib/edb/as13/data
jdbc.sslmode=require
user.email=username@example.com
from.email=node1@efm-pem
notification.level=INFO
notification.text.prefix=[PEM/EFM]
bind.address=172.16.161.200:7800
admin.port=7809
is.witness=false
local.period=10
local.timeout=60
local.timeout.final=10
remote.timeout=10
node.timeout=50
encrypt.agent.messages=true
stop.isolated.primary=true
stop.failed.primary=true
primary.shutdown.as.failure=false
update.physical.slots.period=0
ping.server.ip=8.8.8.8
ping.server.command=/bin/ping -q -c3 -w5
auto.allow.hosts=false
stable.nodes.file=false
db.reuse.connection.count=0
auto.failover=true
auto.reconfigure=true
promotable=true
use.replay.tiebreaker=true
standby.restart.delay=0
reconfigure.num.sync=false
reconfigure.sync.primary=false
minimum.standbys=0
recovery.check.period=1
restart.connection.timeout=60
auto.resume.period=0
virtual.ip=172.16.161.245
virtual.ip.interface=ens33
virtual.ip.prefix=24
virtual.ip.single=true
check.vip.before.promotion=true
pgpool.enable=false
sudo.command=sudo
sudo.user.command=sudo -u %u
syslog.host=localhost
syslog.port=514
syslog.protocol=UDP
syslog.facility=LOCAL1
file.log.enabled=true
syslog.enabled=false
jgroups.loglevel=INFO
efm.loglevel=INFO
jvm.options=-Xmx128m
script.remote.post.promotion=/usr/local/bin/stop-pemagent.sh
script.post.promotion=/usr/local/bin/start-pemagent.sh
  1. 監視ノードのis.witness 構成パラメーターの値をtrue に設定します。

is.witness=true
  1. プライマリノードでEFMサービスを有効にして開始します。

$ systemctl enable edb-efm-4.1
$ systemctl start edb-efm-4.1
  1. スタンバイがプライマリノードで起動されたクラスターに参加できるようにします。

/usr/edb/efm-4.1/bin/efm allow-node  efm  172.16.161.201
/usr/edb/efm-4.1/bin/efm allow-node  efm  172.16.161.202
/usr/edb/efm-4.1/bin/efm allow-node  efm  172.16.161.203
  1. スタンバイノードとEFM監視ノードでEFMサービスを有効にして開始します。

$ systemctl enable edb-efm-4.1
$ systemctl start edb-efm-4.1
  1. 任意のノードからEFMクラスターのステータスを確認します。

$ sudo /usr/edb/efm-4.1/bin/efm cluster-status efm
Cluster Status: efm
    Agent Type  Address              DB       VIP
    ----------------------------------------------------------------
    Primary     172.16.161.200      UP       172.16.161.245*
    Standby     172.16.161.201      UP       172.16.161.245
    Standby     172.16.161.202      UP       172.16.161.245
    Witness     172.16.161.203      N/A      172.16.161.245

Allowed node host list:
    172.16.161.200 172.16.161.201 172.16.161.202 172.16.161.203

Membership coordinator: 172.16.161.200

Standby priority host list:
    172.16.161.201 172.16.161.202

Promote Status:

    DB Type     Address              WAL Received LSN   WAL Replayed LSN   Info
    ---------------------------------------------------------------------------
    Primary     172.16.161.200                         0/F7A3808
    Standby     172.16.161.201      0/F7A3808          0/F7A3808
    Standby     172.16.161.202      0/F7A3808          0/F7A3808

    Standby database(s) in sync with primary. It is safe to promote.

このステータスは、EFMが正常にセットアップされ、PEMサーバーのフェールオーバーを管理していることを確認します。

フェールオーバーが発生した場合、スタンバイのいずれかがプライマリノードとして昇格し、PEMエージェントが新しいプライマリノードに接続します。この手順を使用して、障害が発生したプライマリノードを新しいスタンバイに置き換えることができます。

現在の制限#

現在の制限には次のものが含まれます。

  • ユーザーのWebコンソールセッションは、スイッチオーバー中に失われます。

  • [設定]ダイアログボックスから設定したユーザーごとの設定は、ファイルシステム上のローカル構成ファイルに保存されているため、失われます。

  • バックグラウンドプロセス、バックアップ、リストア、およびメンテナンスダイアログボックスによって開始され、そのログはシステム間で共有されません。これらは、スイッチオーバー中に失われます。