Linux Virtual Server
LVS(Linux Vertual Server)に挑戦
CentOS5.2はkernelに既に組み込まれている
# grep IP_VS_VERSION_CODE /usr/src/kernels/`uname -r`-i686/include/net/ip_vs.h kernelソースを指定する部分は適宜修正する必要あり #define IP_VS_VERSION_CODE 0x010201
IPVS
IPVSはLVSの中心的なソフト
ipvsadmのインストールと設定
ipvsadmはipvs管理ツール
CentOSのyumでもインストールできるがバージョンアップされているのでソースからインストール
# wget http://www.linux-vs.org/software/kernel-2.6/ipvsadm-1.24.tar.gz # tar zxvf ipvsadm-1.24.tar.gz # cd ipvsadm-1.24 # ln -s /usr/src/kernels/`uname -r`-`uname -m` /usr/src/linux ←おまじない(笑 # make # make installipvsadmのMakefileは/usr/src/linuxにkernelソースがあることが前提になっているのでおまじないが必要
ipvsadmだけで負荷分散は可能
# ip addr add 122.213.181.239 label eth0:239 dev eth0 # ip addr show eth0 # ipvsadm -C # ipvsadm -A -t <VIP>:<ポート> -s <バランスアルゴリズム> # ipvsadm -a -t <VIP>:<ポート> -r <リアルサーバーIPアドレス> <転送方法> ←必要台数分 # ipvsadm -Lnで確認
DSR時にはノードサーバーに以下の設定
iptables -t nat -A PREROUTING -d 仮想IPアドレス -j REDIRECTノード側では仮想IPアドレスを受け付けるようにする必要あり
これでサーバーの負荷分散が出来る…
アンインストール
アンインストールはない!
インストールされたファイルを削除する!
ipvsadmコマンドオプション
# ipvsadm --help ipvsadm v1.24 2005/12/10 (compiled with popt and IPVS v1.2.1) Usage: ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] ipvsadm -D -t|u|f service-address ipvsadm -C ipvsadm -R ipvsadm -S [-n] ipvsadm -a|e -t|u|f service-address -r server-address [options] ipvsadm -d -t|u|f service-address -r server-address ipvsadm -L|l [options] ipvsadm -Z [-t|u|f service-address] ipvsadm --set tcp tcpfin udp ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid] ipvsadm --stop-daemon state ipvsadm -h Commands: Either long or short options are allowed. --add-service -A add virtual service with options --edit-service -E edit virtual service with options --delete-service -D delete virtual service --clear -C clear the whole table --restore -R restore rules from stdin --save -S save rules to stdout --add-server -a add real server with options --edit-server -e edit real server with options --delete-server -d delete real server --list -L|-l list the table --zero -Z zero counters in a service or all services --set tcp tcpfin udp set connection timeout values --start-daemon start connection sync daemon --stop-daemon stop connection sync daemon --help -h display this help message Options: --tcp-service -t service-address service-address is host[:port] --udp-service -u service-address service-address is host[:port] --fwmark-service -f fwmark fwmark is an integer greater than zero --scheduler -s scheduler one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq, the default scheduler is wlc. --persistent -p [timeout] persistent service --netmask -M netmask persistent granularity mask --real-server -r server-address server-address is host (and port) --gatewaying -g gatewaying (direct routing) (default) --ipip -i ipip encapsulation (tunneling) --masquerading -m masquerading (NAT) --weight -w weight capacity of real server --u-threshold -x uthreshold upper threshold of connections --l-threshold -y lthreshold lower threshold of connections --mcast-interface interface multicast interface for connection sync --syncid sid syncid for connection sync (default=255) --connection -c output of current IPVS connections --timeout output of timeout (tcp tcpfin udp) --daemon output of daemon information --stats output of statistics information --rate output of rate information --exact expand numbers (display exact values) --thresholds output of thresholds information --persistent-conn output of persistent connection info --sort sorting output of service/server entries --numeric -n numeric output of addresses and ports
ipvs shedulerについて
shedulerとはipvs分散方法のこと
分類 | 意味 |
---|---|
rr(round robin) | 順番に分散 |
wrr(weighted round robin) | 重み付けの割合に従って順番に分散 |
lc(least connected) | 接続数が一番少ないリアルサーバーに接続させる |
wlc(weighted least connection) | (デフォルト)重み付けの割合に従って接続数が一番少ないサーバーに接続させる |
lblc(a persistent memory algorythm) | 透過型cache proxyにのみ適用可能 |
sh(sorce hash) | ソースIPアドレスを元に分散先を決める、同じソースIPからの接続は同じリアルサーバーに接続される |
dh(destination hash) | 宛先IPアドレスを元に分散先を決める |
w(weight) | 重み付けの割合のみで分散 |
keepalived
- keepalivedはヘルスチェックとVRRPが利用できる
- ipvsの機能を利用できるのでipvsadmを利用せずにkeepalivedのみで負荷分散設定が可能
- ipvsadmでは負荷分散できてもヘルスチェック機能がないのでリアルサーバーがこけてもパケットを転送し続ける。keepalivedのヘルスチェックを利用することでリアルサーバー停止時にipvs側設定から停止サーバーへの転送を制御できる
- SorryServer機能が使える
- .confファイルにInclude書式がない…これは痛い
インストール
# wget http://www.keepalived.org/software/keepalived-1.1.15.tar.gz # tar zxvf keepalived-1.1.15.tar.gz # cd keepalived-1.1.15 # ./configure # make # make install /usr/local/etc/の下にkeepalived用の各種ファイルが生成される initスクリプトもある
幸せになれない…
アンインストール
インストールされたファイルを削除してくれます
これでテスト的に出来るかな
# make uninstall
設定
- keepalivedの設定ファイルはかなり面倒
- 大文字小文字を認識しているので要注意!
- マニュアルに色々記述あり
lvs_sync_daemon_interface インターフェース名 | アクティブなコネクションをフェールオーバー時に引き継ぐ |
vrrp_sync_group | VRRPインターフェースをグループ化してインスタンスを同期してくれる |
- sorry_serverのIPをVRRPのIPにするとそのホストでもiptables等を駆使してパケットを受け付けるようにしないといけないっぽい。大変なので、別サーバーを立てるのが吉
- keepalivedのVRRPを利用して冗長化しておけば仮想IPについてはMaster/Standby構成が可能
vrrpセクションを同一にしておく必要がある
- vrrpとipvs分を別ファイルで別スクリプトで管理すると吉
CentOSのinitスクリプト
- initスクリプトはインストールされるが、keepalived自体の制御となる
- vrrpとipvsを別々にサービス登録して管理したい場合はinitスクリプトを分ける必要がある
- 分けた場合はスクリプトを修正する必要がある
pidファイル名はkeepalivedが制御している??–vrrpdの場合はkeepalived_vrrp.pidで–checkの場合はkeepalived_checkers.pid- ソースのinclude/pidfile.hでpidファイル名が定義されている
サンプルはこんな感じ
# cd /usr/local/etc/rc.d/init.d/ # cp -p keepalived vrrpd # vi vrrpd ここで編集(下記参照) # cp -p vrrp ipvsd # sed -i "s/vrrp/ipvs/g" ipvsd # vi ipvsd daemon行の--ipvsを--checkに修正 pidfile指定を/var/run/keepalived_checkers.pidに修正 # ln -s /usr/local/etc/rc.d/init.d/vrrpd /etc/rc.d/init.d/vrrpd # ln -s /usr/local/etc/rc.d/init.d/ipvsd /etc/rc.d/init.d/ipvsd # chkconfig --add vrrpd # chkconfig --add ipvsd # chkconfig vrrpd on # chkconfig ipvsd on (↓initスクリプトはこれ) #!/bin/sh # # Startup script for the Keepalived daemon # # processname: keepalived # pidfile: /var/run/keepalived_vrrp.pid # config: /usr/local/etc/keepalived/vrrpd.conf # chkconfig: - 21 79 # description: Start and stop Keepalived # Source function library . /etc/rc.d/init.d/functions # Source configuration file (we set KEEPALIVED_OPTIONS there) . /usr/local/etc/sysconfig/keepalived RETVAL=0 prog="keepalived_vrrpd" CONFIG="/usr/local/etc/keepalived/vrrpd.conf" pidfile="/var/run/keepalived_vrrp.pid" start() { echo -n $"Starting $prog: " daemon /usr/local/sbin/keepalived ${KEEPALIVED_OPTIONS} --vrrp -f ${CONFIG} RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog } stop() { echo -n $"Stopping $prog: " ##killproc keepalived killproc -p ${pidfile} RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog } reload() { echo -n $"Reloading $prog: " ##killproc keepalived -1 killproc -p ${pidfile} -1 RETVAL=$? echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; reload) reload ;; restart) stop start ;; condrestart) if [ -f /var/lock/subsys/$prog ]; then stop start fi ;; status) status -p ${pidfile} ${prog} ;; *) echo "Usage: $0 {start|stop|reload|restart|condrestart|status}" exit 1 esac exit $RETVALでも、reload()はなんか使えない..
sysconfig/keepalived
- sysconfig/keepalivedには基本設定が記述
- 規定で-Dのみが記載、/var/log/messagesに大量ログを出す
- 運用方法にもよるが-S 5としてlocal facility 5としてログ出力させるのがよさげ
- -Sを利用した場合はsyslog.confの設定変更とlogrotateの設定変更を忘れずに!
snmp
LVS用SNMPの話ここ
元のソースがあったページは既に存在しないそうだ…
# wget http://www.loadbalancer.org/download/SNMP/net-snmp-lvs-module-0.0.4.tar.gz # tar zxvf net-snmp-lvs-module-0.0.4.tar.gz # cd net-snmp-lvs-module-0.0.4 # cp /usr/local/src/ipvsadm-1.24/libipvs/* libipvs/ ipvsadmのライブラリが必要だそうだ。既にあるのは上書きしない! # make /usr/src/linuxにkernelソースが存在していること (ipvsadmのインストールでシンボリック作成済みのはず) # cp *-MIB.txt /usr/share/snmp/mibs/ # cp lvs.so /usr/lib/netsnmplvs.so # vi /etc/snmp/snmpd.conf dlmod lvs /usr/lib/libnetsnmplvs.so ←追加 # service snmpd restart
試してみる
# snmptranslate -m LVS-MIB -On -IR lvsServiceEntry # snmpwalk -c public -v 2c -m LVS-MIB localhost 1.3.6.1.4.1.8225.4711