高可用性サポート NGINX Plusの高可用性サポート

NGINX Plusの高可用性サポート

セクションの内容

keepalivedベースの高可用性サポート

NGINX Plus Release 6(R6)以降には、keepalivedをベースにした、NGINX Plusを迅速かつ容易に設定するためのアクティブ/パッシブの高可用性(HA)セットアップ・ソリューションが含まれています。
keepalived オープンソースプロジェクトでは、Linuxサーバ用のkeepalivedデーモン、仮想ルータ(仮想IPアドレス)を管理するVirtual Router Redundancy Protocol(仮想ルータ冗長プロトコル:以下、VRRP)の実装、およびサービス(ウェブサーバ、PHPバックエンド、データベースサーバなど)が稼働状態にあるかどうかを判定するヘルスチェック機能が提供されます。ノードのサービスが、設定された回数のヘルスチェックに合格しない場合、keepalivedが仮想IPアドレスをマスター(アクティブ)ノードからバックアップ(パッシブ)ノードに再割り当てします。

VRRPは常にマスターノードが存在するように、バックアップノードは、VRRP advertisementパケットをマスターノードからリッスンし、設定された間隔の3倍の時間を超えて同パケットを受信しないと、バックアップノードがマスターに代わって、設定された仮想IPアドレスを自らに割り当てます。

高可用性の設定

ルートユーザーの権限で、各ノードでnginx-ha-setupスクリプトを実行します(スクリプトはnginx-ha-keepalivedパッケージにあり、パッケージはベースNGINX Plusパッケージに追加するかたちでインストールされているはずです)。スクリプトは高可用性のNGINX Plus環境を設定し、アクティブ/パッシブのノードがペアとなってマスターとバックアップの機能を果たします。スクリプトは以下のデータをプロンプトします。

  • ローカルノードとリモートノードのIPアドレス(いずれか一方がマスター、他方がバックアップとして設定される)
  • クラスターエンドポイントの(フローティング)仮想IPアドレスとして利用する1つのフリーIPアドレス

keepalivedデーモンの設定は/etc/keepalived/keepalived.confファイルに記録されます。ファイルの設定ブロックが通知設定、管理すべき仮想IPアドレス、および仮想IPアドレスに依存するサービスを検査するためのヘルスチェックを制御します。次の例は、CentOS 7マシン上でnginx-ha-setupスクリプトにより生成される設定ファイルです。これはNGINX Plus設定ファイルではありません。シンタックスが異なっていることにご注意ください(たとえば、ディレクティブの区切りにセミコロンが使われていません)。

vrrp_script chk_nginx_service {
    script "/usr/libexec/keepalived/nginx-ha-check"
    interval 3
    weight 50
}

vrrp_instance VI_1 {
    interface eth0
    state BACKUP
    priority 101
    virtual_router_id 51
    advert_int 1
    unicast_src_ip 192.168.100.100
    unicast_peer {
        192.168.100.101
    }
    authentication {
        auth_type PASS
        auth_pass f8f0e5114cbe031a3e1e622daf18f82a
    }
    virtual_ipaddress {
        192.168.100.150
    }
    track_script {
         chk_nginx_service
    }
    notify "/usr/libexec/keepalived/nginx-ha-notify"
}

全般的な設定についての説明は、この記事の範囲を超えますが、以下のいくつかの点は留意する価値があります。

  • HAセットアップにおける各ノードには、ノードの役割(マスターまたはバックアップ)に対応するpriority、unicast_src_ip、およびunicast_peerディレクティブ用の値が指定された、それぞれの設定ファイルのコピーが必要です。
  • 次のセクションで説明しますが、priorityディレクティブは、どのホストがマスターになるかを制御します。
  • notifyディレクティブは、ディストリビューションに入っている通知スクリプトを命名します。これは状態が遷移したり障害が生じたりしたときに、シスログメッセージ(または他の通知)を生成するのに利用できます。
  • vrrp_instance VI_1ブロックのvirtual_router_idディレクティブ用の値51はサンプルです。必要に応じて変更し、使用環境で一意になるようにしてください。
  • ローカルネットワークで複数ペアのkeepalivedインスタンス(または他のVRRPインスタンス)を実行する場合、それぞれにvrrp_instanceブロックを作成し、一意の名前(たとえばサンプル中のVI_1など)とvirtual_router_id番号を付与します。

ヘルスチェックスクリプトを使用したマスターとバックアップの管理

