直面在数字需求不断变化的环境中维护弹性PostgreSQL数据库的挑战?如果术语“Patroni”与您的技术愿景相契合,那么您即将解锁将PostgreSQL提升为高可用性堡垒的解决方案。
当然,挑战在等待着,但不要害怕 – 您正在开始一段变革性的旅程,构建一个坚如磐石的PostgreSQL集群。设想一个未来,在那里数据库中断只是小插曲,而您的PostgreSQL设置将成为可靠性的典范。
准备好将您的PostgreSQL环境加固成一个不可动摇的堡垒!
先决条件
在为PostgreSQL实现高可用性之前,请确保已具备以下条件:
- 五个(或更多)Linux服务器 – 本教程使用Debian 12服务器,每个服务器都有一个具有sudo/administrator权限的非root用户,如下所示:
Hostname | IP Address | Used as |
---|---|---|
postgres01 | 192.168.5.20 | PostgreSQL Server |
postgres02 | 192.168.5.21 | PostgreSQL Server |
postgres03 | 192.168.5.22 | PostgreSQL Server |
etcd | 192.168.5.15 | Cluster Data Store |
haproxy | 192.168.5.16 | Load Balancer |
- A client machine (Linux, Windows, or MacOS) with a PostgreSQL client installed.
安装PostgreSQL服务器和Patroni
满足所有先决条件后,将这一刻视为打下稳固、可靠的数据库环境基础的时刻。目标是通过PostgreSQL 15创建一个高可用性的PostgreSQL部署。但首先,您必须在所有PostgreSQL服务器上安装所需的软件包(PostgreSQL服务器和Patroni)。
Patroniは、データセンターで高可用性のPostgreSQL展開を作成するためのPythonベースのアプリケーションです。Bare-metalからKubernetesまで対応しています。Patroniは公式のPostgreSQLリポジトリで利用可能であり、PostgreSQLサーバー9.5-16をサポートしています。
PostgreSQLサーバーとPatroniをインストールするには、以下の手順を実行してください。
? 注意: 以下の操作をPostgreSQLサーバーで実行してください。この場合、
postgres01
、postgres02
、およびpostgres03
を使用します。
1. ターミナルを開いて、以下のcurl
コマンドを実行します。このコマンドは出力を生成しませんが、PostgreSQLリポジトリのGPGキーを/usr/share/keyrings/pgdg.gpg
に追加します。
? このチュートリアルでは、デモンストレーションの互換性を確保するためにrootアカウントを使用してコマンドを実行しています。ただし、sudo特権を持つ非rootアカウントを使用することを強くお勧めします。非rootアカウントを使用する場合は、セキュリティとベストプラクティスのためにコマンドの先頭に
sudo
を付ける必要があります。
2. 次に、以下のコマンドを実行します。このコマンドは出力を提供しませんが、/etc/apt/sources.list.d/pgdg.list
ファイルにPostgreSQLリポジトリをパッケージソースのリストに追加します。
3. 以下のapt update
コマンドを実行して、パッケージインデックスを更新し、新しいパッケージ情報を取得します。

4. アップデート後、次のコマンドを実行して、以下のパッケージをインストールします:
postgresql-15
– PostgreSQLデータベース管理システムのバージョン15。patroni
– Pythonとetcdを使用したPostgreSQLの高可用性のオープンソースソリューション。Pythonとetcdを使用したPostgreSQL HAクラスターのテンプレート。python3-etcd
– etcdとのやり取りを行うためのPythonクライアントライブラリ。このライブラリを使用すると、Pythonアプリケーションがetcdクラスターと通信して管理できます。python3-psycopg2
– Python 3用のPostgreSQLアダプター。PythonアプリケーションとPostgreSQLデータベースを接続します。
プロンプトが表示されたら、インストールを続行するにはYを入力してください。

5. パッケージがインストールされたら、次に各コマンドを実行します。これらのコマンドはターミナルに出力されませんが、以下の操作を実行します:
postgresql
とpatroni
サービスを停止します。Debian/Ubuntuでは、postgresql
とpatroni
サービスはインストール後に自動的に起動します。- PostgreSQLバイナリファイルのシンボリックリンクを
/usr/sbin
ディレクトリに作成します。これにより、patroni
はPostgreSQLバイナリファイルを実行してPostgreSQLの作成と管理を行うことができます。
6. 最後に、以下のコマンドを実行してpatroni
とpsql
のバイナリパス、およびpatroni
のインストールされた--version
を確認してください。
以下は、patroni
のパス(/usr/bin/patroni)とpsql
のパス(/usr/sbin/psql)のバイナリファイルです。インストールされたPatroniのバージョンは3.2.1です。

