Etom Segment

Infla防備録

【Linux】LVS(DSR方式)構築手順書(ldirectord)

LVSLinux上で動くオープンソースの負荷分散システムです。

ldirectordはLVSで構築された実サーバー群のヘルスチェックや
LVSの作動管理を行うデーモンです。ldirectordを使うとLVS
複雑な設定を比較的容易な設定で扱えるようにもなります。

Heartbeatはオープンソースとして開発されているHAクラスタソフトウェアです。
今回はLVS間の冗長化環境を
構築するために使用します。

【要件】
=======================================
LVS VIP:192.168.0.5
LVS Serer01(Active):192.168.0.6
LVS Serer02(Standby):192.168.0.7
・Real Server01(Webサーバ01):192.168.0.1
・Real Server02(Webサーバ02):192.168.0.2
・Default Gateway:192.168.0.254
・Weight(Real Server):50:50(Round Robin)
・パケット転送方式:DSR
LVS HA:Heartbeat
=======================================

f:id:etomsegment:20130823022625j:plain

 

LVS側設定

事前準備
# sysctl -p
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key error: "net.bridge.bridge-nf-call-iptables" is an unknown key error: "net.bridge.bridge-nf-call-arptables" is an unknown key

上記エラーが出力された場合
# /sbin/modprobe bridge

再度確認
# sysctl -p

ipvsadmインストール
# yum -y install ipvsadm

heartbeat,ldirectordインストール

# cd /tm
# wget http://sourceforge.jp/frs/redir.php?m=iij&f=%2Flinux-ha%2F55568%2Fpacemaker-1.0.12-1.1.el6.x86_64.repo.tar.gz

or

# wget http://sourceforge.jp/projects/linux-ha/downloads/55568/pacemaker-1.0.12-1.1.el6.x86_64.repo.tar.gz/

※いずれも不可の場合は、ローカルに落としwinscp等でファイル転送

# tar zxvf pacemaker-1.0.12-1.1.el6.x86_64.repo.tar.gz
# cd pacemaker-1.0.12-1.1.el6.x86_64.repo
# yum -c pacemaker.repo -y install heartbeat heartbeat-ldirectord

heartbeat設定
# cp /usr/share/docs/heartbeat-3.0.5/ha.cf /etc/ha.d/
# cp /usr/share/docs/heartbeat-3.0.5/authkeys /etc/ha.d/
# cp /usr/share/docs/heartbeat-3.0.5/haresoureces /etc/ha.d/


heartbeat設定ファイル編集

# vi /etc/ha.d/ha.cf
===========================
logfile /var/log/ha-log
logfacility     local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
ucast eth0 192.168.0.7
auto_failback on
node    lvs01    lvs02
ping 192.168.0.254
===========================
※ucastは相手(active/standby)のIPアドレス
※node名はactive機から順に記載
※pingはネットワークの状態正常性を確認するためにDefaultGatewayを指定

起動リソース(haresoureces)の設定
# vi /etc/ha.d/haresoureces
========================================================
lvs01     192.168.0.5     ldirectord
========================================================
※active機のホスト名、VirtualIPアドレスを記述。最後にheartbeat起動時に同時起動させるサービスを指定

LVS間の認証方法(通信)を設定
# vi /etc/ha.d/authkeys
===========================
auth 1
1 crc
#2 sha1 HI!
#3 md5 Hello!

===========================

heartbeat起動
# /etc/init.d/heartbeat start
# chkconfig heartbeat on

694番(ha-cluster)ポート開放
# iptables -A INPUT -p udp -m udp --dport 694 -j ACCEPT
# /etc/init.d/iptables save

以上でheartbeatの設定は完了
ha.cfのucast項目以外の各設定ファイル値はactive機、standby機で統一


ldirectord設定
# cp /usr/share/doc/ldirectord-3.9.2/ldirectord.cf   /etc/ha.d/
# vi /etc.ha.d/ldirectord.cf
===================
# Global Directives
checktimeout=3
checkinterval=1

#fallback=127.0.0.1:80
#fallback6=[::1]:80
autoreload=yes
logfile="/var/log/ldirectord.log"
#logfile="local0"
#emailalert="admin@x.y.z"
#emailalertfreq=3600
#emailalertstatus=all quiescent=no
# Sample for an http virtual service
        virtual=192.168.0.5:80
        real=192.168.0.6:80 gate
        real=192.168.0.7:80 gate
        service=http
        scheduler=rr
        #persistent=600
        #netmask=255.255.255.255
        protocol=tcp
        checktype=negotiate
        checkport=80
        request="index.html"
#       receive="Test Page"
#       virtualhost=www.x.y.z

        virtual=192.168.0.5:443
        real=192.168.0.6 gate
        real=192.168.0.7 gate
        service=https
        scheduler=rr
        protocol=tcp
        checktype=negotiate
        checkport=443
        request="index.html"


        virtual=192.168.0.5:3306
        real=192.168.0.6:3306 gate
        real=192.168.0.7:3306 gate
        scheduler=rr
        protocol=tcp
        checktype=connect
        checkport=3306