keepalivedにはフェンシングメカニズムがありません。一対になった2つのノードが相手の存在を認識していなければ、自分自身をマスターであると想定し、仮想IPアドレスを自らに割り当てます。これを防止するため、設定ファイルがchk_nginx_serviceというスクリプト実行メカニズムを定義し、スクリプトを定期的に実行してNGINX Plusの実行状態をチェックし、スクリプトの戻りコードに従ってローカルノードの優先順位を調整します。コードが0(ゼロ)なら正しい実行状態にあり、1(または0以外のコード)ならエラーを示します。

スクリプトのサンプル設定では、weightディレクティブが50に設定されており、チェックスクリプトが正常(コード0が戻る)の場合、以下を意味します。

  • 最初のノードの優先順位(基本優先順位は101)が151に設定される
  • 2番目のノードの優先順位(基本優先順位は100)が150に設定される

最初のノードの優先順位が高いため(この場合は151)、マスターになります。
intervalディレクティブは、チェックスクリプトの実行頻度を秒単位で指定します(サンプル設定ファイルでは3秒)。タイムアウトするとチェックが失敗しますのでご注意ください(デフォルトではタイムアウトとチェック間隔が同じになっています)。

riseディレクティブとfallディレクティブ(サンプル設定ファイルでは使われていません)は、アクションを取るまでのスクリプトの成功または失敗回数を指定します。
nginx-ha-keepalivedパッケージに含まれているnginx-ha-checkスクリプトは、NGINXがアップかどうかをチェックします。ローカルセットアップの必要に応じて、追加スクリプトの作成をお薦めします。

ノードの状態表示

ある仮想IPアドレスのマスターが現在どちらのノードなのかを調べるには、VRRPインスタンスが定義されているインターフェースのip addr showコマンドを実行します(以下のコマンドではノードcentos7-1とcentos7-2のインターフェースeth0)。

centos7-1 # ip addr show eth0
2: eth0:  mtu 1500 qdisc pfifo_fast state
     UP qlen 1000
    link/ether 52:54:00:33:a5:a5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.100/24 brd 192.168.122.255 scope global dynamic \
             eth0
       valid_lft 3071sec preferred_lft 3071sec
    inet 192.168.100.150/32 scope global eth0
       valid_lft forever preferred_lft forever

centos7-2 # ip addr show eth0
2: eth0:  mtu 1500 qdisc pfifo_fast state
     UP qlen 1000
    link/ether 52:54:00:33:a5:87 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.101/24 brd 192.168.122.255 scope global eth0
       valid_lft forever preferred_lft forever

この出力では、centos7-1の2行目のinetがマスターであることを示しており、定義済み仮想IPアドレス(192.168.100.150)が割り当てられています。他のinet行は、実アドレス(192.168.100.100)とバックアップノードのIPアドレス(192.168.100.101)を示します。
ノードの現在のステータスは、ローカルの/var/run/nginx-ha-keepalived.stateファイルに記録されます。次のようにcatコマンドを使用して、表示することができます。

centos7-1 # cat /var/run/nginx-ha-keepalived.state
STATE=MASTER
centos7-2 # cat /var/run/nginx-ha-keepalived.state
STATE=BACKUP

マスターとバックアップの強制的変更

マスターノードを強制的にバックアップノードにするには、マスターノードで次のコマンドを実行します。

# service keepalived stop

シャットダウンし、keepalivedがVRRPパケットを優先順位0でバックアップノードに送ると、バックアップノードがその仮想IPアドレスを引き継ぎます。

仮想IPアドレスの追加

nginx-ha-setupスクリプトにより作成された設定はきわめてベーシックで、単一IPアドレスの可用性を高めます。2つ以上のIPアドレスの可用性を高めるには、/etc/keepalived/keepalived.conf設定ファイルのvirtual_ipaddressブロックに、それぞれ新規のIPアドレスを追加します。

virtual_ipaddress {
    192.168.100.150
    192.168.100.200
    1234:5678:9abc:def::1/64
}

次いでservice keepalived reloadコマンドを各ノードで実行し、keepalivedサービスをリロードします。

centos7-1 # service keepalived reload

centos7-2 # service keepalived reload

この例に見られるように、keepalivedはデュアルスタックのIPv4/IPv6環境で使用でき、IPv4アドレスおよびIPv6アドレスをフェイルオーバーします。virtual_ipaddressブロックのシンタックスは、ipユーティリティのシンタックスを複製します。

keepalivedとVRRPのトラブルシューティング

