HOMEProducts/製品News/ニュースDownload/ダウンロードofficial blogお問い合わせ会社概要

[ヘルパー] 外部ロードバランサー関するノウハウ


CommuniGate Proのバージョン6.0では、ヘルパーアプリケーションを介してソフトウェアロードバランサと連動する機能が実装されています。

CommuniGate Proのバージョン6.0が標準提供するヘルパーアプリケーションでは、Linuxのディストリビューションで提供されるipvsとの連動を対象としており、Redhat系ディストリビューション(Fedora/Redhat Enterprise Linux/CentOS等)を使う場合に、英語マニュアルに記載された手順でこの機能が運用可能になっています。
  • ただし、カーネルバージョン3.5.3-1以降が推奨されています。
    それ以前のバージョンでは、アクティブなロードバランサによって生成されたTCPコネクションが、アクティブなロードバランサの切り替え(他のサーバ上で動くバランサへの切り替え)が生じた際にドロップするからです。

ここでは、CommuniGate Proのバージョン6.0が標準提供するヘルパーアプリケーションを介してソフトウェアロードバランサと連動する機能の動作の概要と使い方を紹介します。



<動作の概要>
    ハードウェアのロードバランサを導入する場合には、フロントエンドサーバのWAN側に、ロードバランサを配置しますが、ipvsを使ったソフトウェアロードバランシングでは、フロントエンドのWAN側には通常のスイッチングハブを配置するだけで済みます。
    ipvsはフロントエンドサーバ(マイクロダイナミッククラスタでは全てのサーバ)で動作する必要があります。

    ソフトウェアロードバランサと連動させる場合、CommuniGate Proでは、負荷分散対象となるフロントエンドサーバを、同一の「ロードバランサーグループ」に属させることで、そのうちの1つをアクティブなロードバランサとして動作させ、それに問題が生じたときに、アクティブなロードバランサの切り替えを行うようになっています。

    ソフトウエアロードバランサ連動の概要の図解

    [ WANからのパケットがアクティブロードバランサに届くために ]

    ネットワーク設定と、ヘルパーの組み合わせにより、以下のような動作をすることで、WANからのパケットがアクティブロードバランサに届く仕組みになっています。

    1. 全てのフロントエンドサーバのループバックデバイスにエイリアスを持たせ、同一の仮想IPアドレスを設定する。
    2. エイリアス上の仮想IPアドレスは、基本的にARPリクエストの応答を返さないようにする。
    3. アクティブロードバランサとして動作開始したときに、仮想IPアドレスについてのARPリクエスト(Gratuitous ARP)を出す。

        ※スイッチングハブは、ARPリクエスト(Gratuitous ARP)によって、仮想IPアドレスと、アクティブロードバランサの仮想IPアドレスを持っているMACアドレスの組み合わせを記憶するので、仮想IPアドレス宛のパケットは、アクティブロードバランサのサーバに到着します。


    [ アクティブロードバランサから各サーバにパケットを送る方法は ]

    WANからのパケットを受け取ったアクティブロードバランサは、パケットのディスティネーションアドレス(宛先アドレス)を変更していない(仮想IPアドレスのままの)パケットを、負荷分散対象のサーバの持つMACアドレス宛てにパケットを再送します。





