【Linux】LVS(DSR方式)構築手順書(ldirectord)
LVSはLinux上で動くオープンソースの負荷分散システムです。
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
=======================================
□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 状態変化メール通知設定”で記載しているためここでは省く。
・rr(ラウンドロビン):実サーバへ順番にリクエストを転送する
・wrr(重み付けに応じたラウンドロビン):実サーバに、<weght>指定した重みでリクエストを転送する
・lc(最小コネクション):最小接続数の実サーバにリクエストを転送する
・wlc(重み付けに応じた最小コネクション):実サーバに、<weight>指定した重みと最小接続数を
考慮してリクエストを転送する。
・lblc(ロケーションベースの最小コネクション):最小接続数で実サーバへリクエストを転送する。