タイガーラック クリエイティブブログ
2025
August
28

pg_auto_failoverのインストールとセットアップ

今回はPostgreSQL のレプリケーション機能を利用し、自動フェイルオーバーが可能な高可用性構成を比較的簡単に組むことができるpg_auto_failoverというツールのセットアップ方法について説明します。

環境

  • さくらのVPS
  • サーバー2台
  • Ubuntu 24.04.1 LTS
  • PostgreSQL 16

構成

役割サーバーIPポート
モニターサーバーA192.168.1.15432
ノード1サーバーA192.168.1.15433
ノード2サーバーB192.168.1.25434


pg_auto_failoverの構成は、接続中のPostgreSQLの状態監視を行うモニターノードが1台と、レプリケーションを行う通常ノードが2台以上の計3台以上のPostgreSQLが必要になります。
今回はサーバーAにモニター専用ノードと通常ノードを共存させることで2台のサーバーでpg_auto_failoverを構築していきます。
モニターノードはpg_auto_failoverの心臓部であり停止した段階で機能が停止してしまうので、本来であればモニターノードと通常ノードを置くVPSは分けたほうが良いでしょう。

pg_auto_failoverのインストール

apt update
apt install -y curl gnupg lsb-release
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
apt-get install pg-auto-failover-cli
apt-get install postgresql-16-auto-failover

サーバーAとサーバーBの両方にpg_auto_failoverをインストールします。

モニターノードのセットアップ

モニターノードの作成

su - postgres
pg_autoctl create monitor --auth trust --pgdata /var/lib/postgresql/auto_failover/monitor \
--hostname 192.168.1.1 --pgport 5432 --ssl-self-signed

ユーザーをpostgresに切り替え、pg_autoctl create monitorコマンドによりモニターノードを作成します。
各オプションの機能は

オプション名機能
–auth認証方式の指定
–pgdataノードのディレクトリの指定
–hostnameモニターノードのIPもしくはホスト名
–pgportモニターノードが使用するポート
–ssl-self-signed自己署名証明書を作成する


となっています。
pg_autoctl create monitorコマンドは正確に言うとモニターノードが使用するDBクラスタを作成するコマンドになります。そのため–pgdataもPostgreSQLがモニターノードのDBクラスタを作成するディレクトリを指定するコマンドとなっています。–ssl-self-signedオプションをつけると自己証明証明書が自動で作成され、–pgdataで指定したディレクトリ内に保存されます。

pg_hba.confの編集

vi /var/lib/postgresql/auto_failover/monitor/pg_hba.conf

モニターノード作成後、作成したディレクトリ内のpg_hba.confを開きます。

host all all 192.168.1.1/32 trust
host all all 192.168.1.2/32 trust

サーバーAとサーバーBの接続を許可します。
モニターノードの作成時の認証方式はpg_autoctl create monitor時の–authに合わせて設定します。

systemdへの登録

exit
vi /etc/systemd/system/pg_autoctl-monitor.service

ユーザーをsudoerに切り替え、ノードをsystemctl startコマンドから起動できるようにユニットファイルを作成します。

[Unit]
Description=pg_auto_failover monitor node
After=network.target

[Service]
Type=simple
User=postgres
Group=postgres
ExecStart=/usr/bin/pg_autoctl run --pgdata /var/lib/postgresql/auto_failover/monitor --pgport 5432
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

Userにpostgres、ExecStartにpg_autoctl runコマンドを指定します。–pgdataにはモニターノードのディレクトリを指定、–pgportにはモニターノードのポートを指定します。

systemctl daemon-reload
systemctl start pg_autoctl-monitor.service

ユニットファイルの更新をsystemdに反映させた後にsystemctl startコマンドで先ほど作成したサービスを開始し、モニターノードを起動します。

状態確認

su - postgres
pg_autoctl show uri --pgdata /var/lib/postgresql/auto_failover/monitor
        Type |    Name | Connection String
-------------+---------+-------------------------------
     monitor | monitor | postgres://autoctl_node@192.168.1.1:5432/pg_auto_failover?sslmode=require
   formation | default | 

postgresユーザーに切り替え、モニターノードが起動している状態でpg_autoctl show uriコマンドを使用するとモニターノードのConnection Stringの項にURIが表示されます。URIは以降のノードの作成に必要になります。

ノード1のセットアップ

ノードの作成

pg_autoctl create postgres --auth trust --pgdata /var/lib/postgresql/failover/node_one \
--hostname 192.168.1.1 --pgport 5433 --ssl-self-signed \
--monitor postgres://autoctl_node@192.168.1.1:5432/pg_auto_failover?sslmode=require

pg_autoctl create postgresコマンドでノードを作成します。
各オプションの機能は

オプション名機能
–auth認証方式の指定
–pgdataノードのディレクトリの指定
–hostnameノードのIPもしくはホスト名
–pgportノードが使用するポート
–ssl-self-signed自己署名証明書を作成する
–monitorモニターノードのURI


となっています。
pg_auto_failoverで制御するノードはpg_autoctl create postgresコマンドから作成する必要があり、PostgreSQLから作成したDBクラスタは制御できません。既存のDBクラスタを制御したい場合はpg_autoctl create postgresで新しいDBクラスタを作成し、その中にデータを移し替える必要があります。
基本はpg_autoctl create monitorと同じ様なコマンドですが、–monitorオプションでモニターノードのURIを指定する必要があります。モニターノードのURIはpg_autoctl show uriコマンドで確認できます。

systemdへの登録

exit
vi /etc/systemd/system/pg_autoctl-node_one.service

