vitabaks.postgresql_cluster
PostgreSQL 高可用クラスタ :elephant: :sparkling_heart:
生産準備完了の PostgreSQL 高可用クラスタ(Patroni に基づく)。Ansible で自動化。
postgresql_cluster
は、生産環境での高可用 PostgreSQL クラスタの展開と管理を自動化します。このソリューションは、専用の物理サーバー、仮想マシン、およびオンプレミスとクラウドベースのインフラ内での使用に最適です。
このドキュメントのバージョンは、postgresql-cluster.org で検索可能で、より簡単にナビゲートできます。
:trophy: スポンサーシップ プログラムを使用して、パーソナライズされたサポートを受けるか、このプロジェクトに貢献してください。
Postgres クラスタのサポートされるセットアップ
デプロイメントには3つのスキームがあります:
1. PostgreSQL 高可用性のみ
これはロードバランシングのないシンプルなスキームです。
高可用性の構成要素:
Patroni は、Pythonを使用してカスタマイズされた高可用性ソリューションを作成するためのテンプレートで、最大のアクセシビリティを提供するために、ZooKeeper、etcd、Consul、Kubernetes などの分散構成ストアを使用します。PostgreSQLインスタンスの管理や自動フェイルオーバーに利用されます。
etcd は、分散システムの最も重要なデータのための分散型の信頼性の高いキーバリューストアです。etcd は Go で書かれており、Raft コンセンサスアルゴリズムを使用して高可用性のレプリケートログを管理します。Patroni によって、クラスタの状態や PostgreSQL の構成パラメータに関する情報を保存するのに使用されます。分散コンセンサスとは?
vip-manager (オプション、
cluster_vip
変数が指定されている場合)は、すべてのクラスタノードで開始され、DCS に接続するサービスです。ローカルノードがリーダーキーを所有している場合、vip-manager は構成された VIP を起動します。フェイルオーバーが発生した場合、vip-manager は古いリーダーの VIP を削除し、新しいリーダーでそれを起動します。データベースアクセスのための単一のエントリーポイント(VIP)を提供するために使用されます。PgBouncer (オプション、
pgbouncer_install
変数がtrue
の場合)は、PostgreSQLのための接続プールライブラリです。
2. PostgreSQL 高可用性とロードバランシング
このスキームでは、読み取り操作のための負荷分散を可能にし、読み取り専用レプリカでクラスタを拡張できます。
AWS、GCP、Azure、DigitalOcean、Hetzner Cloudなどのクラウドプロバイダにデプロイする際には、デフォルトでクラウドロードバランサーが自動的に作成され、データベースへの単一のエントリーポイントを提供します(cloud_load_balancer
変数によって制御されます)。
ノンクラウド環境、つまり自分のマシンへのデプロイの場合、HAProxy 負荷分散器を使用できます。有効にするには、vars/main.ymlファイルの with_haproxy_load_balancing: true
を設定します。
:heavy_exclamation_mark: 注意: アプリケーションは、カスタムポート5001への読み取りリクエストの送信と、ポート5000への書き込みリクエストの送信をサポートする必要があります。
- ポート 5000(読み取り/書き込み)マスター
- ポート 5001(読み取り専用)すべてのレプリカ
変数 "synchronous_mode" が 'true' の場合 (vars/main.yml):
- ポート 5002(読み取り専用)同期レプリカのみ
- ポート 5003(読み取り専用)非同期レプリカのみ
HAProxy 負荷分散の構成要素:
HAProxy は、高可用性、負荷分散、および TCP および HTTP ベースのアプリケーションのプロキシを提供する、無料で非常に高速かつ信頼性の高いソリューションです。
confd は、etcd または consul からのテンプレートとデータを使用して、ローカルアプリケーション構成ファイルを管理します。HAProxy の構成ファイル管理を自動化するために使用されます。
Keepalived (オプション、
cluster_vip
変数が指定されている場合)は、データベースアクセスのための仮想高可用 IP アドレス(VIP)と単一のエントリーポイントを提供します。Linux 用の VRRP(Virtual Router Redundancy Protocol)を実装します。私たちの構成では、keepalived は HAProxy サービスの状態を確認し、障害が発生した場合には VIP をクラスタ内の別のサーバーに委譲します。
3. PostgreSQL 高可用性と Consul サービスディスカバリ
このスキームを使用するには、vars/main.yml で dcs_type: consul
を指定してください。
このスキームは、マスターのみのアクセスや、レプリカを横断する読み取りの負荷分散(DNSを使用)に適しています。Consul サービスディスカバリ を利用し、DNS解決 をデータベースへのクライアントアクセスポイントとして使用します。
クライアントアクセスポイント(例):
master.postgres-cluster.service.consul
replica.postgres-cluster.service.consul
さらに、異なるデータセンターに分散したクラスタでも便利です。データベースサーバーがどのデータセンターにあるかを事前に指定し、同じデータセンターで動作するアプリケーションでそれを使用できます。
例: replica.postgres-cluster.service.dc1.consul
, replica.postgres-cluster.service.dc2.consul
これは、サービス DNS 解決のために各アプリケーションサーバーにクライアントモードで consul をインストールする必要があります(またはローカルの consul クライアントをインストールする代わりに、リモート consul サーバーへの フォワード DNS を使用します)。
互換性
RedHat および Debian ベースのディストリビューション (x86_64)
サポートされている Linux ディストリビューション:
- Debian: 11, 12
- Ubuntu: 22.04, 24.04
- CentOS Stream: 9
- Oracle Linux: 8, 9
- Rocky Linux: 8, 9
- AlmaLinux: 8, 9
PostgreSQL バージョン:
すべてのサポートされている PostgreSQL バージョン
:white_check_mark: テスト済み、正常に動作する: PostgreSQL 10, 11, 12, 13, 14, 15, 16
クラスタ展開のデイリー自動テスト結果の表:
ディストリビューション | テスト結果 |
---|---|
Debian 11 | |
Debian 12 | |
Ubuntu 22.04 | |
Ubuntu 24.04 | |
CentOS Stream 9 | |
Oracle Linux 8 | |
Oracle Linux 9 | |
Rocky Linux 8 | |
Rocky Linux 9 | |
AlmaLinux 8 | |
AlmaLinux 9 |
Ansible バージョン
最小サポート Ansible バージョン: 8.0.0 (ansible-core 2.15.0)
要件
クリックして展開...
このプレイブックには、root 権限または sudo が必要です。
Ansible (Ansible とは?)
dcs_type: "consul" の場合は、制御ノードに consul ロールの要件をインストールしてください:
ansible-galaxy install -r roles/consul/requirements.yml
ポート要件
データベースクラスタに開いておく必要がある TCP ポートのリスト:
5432
(postgresql)6432
(pgbouncer)8008
(patroni REST API)2379
,2380
(etcd)
"[タイプ A] PostgreSQL 高可用性とロードバランシング" のスキームの場合:
5000
(haproxy - (読み取り/書き込み) マスター)5001
(haproxy - (読み取り専用) すべてのレプリカ)5002
(haproxy - (読み取り専用) 同期レプリカのみ)5003
(haproxy - (読み取り専用) 非同期レプリカのみ)7000
(オプション、haproxy ステータス)
"[タイプ C] PostgreSQL 高可用性と Consul サービスディスカバリ (DNS)" のスキームの場合:
8300
(Consul Server RPC)8301
(Consul Serf LAN)8302
(Consul Serf WAN)8500
(Consul HTTP API)8600
(Consul DNS サーバー)
推奨事項
クリックして展開...
- Linux (オペレーティングシステム):
展開前にターゲットサーバーのオペレーティングシステムを更新してください;
時間同期が設定されていることを確認してください (NTP)。
ntpサービスのインストールと設定を希望する場合は、ntp_enabled:'true'
と ntp_servers
を指定してください。
- DCS (分散コンセンサスストア):
高速なディスクと信頼性のあるネットワークは、etcd (または consul) クラスタのパフォーマンスと安定性にとって最も重要な要素です。
リソースを大量に使用する他のプロセス(データベースなど)と同じドライブに etcd (または consul) データを保存することは避けてください!
etcd と postgresql データは 異なる ディスクに保存してください(etcd_data_dir
, consul_data_path
変数を参照)、可能であれば SSD ドライブを使用してください。
ハードウェアの推奨事項 および チューニング ガイドを参照してください。
DCS クラスタは、データベースサーバーとは別の専用サーバーに展開することをお勧めします。
- 異なるデータセンターにおけるクラスタメンバーの配置:
データベースが異なるデータセンターに分散するクロスデータセンターのセットアップを希望する場合、etcd メンバーの配置が重要になります。
本当に堅牢な etcd クラスタを作成したい場合には、多くのことを考慮する必要がありますが、一つのルールは、すべての etcd メンバーをプライマリデータセンターに配置しないことです。いくつかの例を参照してください。
- 自動フェイルオーバー時のデータ損失を防ぐ方法(synchronous_modes):
パフォーマンス上の理由から、同期レプリケーションはデフォルトで無効になっています。
自動フェイルオーバー時のデータ損失のリスクを最小限に抑えるために、以下の設定を構成できます:
- synchronous_mode: 'true'
- synchronous_mode_strict: 'true'
- synchronous_commit: 'on'(または 'remote_apply')
はじめに
PostgreSQL クラスタ コンソールを実行するには、以下のコマンドを実行します:
docker run -d --name pg-console \
--publish 80:80 \
--publish 8080:8080 \
--env PG_CONSOLE_API_URL=http://localhost:8080/api/v1 \
--env PG_CONSOLE_AUTHORIZATION_TOKEN=secret_token \
--volume console_postgres:/var/lib/postgresql \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume /tmp/ansible:/tmp/ansible \
--restart=unless-stopped \
vitabaks/postgresql_cluster_console:2.0.0
注意: クラスタの状態を監視できるように、コンソールはデータベースサーバーと同じネットワークで実行することをお勧めします。この場合、PG_CONSOLE_API_URL 変数の localhost
をサーバーの IP アドレスに置き換えてください。
コンソール UI を開く
http://localhost/ にアクセスし、認証にsecret_token
を使用してください。
注意: コンソールを別のサーバーに設定した場合は、localhost
をサーバーのアドレスに置き換えてください。PG_CONSOLE_AUTHORIZATION_TOKEN 変数で再定義した場合は、トークンの値を使用してください。
コマンドラインを好む場合は、ここをクリックして展開...
コマンドライン
- 1つの制御ノード(ノートパソコンなど)に Ansible をインストールします。
sudo apt update && sudo apt install -y python3-pip sshpass git
pip3 install ansible
- このリポジトリをダウンロードまたはクローンします。
git clone https://github.com/vitabaks/postgresql_cluster.git
- プレイブックディレクトリに移動します。
cd postgresql_cluster/automation
- インベントリファイルを編集します。
IP アドレスと接続設定を指定します(環境用の ansible_user
、ansible_ssh_pass
または ansible_ssh_private_key_file
)。
nano inventory
- 変数ファイル vars/main.yml を編集します。
nano vars/main.yml
最小限の変数セット:
proxy_env
# 必要な場合 (パッケージのダウンロード用)cluster_vip
# クラスタ内のデータベースへのクライアントアクセス(オプション)patroni_cluster_name
postgresql_version
postgresql_data_dir
with_haproxy_load_balancing
'true'
(タイプ A)または'false'
/デフォルト(タイプ B)dcs_type
# "etcd"(デフォルト)または "consul"(タイプ C)
詳細については vars/main.yml、system.yml、および (Debian.yml または RedHat.yml) ファイルを参照してください。
dcs_type: "consul" の場合は、制御ノードに consul ロールの要件をインストールしてください:
ansible-galaxy install -r roles/consul/requirements.yml
- ホストへの接続を試みます。
ansible all -m ping
- プレイブックを実行します:
ansible-playbook deploy_pgcluster.yml
TimescaleDB を使用したクラスタの展開
TimescaleDB 拡張機能を持つ PostgreSQL 高可用性クラスタを展開するには、enable_timescale
変数を追加するだけです。
例:
ansible-playbook deploy_pgcluster.yml -e "enable_timescale=true"
ゼロからの開始方法
最初からやり直す必要がある場合は、remove_cluster.yml
プレイブックを使用できます。
利用可能な変数:
remove_postgres
: PostgreSQL サービスを停止し、データを削除します。remove_etcd
: ETCD サービスを停止し、データを削除します。remove_consul
: Consul サービスを停止し、データを削除します。
特定のコンポーネントを削除するために、次のコマンドを実行します:
ansible-playbook remove_cluster.yml -e "remove_postgres=true remove_etcd=true"
このコマンドは指定されたコンポーネントを削除し、新しいインストールをゼロから開始できるようにします。
:warning: 注意: 本番環境でこのコマンドを実行する際は、十分に注意してください。
私たちを応援してください
私たちのプロジェクトが役に立つと感じたら、GitHub で星を付けてください! あなたのサポートは私たちの成長を助け、改善のモチベーションになります。プロジェクトに星を付けることは、感謝の気持ちを示し、他の人が発見するのを助ける簡単で効果的な方法です。
プロジェクトを支援してください
私たちのプロジェクトを支援することで、継続的な改善と革新に直接貢献できます。スポンサーになると、パーソナライズされたサポート、最新機能への早期アクセス、プロジェクトの方向性に影響を与える機会など、特典を受けることができます。あなたのスポンサーシップは私たちにとって非常に貴重であり、プロジェクトの持続可能性と進展を確保する助けになります。
今すぐスポンサーになって、このプロジェクトを次のステップに進めましょう!
私たちの活動を GitHub Sponsors を通じて支援してください。
Patreon を通じて私たちの活動を支援してください。
暗号ウォレットを通じて私たちの活動を支援してください:
USDT (TRC20): TSTSXZzqDCUDHDjZwCpuBkdukjuDZspwjj
ライセンス
MITライセンスの下でライセンスされています。詳細については LICENSE ファイルを参照してください。
著者
Vitaliy Kukharik (PostgreSQL DBA)
vitabaks@gmail.com
フィードバック、バグ報告、リクエスト...
お待ちしております こちら!
PostgreSQL High-Availability Cluster (based on Patroni)
ansible-galaxy install vitabaks.postgresql_cluster