<使い方>
    1.下準備

      「OSのインストール(必要ならカーネルバージョンのアップデート)」、「(yum install ipvsadmなどの方法で)ipvsadmのインストール」、「CommuniGate Proのインストール」を行ってください。
      その時点で、固定IPアドレスを使って、クラスタを動作させるに必要なネットワーク的諸設定は済ませてあるものとします。

      ダイナミッククラスタ(またはマイクロダイナミッククラスタ)を構築するための諸設定を行ってください。

        ダイナミッククラスタ用のライセンスキーを入れてください。(弊社にお問い合わせいただければ、導入前の試験を検討されていユーザ様には、必要書類に必要事項を記載していただくことを前提に、有効期間が限定された、テスト用のライセンスキーを提供いたします。)

        ダイナミッククラスタ用ライセンスを提供したユーザ様には、別途弊社がダイナミッククラスタの基本的設定方法に関する説明をいたします。


    2.ループバックデバイスにエイリアスを作り、仮想IPアドレスを設定する

      通常、ループバックアドレス(lo)は「127.0.0.1」で、ネットマスクが「255.255.255.255」になっています。
      ここに、エイリアス(lo:0)として、仮に「192.168.200.200」を設定する場合は、以下のようなコマンドを使います。

        ifconfig lo:0 192.168.200.200 netmask 255.255.255.255 up


      通常なら、これを、恒久的な設定とする場合は、「/etc/sysconfig/network-scripts/ifcfg-lo:0」に以下のように記述します。

        DEVICE=lo:0
        IPADDR=192.168.200.200
        NETMASK=255.255.255.255
        ONBOOT=yes

      しかし、多数の仮想IPアドレスを使う場合や、今回の説明のように、Linuxに組み込まれたipvsロードバランサを使う場合は、「/etc/sysconfig/network-scripts/ifcfg-lo:n」を作成しないでください。
      代わりに、「4.仮想IPアドレスを定義した(独自の)設定ファイルを作成する」で説明するファイルに、全ての仮想IPアドレスを記述することで動作させます。


    3.仮想IPアドレスについて、ARPリクエストの応答を回避する設定をする。

      既存の「/etc/sysctl.conf」の末尾に、以下の記述を追加してください。

        # ARP: reply only if the target IP address is
        # a local address configured on the incoming interface
        net.ipv4.conf.all.arp_ignore = 1
        #
        # When an arp request is received on eth0, only respond
        # if that address is configured on eth0.
        net.ipv4.conf.eth0.arp_ignore = 1
        #
        # Enable configuration of arp_announce option
        net.ipv4.conf.all.arp_announce = 2
        # When making an ARP request sent through eth0, always use an address
        # that is configured on eth0 as the source address of the ARP request.
        net.ipv4.conf.eth0.arp_announce = 2
        #
        # Repeat for eth1, eth2 (if exist)
        #net.ipv4.conf.eth1.arp_ignore = 1
        #net.ipv4.conf.eth1.arp_announce = 2
        #net.ipv4.conf.eth2.arp_ignore = 1
        #net.ipv4.conf.eth2.arp_announce = 2


          ※ARPリクエストへの応答をすべきデバイスが、eth0のみの場合の例として

            net.ipv4.conf.eth0.arp_ignore = 1

          の行が記載してありますが、必要に応じて追記してください。


    4.仮想IPアドレスを定義した(独自の)設定ファイルを作成する

      「/etc/sysconfig/vipaddrs」というファイルを作成し、その中に、運用する仮想IPアドレスを記述します。
      複数設定することも出来ますが、仮に「192.168.200.200」を1つだけ運用するケースとして設定する場合、単に以下のように記述します。

        192.168.200.200


      複数の仮想IPアドレスで運用するときは、改行毎にIPアドレスを羅列したり、サブネット単位で記述したりも出来ます。

      複数羅列する例
        # single addresses
        72.20.112.45
        72.20.112.46


      サブネット単位で指定する例
        # a subnetwork
        72.20.112.48/29

          ※ #で始まる行はコメントとして扱われます。
          ※ サブネットマスクは24ビット以上である必要があります。



    5.ネットワーク設定用の(独自の)スクリプトファイルを作成する

      5-1.「/etc/sysconfig/network-scripts/ifvip-utils 」というファイルを作成し、その中に、以下のように記述します。

        #!/bin/bash
        #
        # /etc/sysconfig/network-scripts/ifvip-utils
        #
        VIPADDRFILE="/etc/sysconfig/vipaddrs"

        VIPLIST=""           # list of VIP masks: xxx.yy.zz.tt/mm where mm should be >= 24

        for xVIP in `cat $VIPADDRFILE | grep -v '^#'`; do
          if [[ $xVIP != */* ]]; then xVIP=$xVIP/32; fi
          if (( ${xVIP##*/} < 24)); then
            echo "Incorrect mask: $xVIP" >2 ; exit 1;
          fi
          VIPLIST="$VIPLIST$xVIP "
        done

        CURRENT=`ip address show dev lo | egrep '^ +inet [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\/32 .*$' | sed -r 's/ +inet ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*/\1/' `

        function contains() {
          local x;
          for x in $1; do
            if [[ $x == $2 ]]; then return 0; fi
          done
          return 1
        }


      5-2.「/etc/sysconfig/network-scripts/ifup-lo」というファイルを作成し、その中に、以下のように記述します。

        #!/bin/bash
        #
        # /etc/sysconfig/network-scripts/ifup-lo
        #
        /etc/sysconfig/network-scripts/ifup-eth ${1} ${2}
        #
        # Bring up all addresses listed in the VIPADDRFILE file, as lo aliases
        #
        . /etc/sysconfig/network-scripts/ifvip-utils

        for xVIP in $VIPLIST; do
          xIP=${xVIP%/*}       # xx.xx.xx.yy/mm -> xx.xx.xx.yy
          xIP0=${xIP%.*}       # xx.xx.xx.yy/mm -> xx.xx.xx
          xIP1=${xIP##*.}      # xx.xx.xx.yy/mm -> yy
          xMask=$(( 2 ** (32 - ${xVIP##*/}) ))
          for (( index=0; index<$xMask; index++ )); do
            thisIP=$xIP0.$((xIP1 + index))
            if ! $(contains "$CURRENT" "$thisIP"); then
              ip address add $thisIP/32 dev lo
            fi
            done
          done


      5-3.「/etc/sysconfig/network-scripts/ifdown-lo」というファイルを作成し、その中に、以下のように記述します。

        #!/bin/bash
        #
        # /etc/sysconfig/network-scripts/ifdown-lo
        #
        # Bring down all addresses listed in the VIPADDRFILE file
        #
        . /etc/sysconfig/network-scripts/ifvip-utils

        for xVIP in $VIPLIST; do
          xIP=${xVIP%/*}       # xx.xx.xx.yy/mm -> xx.xx.xx.yy
          xIP0=${xIP%.*}       # xx.xx.xx.yy/mm -> xx.xx.xx
          xIP1=${xIP##*.}      # xx.xx.xx.yy/mm -> yy
          xMask=$(( 2 ** (32 - ${xVIP##*/}) ))
          for (( index=0; index<$xMask; index++ )); do
            thisIP=$xIP0.$((xIP1 + index))
            if $(contains "$CURRENT" "$thisIP"); then
              ip address delete $thisIP/32 dev lo
            fi
            done
          done

        /etc/sysconfig/network-scripts/ifdown-eth ${1} ${2}


    6.管理画面での「WAN IPアドレス」および「UDPリスナー」の設定

      エイリアス(lo:0)が作成できたら、管理画面の「設定」-「全般」-「情報」で[再読込]ボタンを押してください。
      管理画面上で、このサーバが持つIPアドレスを選択するときに、仮想IPアドレスが選択肢として選べるようになります。

      6-1.クラスタワイドの「WAN IPv4アドレス」の設定

        「設定」-「ネットワーク」-「LAN IP」-「クラスタワイド」の「ローカルNAT/ファイアウォール/ロードバランサー」の欄にある「WAN IPv4アドレス」のところに、仮想IPアドレスを記入して「更新」を押してください。



        設定後の図解(「192.168.1.82」を仮想IPアドレスとした場合)


      6-2.サーバーワイドの「WAN IPv4アドレス」の設定

        「設定」-「ネットワーク」-「LAN IP」-「サーバーワイド」の「ローカルNAT/ファイアウォール/ロードバランサー」の欄にある「WAN IPv4アドレス」のところに、設定対象のサーバの実IPアドレスを記入して「更新」を押してください。



        設定後の図解(「192.168.1.80」を実IPアドレスとした場合)


      6-3.仮想IPアドレスをSIP UDPで使う場合は、以下の設定をする必要があります。

        1.「設定」-「リアルタイム」-「SIP」-「受信」で「UDPリスナー」のリンクをクリック
        2.「全てのアドレス」が選択されている所を「仮想IPアドレス」に選択し直して「更新」を押す
        3.新たに入力できる空欄を「5060」「全てのアドレス」の選択にしてから「更新」を押す



        設定後の図解(「192.168.1.82」を仮想IPアドレスとした場合)



    7.Outgoing TCPコネクション(外向きのTCPコネクション)の設定

      フロントエンドサーバが、仮想IPアドレスから外部のサーバにTCPコネクションを行う際に使うソースポートの範囲を、各フロントエンド毎に異なる範囲に設定します。
      たとえば、フロントエンド1を50000~54000、フロントエンド2を55000~59000にする場合、以下のようにします


        1.フロントエンド1で以下のコマンドを実行する。
          echo "50000 54000" >/proc/sys/net/ipv4/ip_local_port_range
            ※事前に「cat /proc/sys/net/ipv4/ip_local_port_range」で現行の設定を確認/記録しておくことを推奨します。

        2.フロントエンド1で「/etc/sysctl.conf」を以下の行の内容を反映させる
          net.ipv4.ip_local_port_range = 50000 54000

        3.フロントエンド2でも、値を55000~59000に読み替えて、上記2つを実行する
        4.管理画面の「設定」-「ネットワーク」-「LAN IP」-「サーバーワイド」の「Port Allocation」の欄にある「TCP:」の設定値を、フロントエンド1/フロントエンド2共に、それぞれの範囲に設定し、「Use for Media Proxy only」のチェックを外して「更新」を押す。



        フロントエンド1設定後の図解




    8.ロードバランサ制御に関する管理画面上での設定

      CommuniGate Proはクラスタメンバのサーバ上で動作しているソフトウェアロードバランサを制御できます。
      その設定は、ロードバランシング対象となるフロントエンドサーバの管理画面で行います。
      そのサーバでは、すでにループバックデバイスのエイリアスでの仮想IPアドレスの設定が済んでいるものとします。

      「設定」-「全般」-「クラスタ」の「クラスタネットワーク」の欄にある「ロードバランサーグループ」の設定を、ロードバランシング対象となる全てのフロントエンドサーバで「A」にて「更新」ボタンを押してください。
        ※同一のグループに入れるという意味です。複数のグループで運用する場合などは、状況に合わせてください。



      「ロードバランサーグループ」の設定の図解



      「設定」-「全般」-「へルパー」の「外部ロードバランサー」の欄のチェックボックスをチェックし、「プログラムパス」に「$Services/IPVSHelper.sh」と記述して「更新」ボタンを押してください。
        ※「$Services」と書くのは、「/opt/CommuniGate/Services/」にプログラムがあるという意味になります。




      「外部ロードバランサー」の設定の図解


        ・「IPVSHelper.sh」のコマンドオプションについて説明します。無指定の場合、デフォルトで動作します。

        -p 数値
          ここで指定された秒数の間に同一のIPアドレスから到達したパケットは、同一のフロントエンドに配送されます。
          デフォルトは15秒です。
          「-p 0」を指定すると、同一IPアドレスからの到達を同一フロントエンドに配送する機能は働きません。

        -i インターフェース名
          仮想IPアドレスでの受信を行うためのインターフェース名を指定します。
          デフォルトは「eth0」です。

        -s 数値
          この数値は、「SyncID」として、アクティブロードバランサーと、ロードバランサになりうるクラスタメンバ上にある「コネクションテーブル」を同期させるために使われます。
          デフォルトは「0」です。

        -t 数値
          この数値は、CommuniGate Proのサーバから送られたコマンドをreadするためのタイムアウト値(秒)です。
          デフォルトは15秒です。

        -f ファイルのパス
          仮想IPアドレスのリストを含んでいるファイルのパスです。
          デフォルトは「/etc/sysconfig/vipaddrs」です。

        -r 数値
          ロードバランサーグループ内でのアクティブロードバランサの相対的な重み付けです。
          アクティブロードバランサではないグループメンバを100とした場合に、どの程度の仕事をさせるかを意味します。
          デフォルトは100です。

        -m
          「-m」が指定された場合、ヘルパー・アプリケーションは実際のシェル・コマンドを実行しません。
          しかし、標準出力経由で実行するコマンドを単にCommuniGate Proに引き渡すため、それらはCommuniGate Proのシステムログに記録されます。


        以上で、CommuniGate Proは、ヘルパーアプリケーションを介してソフトウェアロードバランサと連動する状態になります。



    9.バランシング対象として運用中のCommuniGate Proを止める方法

      CommuniGate Proのクラスタの各ノードは、通常の場合、NON READYにしてから停止する処理を行います。
      ロードバランシング対象のサーバでは、ロードバランシングを止める手順も必要になりますので、以下の手順に従ってください。

      1. 止めたいサーバの管理画面の「設定」-「全般」-「クラスタ」の「クラスタネットワーク」の欄にある「ロードバランサーグループ」で空白を選んで更新する。
          この操作により、仮に止めるサーバがアクティブバランサーだった場合には、別のサーバ側にアクティブバランサーが移ったことが、別のサーバの管理画面の「モニター」-「クラスタ」で確認できます。
          この操作をすることで、WAN側からこのサーバにパケットが配送されなくなります。

      2. 止めたいサーバの管理画面の「設定」-「全般」-「クラスタ」で「Non Readyにする」のボタンを押します。
          この操作をすることで、このサーバがクラスタのメンバから外されます。

      3. 止めたいサーバの管理画面の「設定」-「ヘルパー」-「外部ロードバランサー」のチェックを外して「更新」ボタンを押します。
          この操作をすることで、ヘルパープログラムが停止します。
          外部ロードバランサーのヘルパーアプリケーションが動作したままだとCommuniGate Proは停止できません。

      4. 止めたいサーバのコンソールで、「/etc/rc.d/init.d/CommuniGate stop」の操作を行います。
          この操作をすることで、CommuniGate Proが停止します。
          この後、shutdown -h nowを行っても問題は生じませんが、これらの手順を踏まずにshutdownすると、アクティブコントローラが切り替わりません。
          いきなり電源が落ちたり、故障で停止した場合は、タイムアウトの後にアクティブバランサーが動作中のサーバ側に自動的に切り替わります。



      上記手順で止めたCommuniGate Proを再び、ロードバランシング対象として動作再開する場合の手順は、以下の通りです。

      1. 再開したいサーバのコンソールで、「/etc/rc.d/init.d/CommuniGate start」の操作を行います。
          この操作をすることで、CommuniGate Proが動作をはじめます。
          しばらくすると、「モニター」-「クラスタ」に表示される「NOT READY」の表示が消え、クラスタメンバとして認識される状態になりますので、それまでお待ちください。

      2. 再開したいサーバの管理画面の「設定」-「ヘルパー」-「外部ロードバランサー」のチェックを入れて「更新」ボタンを押します。
          この操作をすることで、ヘルパープログラムが動作開始します。

          なお、ヘルパープログラムの「on」→「off」を行うと、いくつかのアクティブなコネクションが切れることがありますので、通常運用中に不要な「on」→「off」を行うことは避けてください。

      3. 再開したいサーバの管理画面の「設定」-「全般」-「クラスタ」の「クラスタネットワーク」の欄にある「ロードバランサーグループ」で(「A」のロードバランサーグループで運用している場合)「A」を選んで更新する。
          この操作により、WAN側からのパケットがこのサーバにも到着するようになります。
          管理画面の「モニター」-「クラスタ」でバランサーが[A]と表示されていることを確認してください。