keepalivedデーモンはシスログユーティリティを使用して記録を行います。CentOS、RHEL、およびSLESベースのシステムでは、出力が通常/var/log/messagesに書き込まれますが、UbuntuおよびDebianベースのシステムでは/var/log/syslogに書き込まれます。ログエントリは、keepalivedデーモンの起動や状態遷移などのイベントを記録します。以下に示すエントリの例では、keepalivedデーモンが起動し、VRRPインスタンスがマスター状態に遷移します(重複を避けるため、最初の行以外はホスト名を削除してあります)。

Feb 27 14:42:04 centos7-1 systemd: Starting LVS and VRRP High Availability Monitor...
Feb 27 14:42:04 Keepalived [19242]: Starting Keepalived v1.2.15 (02/26,2015)
Feb 27 14:42:04 Keepalived [19243]: Starting VRRP child process, pid=19244
Feb 27 14:42:04 Keepalived_vrrp [19244]: Registering Kernel netlink reflector
Feb 27 14:42:04 Keepalived_vrrp [19244]: Registering Kernel netlink command channel
Feb 27 14:42:04 Keepalived_vrrp [19244]: Registering gratuitous ARP shared channel
Feb 27 14:42:05 systemd: Started LVS and VRRP High Availability Monitor.
Feb 27 14:42:05 Keepalived_vrrp [19244]: Opening file '/etc/keepalived/keepalived.conf '.
Feb 27 14:42:05 Keepalived_vrrp [19244]: Truncating auth_pass to 8 characters
Feb 27 14:42:05 Keepalived_vrrp [19244]: Configuration is using: 64631 Bytes
Feb 27 14:42:05 Keepalived_vrrp [19244]: Using LinkWatch kernel netlink reflector...
Feb 27 14:42:05 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Entering BACKUP STATE
Feb 27 14:42:05 Keepalived_vrrp [19244]: VRRP sockpool: [ifindex(2), proto(112), unicast(1), \
                                         fd(14,15)]
Feb 27 14:42:05 nginx -ha-keepalived: Transition to state 'BACKUP ' on VRRP instance 'VI_1 '.
Feb 27 14:42:05 Keepalived_vrrp [19244]: VRRP_Script(chk_nginx_service) succeeded
Feb 27 14:42:06 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) forcing a new MASTER election
Feb 27 14:42:06 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) forcing a new MASTER election
Feb 27 14:42:07 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 27 14:42:08 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 27 14:42:08 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) setting protocol VIPs.
Feb 27 14:42:08 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 \
                                         for 192.168.100.150
Feb 27 14:42:08 nginx -ha-keepalived: Transition to state 'MASTER ' on VRRP instance 'VI_1 '.
Feb 27 14:42:13 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 \
                                         for 192.168.100.150

シスログを見ても問題の原因が分からない場合は、次のようにパラメータを指定してtcpdumpコマンドを実行し、ローカルネットワーク上で送信されるVRRP advertisementを表示します。

# tcpdump -vvv -ni eth0 proto vrrp

ローカルネットワーク上に複数のVRRPインスタンスがあり、出力結果にフィルタをかけて、あるサービスのノードとそのピア間のトラフィックだけを見たい場合、hostパラメータを入れて、keepalived設定ファイルのunicast_peerブロックに定義されているピアのIPアドレスを指定します。次の例を参考にしてください。

centos7-1 # tcpdump -vvv -ni eth0 proto vrrp and host 192.168.100.101
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
14:48:27.188100 IP (tos 0xc0, ttl 255, id 382, offset 0, flags [none],
    proto VRRP (112), length 40)
    192.168.100.100 > 192.168.100.101: vrrp 192.168.100.100 >
        192.168.100.101: VRRPv2 , Advertisement , vrid 51, prio 151,
        authtype simple

出力のいくつかのフィールドは、デバッグに役立ちます。

  • authtype-使用中の認証タイプ(authenticationディレクティブで設定)
  • vrid-仮想ルータID(virtual_router_idデレクティブで設定)
  • prio-ノードの優先順位(priorityデレクティブで設定)
  • intvl-Advertisementの送信頻度(advert_intデレクティブで設定)
  • auth-送信された認証トークン(auth_passデレクティブで設定)

NGINX Plusの設定ファイルの同期

各ノードのNGINX Plus設定ファイルには、可用性を高めたいサービスが定義されていなければなりません。これらの設定ファイルの同期については、提供されるクラスタリングソフトウェアの範囲を超えます。nginx-ha-keepalivedパッケージの/usr/share/doc/nginx-ha-keepalived/ディレクトリに入っている設定例には、多数のHAセットアップ設定方法が示されています。

NGINX Plusについてのお問い合わせ

ページトップへ戻る

NGINX Plusトップページへ戻る