モニターノードと同じくsystemctl startコマンドから起動できるようにユニットファイルを作成します。

[Unit]
Description=pg_auto_failover node_one
After=network.target

[Service]
Type=simple
User=postgres
Group=postgres
ExecStart=/usr/bin/pg_autoctl run --pgdata /var/lib/postgresql/auto_failover/node_one --pgport 5433
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

モニターノードのユニットファイルからExcecStart内の–pgdata–pgportをノード1用に変更したものを作成します。

systemctl daemon-reload
systemctl start pg_autoctl-node_one.service

ユニットファイルの更新後にノードを起動します。

ノード2のセットアップ

ノードの作成

su - postgres
pg_autoctl create postgres --auth trust --pgdata /var/lib/postgresql/auto_failover/node_two \
--hostname 192.168.1.2 --pgport 5434 --ssl-self-signed \
--monitor postgres://autoctl_node@192.168.1.1:5432/pg_auto_failover?sslmode=require

ノード1と同様にpg_autoctl create postgresコマンドでノードを作成します。

systemdへの登録

exit
vi /etc/systemd/system/pg_autoctl-node_two.service

ノード1と同じくsystemctl startコマンドから起動できるようにユニットファイルを作成します。

[Unit]
Description=pg_auto_failover node_two
After=network.target

[Service]
Type=simple
User=postgres
Group=postgres
ExecStart=/usr/bin/pg_autoctl run --pgdata /var/lib/postgresql/auto_failover/node_two --pgport 5434
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

ExcecStart内の–pgdata–pgportをノード2用にしたものを作成します。

systemctl daemon-reload
systemctl start pg_autoctl-node_two.service

ユニットファイルの更新後にノードを起動します。

動作確認

pg_autoctl show state pg_autoctl show state --monitor postgres://autoctl_node@192.136.1.1:5432/pg_auto_failover?sslmode=require
  Name |  Node |        Host:Port |       TLI: LSN |   Connection |      Reported State |      Assigned State
-------+-------+------------------+----------------+--------------+---------------------+--------------------
node_1 |     1 | 192.168.1.1:5433 |   1: 0/7450058 |   read-write |             primary |             primary
node_2 |     2 | 192.168.1.2:5434 |   1: 0/7450058 |    read-only |           secondary |           secondary

pg_autoctl show stateコマンドを使用すると接続中のノードを表示できます。–monitorオプションにはモニターノードのURIを指定します。

pg_ctl stop -D /var/lib/postgresql/auto_failover/node_one
pg_autoctl show state --monitor postgres://autoctl_node@192.136.1.1:5432/pg_auto_failover?sslmode=require
  Name |  Node |        Host:Port |       TLI: LSN |   Connection |      Reported State |      Assigned State
-------+-------+------------------+----------------+--------------+---------------------+--------------------
node_1 |     1 | 192.168.1.1:5433 |   1: 0/7450400 |         none |             demoted |          catchingup
node_2 |     2 | 192.168.1.2:5434 |   4: 0/9000000 |   read-write |        wait_primary |        wait_primary

ノード1を停止させた状態でpg_autoctl show stateコマンドを行うと、モニターノードからノード1の停止が検出されます。

pg_autoctl show state --monitor postgres://autoctl_node@192.136.1.1:5432/pg_auto_failover?sslmode=require
  Name |  Node |        Host:Port |       TLI: LSN |   Connection |      Reported State |      Assigned State
-------+-------+------------------+----------------+--------------+---------------------+--------------------
node_1 |     1 | 192.168.1.1:5433 |   4: 0/9000148 |    read-only |           secondary |           secondary
node_2 |     2 | 192.168.1.2:5434 |   4: 0/9000148 |   read-write |             primary |             primary

一定時間後にレプリケーションの処理が行われ、ノード2がプライマリとなりノード1が再起動された後にセカンダリとして動作し始めます。
また、pg_autoctl perform switchoverコマンドを使用することでもプライマリを切り替えることが出来ます。

ノードの作成に失敗する場合

pg_autoctl create postgresコマンドの使用時、何度設定を見直してもノードの作成に失敗する場合、/var/lib/postgresql/.config/内にpg_autoctl.cfgが失敗した際の設定の状態で残っており、その設定を読み込むのが原因で失敗している可能性があります。pg_autoctl.cfgが存在している場合は削除してから再度ノード作成のコマンドを入力してみてください。
pg_autoctl.confを削除しても失敗する場合はpg_autoctl drop monitorpg_autoctl drop nodeコマンドを使用してモニターノードの作成からやり直してみてください。
また、pg_autoctl関連のコマンドは–helpオプションを付けることで各コマンドごとに付けられるオプションの説明が出るので、そちらも確認しながらオプションの調整もしてみてください。



今回は日本語での情報が少ないpg_auto_failoverのセットアップ方法について紹介してみました。
pg_auto_failoverはセットアップが済んだ段階で最低限動作させることが出来るため、他のツールを使った高可用性構成よりも組みやすいツールだと思います。ただ、モニターノードが停止した場合に機能が停止してしまう点と、モニターノードは1構成に1台しか用意できないこともあり、大規模構成に向いたツールではないと思います。
レプリケーションの挙動を確認してみたい場合や、小規模の構成を組んでみたい場合にpg_auto_failoverを使ってみてはいかがでしょうか。

このカテゴリの最新記事

関連記事

SHOP LIST

タイガーラック株式会社

〒577-0056
大阪府東大阪市長堂1-3-14 TOKUYASU Bld.