vitabaks.postgresql_cluster

PostgreSQL 高可用クラスタ :elephant: :sparkling_heart:

GitHub license GitHub stars

生産準備完了の PostgreSQL 高可用クラスタ(Patroni に基づく)。Ansible で自動化。

postgresql_cluster は、生産環境での高可用 PostgreSQL クラスタの展開と管理を自動化します。このソリューションは、専用の物理サーバー、仮想マシン、およびオンプレミスとクラウドベースのインフラ内での使用に最適です。

このドキュメントのバージョンは、postgresql-cluster.org で検索可能で、より簡単にナビゲートできます。

:trophy: スポンサーシップ プログラムを使用して、パーソナライズされたサポートを受けるか、このプロジェクトに貢献してください。


Postgres クラスタのサポートされるセットアップ

postgresql_cluster postgresql_cluster

デプロイメントには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 GitHub Workflow Status
Debian 12 GitHub Workflow Status
Ubuntu 22.04 GitHub Workflow Status
Ubuntu 24.04 GitHub Workflow Status
CentOS Stream 9 GitHub Workflow Status
Oracle Linux 8 GitHub Workflow Status
Oracle Linux 9 GitHub Workflow Status
Rocky Linux 8 GitHub Workflow Status
Rocky Linux 9 GitHub Workflow Status
AlmaLinux 8 GitHub Workflow Status
AlmaLinux 9 GitHub Workflow Status
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. 1つの制御ノード(ノートパソコンなど)に Ansible をインストールします。
sudo apt update && sudo apt install -y python3-pip sshpass git
pip3 install ansible
  1. このリポジトリをダウンロードまたはクローンします。
git clone https://github.com/vitabaks/postgresql_cluster.git
  1. プレイブックディレクトリに移動します。
cd postgresql_cluster/automation
  1. インベントリファイルを編集します。
IP アドレスと接続設定を指定します(環境用の ansible_useransible_ssh_pass または ansible_ssh_private_key_file)。
nano inventory
  1. 変数ファイル 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.ymlsystem.yml、および (Debian.yml または RedHat.yml) ファイルを参照してください。

dcs_type: "consul" の場合は、制御ノードに consul ロールの要件をインストールしてください:

ansible-galaxy install -r roles/consul/requirements.yml
  1. ホストへの接続を試みます。
ansible all -m ping
  1. プレイブックを実行します:
ansible-playbook deploy_pgcluster.yml

TimescaleDB を使用したクラスタの展開

TimescaleDB 拡張機能を持つ PostgreSQL 高可用性クラスタを展開するには、enable_timescale 変数を追加するだけです。

例:

ansible-playbook deploy_pgcluster.yml -e "enable_timescale=true"

asciicast

ゼロからの開始方法

最初からやり直す必要がある場合は、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 で星を付けてください! あなたのサポートは私たちの成長を助け、改善のモチベーションになります。プロジェクトに星を付けることは、感謝の気持ちを示し、他の人が発見するのを助ける簡単で効果的な方法です。

Star History Chart

プロジェクトを支援してください

私たちのプロジェクトを支援することで、継続的な改善と革新に直接貢献できます。スポンサーになると、パーソナライズされたサポート、最新機能への早期アクセス、プロジェクトの方向性に影響を与える機会など、特典を受けることができます。あなたのスポンサーシップは私たちにとって非常に貴重であり、プロジェクトの持続可能性と進展を確保する助けになります。

今すぐスポンサーになって、このプロジェクトを次のステップに進めましょう!

私たちの活動を GitHub Sponsors を通じて支援してください。

GitHub Sponsors

Patreon を通じて私たちの活動を支援してください。

Support me on 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
ライセンス
mit
ダウンロード
735
所有者