etcdサーバーのセットアップと設定
PostgreSQL ServerとPatroniがインストールされているので、PostgreSQLサーバー間の調整を強化するバックボーンが必要です。キーと値のデータストアであるetcdをセットアップして設定します。
このキーと値のデータストアは、PostgreSQLクラスターの展開に関連するデータを安全に保存し、効率的に管理するためのサイレントアーキテクトです。
? 注意:etcdを別のサーバーにインストールしてください。この例では、etcdはetcdサーバーにインストールされています。
etcdをインストールして設定するには、以下の手順に従ってください:
1. etcdサーバーで、以下のコマンドを実行してリポジトリインデックスをupdate
し、最新のパッケージ情報を取得します。

2. 次に、サーバーにetcd
をinstall
するために、以下のコマンドを実行してください。

3. etcdをインストールしたら、お好みのエディターを使用してデフォルトの設定/etc/default/etcdを開き、次の設定を挿入してください。
この設定は単一のetcdクラスターをセットアップしますので、IPアドレス192.168.5.15
を内部IPアドレスに変更してください。
ETCD_LISTEN_PEER_URLS="<http://192.168.5.15:2380>"
ETCD_LISTEN_CLIENT_URLS="<http://localhost:2379>,<http://192.168.5.15:2379>"
ETCD_INITIAL_ADVERTISE_PEER_URLS="<http://192.168.5.15:2380>"
ETCD_INITIAL_CLUSTER="default=http://192.168.5.15:2380,"
ETCD_ADVERTISE_CLIENT_URLS="<http://192.168.5.15:2379>"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
変更を保存してエディターを終了してください。

4. 今度は、以下のsystemctl
コマンドを実行してetcd
を再起動し、変更を適用してください。
このコマンドには出力がありませんが、次の手順で変更を確認します。
5. etcd
が再起動したら、etcd
サービスが実行および有効になっていることを確認してください。
etcd
サービスが実行されている場合、出力active (running)
が表示されます。有効になっている場合、出力enabled
が表示され、これはetcd
が起動時に自動的に開始されることを意味します。

6. 最後に、以下のetcdctl
コマンドを実行して、etcdクラスター上で利用可能なサーバーのlist
を確認してください。
この場合、etcdはローカルIPアドレスhttp://192.168.5.15:2379/で単一ノードクラスターとして実行されています。

Patroniを介したPostgreSQLクラスターのブートストラップ
etcdサーバーがしっかりと設定された今、次の重要なフェーズの扉に立っています。Patroniを使用してブートストラッププロセスを開始することで、PostgreSQLの構成を強固で障害耐性のあるクラスタに昇格させます。
? 既存のPostgreSQLサーバーにPostgreSQLクラスタを展開する場合は、まずデータベースをバックアップすることを確認してください。
Patroniを使用してPostgreSQLクラスタをブートストラップするには、各PostgreSQLサーバーで以下の手順を実行してください:
1. テキストエディタでPatroniのデフォルト設定(/etc/patroni/config.yml)を開き、以下の設定を追加します。
name
オプションの値をPostgreSQLサーバーのホスト名に置き換えてください(例:postgres01
)。ただし、まだエディタを閉じないでください。
この設定は、postgres
という名前のPostgreSQLクラスタを設定します。
2. 次に、以下の設定を追加してPatroni REST APIを192.168.5.20:8008
で実行するように設定します。
クラスタ内の各PostgreSQLサーバーがAPI経由で接続できるようにする必要があります。したがって、IPアドレス192.168.5.20
を各PostgreSQLサーバーの該当するIPアドレスに変更してください。
3. 次の設定を追加して、etcd
との統合を有効にします。この場合、etcd
サーバーはIPアドレス192.168.5.15
で実行されています。
4. これで、initdb
経由でPostgreSQLサーバーをbootstrap
するための設定を追加します。
この設定は、クライアント認証のデフォルトルールと設定(pg_hba.conf
)およびパスワードadmin
を持つ新しいユーザーadmin
をセットアップします。
必ず、pg_hba
セクションにPostgreSQLクラスターのIPアドレスを入力し、users
セクションでデフォルトのadmin
パスワードを変更してください。
5. PostgreSQLの起動方法を構成した後、次の構成を挿入して各サーバーでPostgreSQLが実行される方法を設定します。
「postgres01」サーバーに関して、PostgreSQLはIPアドレス192.168.5.20
でデータディレクトリ/var/lib/patroni
上で実行されます。
さらに、この構成ではレプリケーション操作用に新しいユーザー「replicator」が作成され、パスワード(secretpassword
)でスーパーユーザー/管理者としてpostgres
ユーザーが作成されます。
IPアドレスとデフォルトのパスワード(secretpassword
)を変更してください。
6. この設定を挿入して、PostgreSQL サーバのクラスタ内での動作を決定するためのタグを設定し、変更を保存してファイルを閉じます。
7. 保存された設定を使用して、以下のコマンドを実行して、Patroniのデータディレクトリの準備をまとめて行い、PostgreSQLの使用に適切に所有権が設定され、セキュリティが確保されるようにします。
これらのコマンドは出力を提供しませんが、高可用性を持つPatroniを使用したPostgreSQLデータベースクラスターのセットアップには、このステップが重要です。
8. 次に、以下のsystemctl
コマンドを実行して、patroni
サービスを起動して確認します。
postgres01サーバーでは、PostgreSQLサーバーが実行され、クラスターが初期化されます。また、postgres01サーバーがクラスターリーダーとして選択されます。

