その他
    ホーム 技術発信 DoRuby keepalivedとpoundでサーバ冗長化(LB編)

    keepalivedとpoundでサーバ冗長化(LB編)

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    こんにちは。サンドリバー砂川です。

    プロジェクトで冗長構成のサーバを構築する際
    keepalivedとIPVSだと、kernel等のバージョンに気を配らなければならないので結構面倒です。
    そこで最近は、IPVSの代わりにpoundを使って手軽に冗長化してたりします。
    今回はkeepalivedとpoundを使って冗長化する方法を掲載します。

    ※今回はLB編なのでpoundが出てきません。
    poundの方を知りたい方は、数日中に記事を書くのでもうしばらくお待ちください。
    この記事で使用するソフト
    keepalived

    サーバIP例

    • LB01(master) 10.0.0.10
    • LB02(backup) 10.0.0.11
    • virtual IP(vip) 10.0.0.30

    各サーバは2台以上でも可能ですが、今回は簡潔にするために2台で構築します。

    LB01,02共通の作業

    keepalivedインストール

    IPVSとkeepalivedを連携させて冗長化をする場合、kernelのバージョン等に注意しなければなりません。しかし今回負荷分散部分はpoundに任せるため、単純にコンパイルするだけでOKです。

    # cd /usr/local/src
    # wget http://www.keepalived.org/software/keepalived-1.1.19.tar.gz
    # tar zxvf keepalived-1.1.19.tar.gz
    # cd keepalived-1.1.19
    # ./configure
    .
    .
    .
    Use VRRP Framework       : Yes
    .
    .
    

    configure結果に上が出力されていればOK。コンパイルします。

    # make
    # make install
    

    keepalived設定

    LB01の/etc/keepalived/keepalived.confを以下のように記述

    ! Configuration File for keepalived
    
    global_defs {
       notification_email { #フェイルオーバー発生時に送るメールの宛先等を設定
         example@kbmj.com
       }
       notification_email_from example@kbmj.com
       smtp_server localhost
       smtp_connect_timeout 30
    }
    
    vrrp_instance WEB {
        state MASTER #マスターかバックアップかを設定
        interface eth0
        smtp_alert
        virtual_router_id 2 #同じidを持つサーバ間で死活監視を行うので、LB01、02共に同じ数字を設定
        priority 100 #priorityが高いサーバから順にマスター設定される
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111 #LB01、02で共通のものを設定
        }
        virtual_ipaddress {
            10.0.0.30/24 #使用するvipを設定
        }
    }
    

    LB02の/etc/keepalived/keepalived.confも、基本的にLB01と同じですが、一部をBACKUP用の設定に書き換える必要があります。

    state MASTER →state BACKUP
    priority 100 → priority 50
    

    LB01、02共にkeepalived.confを設定し終えたら、試しにkeepalivedを起動してみます。
    両方のサーバで以下のコマンドを入力

    # /usr/sbin/keepalived start
    

    動作チェック

    # ip addr show
    LB01
    inet 10.0.0.10/24 brd 10.0.0.255 scope global eth0
    inet 10.0.0.30/24 scope global secondary eth0
    
    LB02
    inet 10.0.0.11/24 brd 10.0.0.255 scope global eth0
    

    LB01のeth0インタフェースにvip(10.0.0.30)が割り振られているのが分かります。
    この状態で10.0.0.30にpingを打つと、LB01にパケットが届きます。
    今度は冗長化をテストする為にLB01のkeepalivedを停止してみます。
    LB01で

    # /usr/sbin/keepalived stop
    
    # ip addr show
    LB01
    inet 10.0.0.10/24 brd 10.0.0.255 scope global eth0
    
    LB02
    inet 10.0.0.11/24 brd 10.0.0.255 scope global eth0
    inet 10.0.0.30/24 scope global secondary eth0
    

    LB02のkeepalivedがマスターとなり、LB02のeth0インタフェースにvipが割り振られました。
    この状態で10.0.0.30にpingを打つと、LB02にパケットが届きます。
    今度は再びLB01のkeepalivedを起動してみます。

    LB01で

    # /usr/sbin/keepalived start
    
    # ip addr show
    LB01
    inet 10.0.0.10/24 brd 10.0.0.255 scope global eth0
    inet 10.0.0.30/24 scope global secondary eth0
    
    LB02
    inet 10.0.0.11/24 brd 10.0.0.255 scope global eth0
    

    LB01の方がpriorityの設定値が高いため、再びLB01にvipが割り振られました。
    これで、vipでアクセスすればLBサーバが両方ともダウンしていない限り、生きているほうにアクセスできるということになります。
    LBサーバが冗長化されました。

    次回はpoundを使ったwebサーバの負荷分散と冗長化、keepalivedとの連携について書く予定です。