2023年7月2日日曜日

NGINXの負荷分散装置(ロードバランサ)をPacemakerで冗長化する

先日、NGINXを使って負荷分散装置(ロードバランサ)を構築してみた。

2台のサーバに対して負荷分散して通信できることで、リソースを分散させるだけでなく冗長化も図ることができたが、肝心の負荷分散装置であるNGINX自体がシングルポイントとなっているため、可用性の観点から不十分である。

しかし、OSSのNGINXではNGINXによる冗長化機能はないため、もし冗長化したい場合は別の手法を検討する必要がある。そこで、以前から本ブログで紹介したことがある「Pacemaker+Corosync」を使って、クラスタ構成による冗長化を図ることにした。

今回はPacemaker+Corosyncを使ってNGINXをクラスタ化し冗長構成された負荷分散装置(ロードバランサ)を構築する。

環境

環境としては以下の通りAlmaLinuxを利用したが、そのほかのRed Hat系のディストリビューションであれば、ほぼ同様の手順で構築できるはずだ。

  • AlmaLinux 8.5 及び AlmaLinux 9.2
  • NGINX 1.14.1

負荷分散装置の構成は以下の通りとする。クライアントからの通信と負荷分散対象サーバが同一のインタフェースとなる「ワンアーム」構成となる。なお、NGINXでは、通信は必ずSource NATされるため、ワンアーム構成としたとしても特別な設定は不要となる。

Pacemaker+CorosyncによるNGINX冗長化手順

1. 2台のサーバでNGINXを構築

Pacemaker+Corosyncでクラスタを構成する前に、事前にクラスタ対象サーバでNGINXを負荷分散装置として動作するよう構築しておこう。再掲となるが、手順は以下を参照してほしい。

2. Pacemaker+Corosyncを構築

Pacemaker+Corosyncの構築手順は、以前別記事にて記載している。こちらを参考に、クラスタの起動までできるように構築する。

補足として、AlmaLinux 8.5においては、Pacemaker+Corosyncのインストールに必要なリポジトリがHighAvailabilityではなくhaになっている。

# dnf repolist all
repo id                    repo の名前                                    状態
~(中略)~
ha                         AlmaLinux 8 - HighAvailability                 無効化
ha-debuginfo               AlmaLinux 8 - HighAvailability debuginfo       無効化
ha-source                  AlmaLinux 8 - HighAvailability Source          無効化
~(以下略)~

したがって、dnfによるインストール実施時に、リポジトリを以下のように指定して対応しよう。なお、AlmaLinux 9.2ではリポジトリ名がhighavailability(全部小文字)になっていたので、OSバージョンに合わせて適切なリポジトリを選択しよう。

# dnf --enablerepo=ha install pacemaker pcs fence-agents-all pcp-zeroconf -y

3. クラスタリソース及び制約設定

Pacemaker+Corosyncのインストールが終わったら、以下の通りクラスタリソースと制約の設定を行う。

リソース種類 リソース名 設定値
VIP rs-vip-33 ens192のインタフェースに対して192.168.33.23/24のIPアドレスを設定する。
NGINX rs-systemd-nginx NGINXをsystemdにて起動・停止する。
Ping rs-ping-33 ゲートウェイに対して各サーバからPingを実行し、Ping疎通ができないサーバではリソースを起動できないよう制約 (constraint) を設定する。
# pcs resource create rs-vip-33 ocf:heartbeat:IPaddr2 ip=192.168.33.23 cidr_netmask=24 nic=ens192 --group rg-01
# pcs resource create rs-systemd-nginx systemd:nginx --group rg-01

# pcs resource create rs-ping-33 ocf:pacemaker:ping dampen=5s multiplier=1000 host_list=192.168.33.31
# pcs resource clone rs-ping-33
# pcs constraint location rg-01 rule score=-INFINITY pingd lt 1 or not_defined pingd

最終的なリソース及び制約の設定は以下の通り。