postgres02サーバーでは、Patroniを介してPostgreSQLサーバーが起動し、REST APIを介してPostgreSQLクラスターに参加します。
すべてがうまくいけば、以下のメッセージが表示されます:

postgres03サーバーでは、出力はpostgres02サーバーと似ています。

9. PostgreSQLクラスターが初期化されたら、次のpatronictl
コマンドを実行して、Patroniで管理されているPostgreSQLインスタンスのlist
を表示します。
次の出力で、PostgreSQLクラスター(postgres)が実行されていることが確認できます。
クラスターはpostgres01がクラスターLeader、postgres02、およびpostgres03がReplicaでモード/状態がstreamingで実行されていることに注意してください。

10. 最後に、システムの起動時にpostgresql
サービスの自動起動を無効にするために、次のsystemctl
コマンドを実行します。
このコマンドは成功した場合には出力がありませんが、これはPatroniが新しいPostgreSQLサーバーを制御するために重要です。
HAProxyをロードバランサーとしてインストールおよび構成する
PostgreSQLクラスターを展開した場合、クライアントからアクセス可能にし、問題が発生したときにフェイルオーバーを有効にする方法は何ですか?その解決策は、PostgreSQLクラスターの前にロードバランサーとしてのHAProxyです。
HAProxyは、PostgreSQLクラスターがさまざまなワークロードを処理し、リクエストを知的に分散し、高可用性を維持するのに役立つ要となります。
? 注意:HAProxyは別のサーバーにインストールしてください。この場合、HAProxyサーバーはIPアドレスが192.168.5.16のhaproxyサーバーにインストールされています。
PostgreSQLクラスターのためにHAProxyをロードバランサーとしてインストールおよび構成する手順は次のとおりです:
1. お好みのテキストエディタを使用して、/etc/hostsファイルを開き、PostgreSQLサーバーのIPアドレスとホスト名を挿入し、変更内容を保存してファイルを閉じます。
192.168.5.20 postgres01
192.168.5.21 postgres02
192.168.5.22 postgres03
2. 次に、以下のコマンドを実行してパッケージインデックスを更新します。

3. 更新が完了したら、以下のコマンドを実行してシステムにhaproxy
パッケージをinstall
します。

4. 今度は、デフォルトのHARPOXY設定を/etc/haproxy/haproxy.cfg.orig
にバックアップするために、次のコマンドを実行します。
このコマンドは出力を生成しませんが、変更を加える前の予防措置です。
5. 次に、お好みのエディタを使用して新しいファイル/etc/haproxy/haproxy.cfgを作成し、以下の設定を挿入します。各PostgreSQLサーバーのIPアドレスを自分のものに置き換え、ファイルを保存してエディタを閉じます。
このHAProxy設定は、2つのプロキシを使用してPostgreSQLクラスターのロードバランサーとしてHAProxyをセットアップします。
stats
– このブロックはポート8080
で実行され、HAProxyサーバーのパフォーマンスとバックエンドを監視します。postgres
– このブロックは、PostgreSQLクラスターのロードバランサーの設定です。
# グローバル設定の設定値
global
# グローバルな最大接続数
maxconn 100
# ログ設定
log 127.0.0.1 local2
# デフォルト設定
defaults
# グローバルログ設定
log global
# モードをTCPに設定
mode tcp
# リトライ回数
retries 2
# クライアントのタイムアウト
timeout client 30m
# 接続のタイムアウト
timeout connect 4s
# サーバーのタイムアウト
timeout server 30m
# チェックのタイムアウト
timeout check 5s
# 統計情報の設定
listen stats
# モードをHTTPに設定
mode http
# ポート8080でバインド
bind *:8080
# 統計情報を有効にする
stats enable
# 統計情報のURI
stats uri /
# PostgreSQLの設定
listen postgres
# ポート5432でバインド
bind *:5432
# HTTPチェックを有効にする
option httpchk
# ステータス200を期待する
http-check expect status 200
# サーバーの設定
default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
# PostgreSQLサーバーを定義する
server postgres01 192.168.5.20:5432 maxconn 100 check port 8008
server postgres02 192.168.5.21:5432 maxconn 100 check port 8008
server postgres03 192.168.5.22:5432 maxconn 100 check port 8008
6. HAProxyが設定されたら、以下のsystemctl
コマンドを実行してhaproxy
サービスを再起動
し、status
で確認します。