===================
※gateはパケット転送方式としてDirect Server Return (DSR)を表す
※設定確認のため、振り分けはrr(ラウンドロビン)としている


□リアルサーバー側(Webサーバ01,02)設定
linuxの場合下記のポリシー(LVSからのアクセス許可)を設定する必要がある
ロードバランサから送られたパケットを処理できるようにiptablesの設定を行う。
# iptables -t nat -A PREROUTING -p tcp -m tcp -d 192.168.0.5 --dport 80 -j REDIRECT --to-ports 80

# iptables -t nat -A PREROUTING -p tcp -m tcp -d 192.168.0.5 --dport 443 -j REDIRECT --to-ports 443


※ポート番号は利用するサービス毎に変更

[オプション]
-t nat :NATチェインにルールを設定する
-A PREROUTING :パケットを処理する前の段階でNATを実施する
-d 192.168.0.5 - -dport 80 :ldバランサの仮想IPアドレスのポート80へのパケットを処理する
-j REDIRECT - -to-ports 80 :自ホストの80番ポートでNATをかけて転送する


iptables設定保存
# /etc/init.d/iptables save

パケットの転送処理を行えるようにします。
# vi /etc/sysctl.conf

sysctl.confファイルに以下を記述します。
net.ipv4.ip_forward=1



□再びLVS側設定
LVSとして機能するか確認
# /etc/init.d/ldirectord start
# chkconfig ldirectord on
# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.5:80 rr
  -> 192.168.0.6:80              Route   1      0          0
  -> 192.168.0.7:80              Route   1      0          0
TCP  192.168.0.5:443 rr
  -> 192.168.0.6:443             Route   1      0          0
  -> 192.168.0.7:443             Route   1      0          0

TCP  192.168.0.5:3306 rr
  -> 192.168.0.6:3306             Route   1      0          0
  -> 192.168.0.7:3306             Route   1      0          0

上記結果のみではなく、外(クライアント)からも確認する。
(例)
# curl http://vip/
# curl https://vip/

正常にバランシングされていれば構築完了



【※LVS、RealServerの状態変化をメール通知させる場合※】

□Heartbeat 状態変化メール通知設定
LVSへmailxをインストール
# yum -y install mailx

※mailxは/etc/ha.d/resource.d/MailToを実行させるのに必要なモジュール

/etc/ha.d/haresourcesを編集(追加記述)
# vi /etc/ha.d/haresources
===========================
lvs01     MailTo::root
===========================

rootのaliasesを設定
# cp /etc/aliases /etc/aliases.org
# vi /etc/aliases
==========================================
root:          test@example.com      ←通知用メールアドレスを指定
==========================================

aliacesの再構築
# newaliases

heartbeat再起動
# /etc/init.d/heartbeat restart


□Ldirectord 状態変化メール通知設定(リアルサーバー状態変化通知)
ldirecrotd設定ファイル編集
# vi /etc/ha.d/ldirectord.cf
===========================
# Global Directives
checktimeout=3
checkinterval=1
#fallback=127.0.0.1:80
#fallback6=[::1]:80
autoreload=yes
logfile="/var/log/ldirectord.log"
#logfile="local0"
emailalert="root"     ←コメントアウト解除し、宛先へrootを指定
emailalertfreq=3600   ←コメントアウト解除し、通知間隔を指定
#emailalertstatus=all
quiescent=no

===========================
※上記値の場合、リアルサーバーの参加、削除、重み変更等の状態変化があった際
  root宛にメールを飛ばす。復旧しない場合、5分おき(3600秒毎)にメール配信する。

rootのaliasesについては、”□Heartbeat 状態変化メール通知設定”で記載しているためここでは省く。

[schedulerのオプション]
・rr(ラウンドロビン):実サーバへ順番にリクエストを転送する
・wrr(重み付けに応じたラウンドロビン):実サーバに、<weght>指定した重みでリクエストを転送する
・lc(最小コネクション):最小接続数の実サーバにリクエストを転送する
・wlc(重み付けに応じた最小コネクション):実サーバに、<weight>指定した重みと最小接続数を
                                                                考慮してリクエストを転送する。

・lblc(ロケーションベースの最小コネクション):最小接続数で実サーバへリクエストを転送する。
                                                                     ただし同一クライアントからは同じ実サーバへ
                                                                     リクエストを転送する。
・lblcr(ロケーションベースの最小コネクション):lblcと同様のポリシーでリクエストを転送するが、
                                                                      負荷が高くなった場合は、リクエストを転送する
                                                                      実サーバを言って期間切り替えて処理する。

・dh(接続先ハッシュ):接続先IPから計算したハッシュ値に基づいて、リクエストを転送する。
・sh(送信先ハッシュ):送信元クライアントのIPから計算したハッシュ値に基づいて、リクエストを転送する。
sed(応答速度):最も応答が早いサーバにリクエストを転送する。
・nq(アイドルサーバ優先):アイドル中の実サーバがある場合は、そのサーバにリクエストを転送する。