# pcs resource show --full
Warning: This command is deprecated and will be removed. Please use 'pcs resource config' instead.
 Group: rg-01
  Resource: rs-vip-33 (class=ocf provider=heartbeat type=IPaddr2)
   Attributes: cidr_netmask=24 ip=192.168.33.23 nic=ens192
   Operations: monitor interval=10s timeout=20s (rs-vip-33-monitor-interval-10s)
               start interval=0s timeout=20s (rs-vip-33-start-interval-0s)
               stop interval=0s timeout=20s (rs-vip-33-stop-interval-0s)
  Resource: rs-systemd-nginx (class=systemd type=nginx)
   Operations: monitor interval=60 timeout=100 (rs-systemd-nginx-monitor-interval-60)
               start interval=0s timeout=100 (rs-systemd-nginx-start-interval-0s)
               stop interval=0s timeout=100 (rs-systemd-nginx-stop-interval-0s)
 Clone: rs-ping-33-clone
  Resource: rs-ping-33 (class=ocf provider=pacemaker type=ping)
   Attributes: dampen=5s host_list=192.168.33.31 multiplier=1000
   Operations: monitor interval=10s timeout=60s (rs-ping-33-monitor-interval-10s)
               start interval=0s timeout=60s (rs-ping-33-start-interval-0s)
               stop interval=0s timeout=20s (rs-ping-33-stop-interval-0s)

# pcs constraint
Location Constraints:
  Resource: rg-01
    Constraint: location-rg-01
      Rule: boolean-op=or score=-INFINITY
        Expression: pingd lt 1
        Expression: not_defined pingd
Ordering Constraints:
Colocation Constraints:
Ticket Constraints:

4. 動作確認

クラスタリソースが稼働しているサーバをシャットダウンした際に、もう1台のサーバにフェイルオーバーすることを確認する。

フェイルオーバー前の状態は以下の通り。

# pcs status
Cluster name: clst-01
Cluster Summary:
  * Stack: corosync
  * Current DC: t3041ngnx (version 2.1.0-8.el8-7c3f660707) - partition with quorum
  * Last updated: Sun Apr 24 11:47:32 2022
  * Last change:  Sat Apr 23 08:50:12 2022 by root via cibadmin on t3041ngnx
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ t3041ngnx t3042ngnx ]

Full List of Resources:
  * Resource Group: rg-01:
    * rs-vip-33 (ocf::heartbeat:IPaddr2):        Started t3041ngnx
    * rs-systemd-nginx  (systemd:nginx):         Started t3041ngnx
  * Clone Set: rs-ping-33-clone [rs-ping-33]:
    * Started: [ t3041ngnx t3042ngnx ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled

稼働系のサーバをシャットダウンすると、以下の通り残りのサーバでクラスタリソースが再起動されていることがわかる。

# pcs status
Cluster name: clst-01
Cluster Summary:
  * Stack: corosync
  * Current DC: t3042ngnx (version 2.1.0-8.el8-7c3f660707) - partition with quorum
  * Last updated: Sun Apr 24 11:48:15 2022
  * Last change:  Sat Apr 23 08:50:12 2022 by root via cibadmin on t3041ngnx
  * 2 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ t3042ngnx ]
  * OFFLINE: [ t3041ngnx ]

Full List of Resources:
  * Resource Group: rg-01:
    * rs-vip-33 (ocf::heartbeat:IPaddr2):        Started t3042ngnx
    * rs-systemd-nginx  (systemd:nginx):         Started t3042ngnx
  * Clone Set: rs-ping-33-clone [rs-ping-33]:
    * Started: [ t3042ngnx ]
    * Stopped: [ t3041ngnx ]

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled

以上で、Pacemaker+Corosyncを使ってNGINXをクラスタ化し冗長構成された負荷分散装置を構築する手順は完了となる。

更新履歴

  • 2022/6/11 新規作成
  • 2023/7/2 AlmaLinux 9.2の記載を追記

0 件のコメント:

コメントを投稿

人気の投稿