7. 最後に、お好きなウェブブラウザを開き、HAProxyのIPアドレスにポート8080でアクセスします(例:http://192.168.5.16:8080/)。以下の出力では、次のものが表示されます。
以下の出力では、次のものが表示されます。
- statsプロキシはHAProxyの状態を監視するためのものです。
- postgresプロキシはPostgreSQLクラスタのロードバランサーです。
postgres02とpostgres03サーバーは、両方ともstreamingモードで実行されているため、ダウンとマークされていることに注意してください。

テスト中のPostgreSQLクラスターのフェイルオーバー
信頼できる負荷分散装置としてHAProxyを設定し、これでPostgreSQLクラスターをテストする時が来ました。この重要なステップでは、高可用性のセットアップの耐久性が明らかになります。潜在的な障害に直面しても、PostgreSQLクラスターが強固で応答力があることを確認する必要があります。
PostgreSQLクラスターのフェイルオーバーをテストするために、クライアントマシンからクラスターに接続し、次の手順でフェイルオーバー操作を検証します:
1. クライアントマシンにログインし、ターミナルを開いて以下のpsql
コマンドを実行してHAProxy負荷分散装置を介してPostgreSQLに接続します。
プロンプトが表示されたら、PostgreSQLパスワードを入力します。必要なパスワード情報は/etc/patroni/config.ymlファイルにあります。

2. 接続したら、次のクエリを実行してどのPostgreSQLサーバーに接続しているかを確認し、現在のPostgreSQLセッションをquit
します。
PostgreSQLのインストールが成功していれば、postgres01サーバーに接続されます。

3. これで、postgres01サーバーに切り替え、次のコマンドを実行してpatroni
サービスを停止し、PostgreSQLクラスターのステータスをlist
します。
このステップでは、PostgreSQLのフェイルオーバーをテストできます。
postgres01サーバーの状態がstoppedに変わり、新しいクラスターリーダーがpostgres03サーバーに委任されたことが確認できます。

4. HAProxyの監視統計に戻り、postgres01サーバーがダウンしていることがわかります。一方、postgres03は今はUP状態です。

代替として、次のpatronictl
コマンドを実行して、PostgreSQLクラスターの状態を確認できます。
以下のように、postgres01サーバーはもはやクラスターにありません。

5. クライアントマシンに戻り、以下のpsql
コマンドを実行して、HAProxy経由でPostgreSQLサーバーに接続します。

6. 接続したら、現在接続しているPostgreSQLサーバーを確認するために次のクエリを実行してください。
フェイルオーバーが成功した場合、この場合はpostgres03のように、実行中のサーバーの1つに接続されます。

結論
この旅に乗り出し、高可用性を確保する複雑さに身を投じながら、強力なPatroniとHAProxyの組み合わせを駆使しました。PostgreSQLとPatroniのセットアップ段階をシームレスに進めながら、etcdサーバーの構成の微妙なニュアンスを巧みに扱いました。
オーケストレーションのスキルが最前線に出て、Patroniで耐障害性のあるPostgreSQLクラスターを構築し、HAProxyを使用した負荷分散の技術を洗練させました。このハイステークスの冒険の集大成は、PostgreSQLクラスターのフェイルオーバー機能の徹底的なテストでした。
堅牢で耐障害性のあるPostgreSQL環境の構築における成果を振り返りながら、専門知識を拡大することを検討してみてください。より動的な環境を実現するために、Patroni with Kubernetesの導入を探求してみるのはいかがでしょうか?また、複数のデータセンターにわたるPostgreSQLの高可用性の設定の詳細に深入りしてみるのも良いかもしれません。