データベースへのトラフィックの管理は、トラフィックの量が増え、データベースが実際には複数のサーバーに分散されるため、ますます困難になる可能性があります。 PostgreSQLクライアントは通常、単一のエンドポイントと通信します。プライマリノードに障害が発生すると、データベースクライアントは同じIPを再試行し続けます。セカンダリノードにフェイルオーバーした場合は、アプリケーションを新しいエンドポイントで更新する必要があります。これは、アプリケーションとデータベースインスタンスの間にロードバランサーを配置する場所です。アプリケーションを使用可能な/正常なデータベースノードに転送し、必要に応じてフェイルオーバーできます。もう1つの利点は、レプリカを効果的に使用して読み取りパフォーマンスを向上させることです。レプリカ間で読み取りのバランスをとる読み取り専用ポートを作成することができます。このブログでは、HAProxyについて説明します。それが何であるか、どのように機能するか、そしてPostgreSQLにどのようにデプロイするかを見ていきます。
HAProxyとは何ですか?
HAProxyは、TCPおよびHTTPベースのアプリケーションの高可用性、負荷分散、およびプロキシを実装するために使用できるオープンソースプロキシです。
ロードバランサーとして、HAProxyは1つの発信元から1つ以上の宛先にトラフィックを分散し、このタスクの特定のルールやプロトコルを定義できます。いずれかの宛先が応答を停止すると、オフラインとしてマークされ、トラフィックは残りの利用可能な宛先に送信されます。
HAProxyを手動でインストールして設定する方法
LinuxにHAProxyをインストールするには、次のコマンドを使用できます。
Ubuntu / Debian OSの場合:
$ apt-get install haproxy -y
CentOS / RedHat OSの場合:
$ yum install haproxy -y
次に、HAProxy構成を管理するために、次の構成ファイルを編集する必要があります。
$ /etc/haproxy/haproxy.cfg
HAProxyの設定は複雑ではありませんが、何をしているのかを知る必要があります。 HAProxyの動作方法に応じて、設定するパラメータがいくつかあります。詳細については、HAProxy構成に関するドキュメントに従うことができます。
基本的な構成例を見てみましょう。次のデータベーストポロジがあるとします。
データベーストポロジの例3つのノード間の読み取りトラフィックのバランスをとるためにHAProxyリスナーを作成したいと思います。
listen haproxy_read
bind *:5434
balance roundrobin
server postgres1 10.1.1.10:5432 check
server postgres2 10.1.1.11:5432 check
server postgres3 10.1.1.12:5432 check
前に述べたように、ここで構成するパラメーターはいくつかあり、この構成は実行する内容によって異なります。例:
listen haproxy_read
bind *:5434
mode tcp
timeout client 10800s
timeout server 10800s
tcp-check expect string is\ running
balance leastconn
option tcp-check
default-server port 9201 inter 2s downinter 5s rise 3 fall 2 slowstart 60s maxconn 64 maxqueue 128 weight 100
server postgres1 10.1.1.10:5432 check
server postgres2 10.1.1.11:5432 check
server postgres3 10.1.1.12:5432 check
ClusterControlでのHAProxyの動作
PostgreSQLの場合、HAProxyは、デフォルトで2つの異なるポート(1つは読み取り/書き込み、もう1つは読み取り専用)を使用してClusterControlによって構成されます。
ClusterControlロードバランサーのデプロイ情報1読み取り/書き込みポートでは、マスターサーバーがオンラインで、残りのノードがオフラインであり、読み取り専用ポートでは、マスターとスレーブの両方がオンラインです。
ClusterControlロードバランサーの統計1HAProxyは、マスターまたはスレーブのいずれかのノードにアクセスできないことを検出すると、自動的にオフラインとしてマークし、トラフィックの送信時に考慮しません。検出は、デプロイメント時にClusterControlによって構成されたヘルスチェックスクリプトによって行われます。これらは、インスタンスが稼働しているかどうか、回復中かどうか、または読み取り専用かどうかを確認します。
ClusterControlがスレーブをマスターにプロモートすると、HAProxyは古いマスターをオフライン(両方のポート)としてマークし、プロモートされたノードをオンライン(読み取り/書き込みポート)にします。
ClusterControlロードバランサーの統計2このようにして、私たちのシステムは私たちの介入なしに正常に動作し続けます。
ClusterControlを使用してHAProxyをデプロイする方法
この例では、1つのマスターと2つのスレーブを持つ環境を作成しました。ClusterControlのトポロジビューのスクリーンショットを参照してください。次に、HAProxyロードバランサーを追加します。
ClusterControlトポロジビュー1このタスクでは、ClusterControl-> PostgreSQL Cluster Actions-> Add Load Balancer
に移動する必要があります。 ClusterControlクラスターアクションメニューここで、ClusterControlがHAProxyロードバランサーのインストールと構成に使用する情報を追加する必要があります。
ClusterControlロードバランサーのデプロイ情報2紹介する必要のある情報は次のとおりです。
アクション:デプロイまたはインポートします。
HAProxyアドレス:HAProxyサーバーのIPアドレス。
バインド先:HAProxyがリッスンするインターフェースまたはIPアドレス。
リッスンポート(読み取り/書き込み):読み取り/書き込みモードのポート。
リッスンポート(読み取り専用):読み取り専用モードのポート。
ポリシー:次のようになります:
- lessonconn:接続数が最も少ないサーバーが接続を受信します。
- ラウンドロビン:各サーバーは、その重みに応じて順番に使用されます。
- ソース:ソースIPアドレスはハッシュ化され、実行中のサーバーの総重量で除算されて、リクエストを受信するサーバーを指定します。
読み取り/書き込み分割用にインストール:マスター/スレーブレプリケーション用。
出典:パッケージマネージャーからインストールするか、ソースからビルドするかを選択できます。
ターゲットの既存のpostgreschkを上書きします。
また、HAProxy構成に追加するサーバーと、次のような追加情報を選択する必要があります。
役割:アクティブまたはバックアップにすることができます。
含める:はいまたはいいえ。
接続アドレス情報。
また、管理者ユーザー、バックエンド名、タイムアウトなどの詳細設定を構成できます。
ClusterControlロードバランサーデプロイ情報詳細構成を完了してデプロイを確認すると、ClusterControlUIの[アクティビティ]セクションで進行状況を確認できます。
ClusterControlアクティビティセクション完了すると、次のトポロジが作成されます。
ClusterControlトポロジビュー2新しいHAProxyノードを追加し、それらの間にキープアライブサービスを構成することで、HA設計を改善できます。これはすべてClusterControlで実行できます。詳細については、PostgreSQLとHAに関する以前のブログを確認してください。
ClusterControlCLIを使用してHAProxyロードバランサーを追加する
s9s-toolsとも呼ばれるこのオプションのパッケージは、ClusterControlバージョン1.4.1で導入されました。これには、s9sと呼ばれるバイナリが含まれています。これは、ClusterControlを使用してデータベースインフラストラクチャを操作、制御、および管理するためのコマンドラインツールです。 s9sコマンドラインプロジェクトはオープンソースであり、GitHubにあります。
バージョン1.4.1以降、インストーラースクリプトは、ClusterControlノードにパッケージ(s9s-tools)を自動的にインストールします。
ClusterControl CLIは、クラスター自動化の新しい扉を開き、Ansible、Puppet、Chef、Saltなどの既存のデプロイメント自動化ツールと簡単に統合できます。
クラスタID1でIPアドレス192.168.100.142のHAProxyロードバランサを作成する方法の例を見てみましょう。
[[email protected] ~]# s9s cluster --add-node --cluster-id=1 --nodes="haproxy://192.168.100.142" --wait
Add HaProxy to Cluster
/ Job 7 FINISHED [██████████] 100% Job finished.
次に、コマンドラインからすべてのノードを確認できます。
[[email protected] ~]# s9s node --cluster-id=1 --list --long
STAT VERSION CID CLUSTER HOST PORT COMMENT
coC- 1.7.0.2832 1 PostgreSQL1 192.168.100.135 9500 Up and running.
poS- 10.5 1 PostgreSQL1 192.168.100.136 5432 Up and running.
poM- 10.5 1 PostgreSQL1 192.168.100.137 5432 Up and running.
poS- 10.5 1 PostgreSQL1 192.168.100.138 5432 Up and running.
ho-- 1.5.18 1 PostgreSQL1 192.168.100.142 9600 Process 'haproxy' is running.
Total: 5
s9sとその使用方法の詳細については、公式ドキュメントまたはこのトピックのブログの作成方法を確認してください。
結論
このブログでは、HAProxyがアプリケーションからPostgreSQLデータベースへのトラフィックを管理するのにどのように役立つかを確認しました。手動で展開および構成する方法を確認してから、ClusterControlを使用して自動化する方法を確認しました。 HAProxyが単一障害点(SPOF)になるのを防ぐために、少なくとも2つのHAProxyインスタンスをデプロイし、それらの上にKeepalivedやVirtualIPなどを実装するようにしてください。