maehachi08 Anything Blog

2012年04月08日
IPVSによるロードバランサー構築

ロードバランサーとは

冗長性を高めつつ、負荷分散できないかなぁ。。。
そんな要件を満たす機器がロードバランサーだ!
ロードバランサーの機能自体はアプライアンス機器で実現する場合もあればソフトウェアで実現する場合もある。
アプライアンス機器を導入した場合は専用のチップやチューニングされた専用OSによって高速に処理されるが、価格がうん百万だのうん千万だのと馬鹿げている。
ソフトウェアを導入した場合はIntel、もしくはAMDのCPU搭載サーバにてLinuxを動かし、その上でロードバランサーとして動作するソフトウェアをインストールすることになる。
ソフトウェアで実現する場合、以下のソフトウェアが定番だろうと思う。

  • DNS ラウンドロビン
  • IPVS
  • Apache + mod_proxy_balancer
  • Pound
  • UltraMonkey-L7

今回はIPVSでロードバランサーを構築してみようと思います。

IPVSとは

編集中

構成

構成は以下のような形を想定しています。
IPVSサーバによってリアルサーバweb01(192.168.100.156)とweb02(192.168.100.157)に負荷分散するための仮想サーバ(10.0.0.10)を作成します。

KVMホストのブラウザで http://10.0.0.10 にアクセスした場合にweb01(192.168.100.156)とweb02(192.168.100.157)に均等にアクセスが分散されることを確認します。


|-------------|
| ルーター |
|-------------|
|(192.168.100.1)
|
|
|
|----------------------------------------------------------|192.168.100.0/24
| | | |
| | | |
| | | |
| |192.168.100.200 | |
| |-----------------| | |
| | KVMホスト | | |
| |-----------------| | |
| |10.0.0.1 | |
| | | |
| | | |
| | | |
| 10.0.0.0/24 |-------| | |
| | | |
| | | |
| | | |
| |10.0.0.10 |192.168.100.158 |
| |-----------------| |
| | lb01 | |
| |-----------------| |
| |
| |
| |
| 192.168.100.156 | 192.168.100.157
|-----------------| |-----------------|
| web01 | | web02 |
|-----------------| |-----------------|




## IPVS構築
まず、Linuxカーネルパラメーターの修正を行います。
```bash
# vi /etc/sysctl.conf
(修正前)net.ipv4.ip_forward = 0
(修正後)net.ipv4.ip_forward = 1
# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
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
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296

ipvsadmをインストールします。

# yum install ipvsadm

ipvsadmサーバ起動
# chkconfig ipvsadm on

ipvsadm起動
# service ipvsadm start

ipvsadmサーバだけでロードバランス

実はipvsadmだけでもロードバランスできちゃったりします。

# ipvsadm -C

# ipvsadm -A -t 10.0.0.10:80 -s rr

# ipvsadm -a -t 10.0.0.10:80 -r 192.168.100.156 -m

# ipvsadm -a -t 10.0.0.10:80 -r 192.168.100.157 -m

# ipvsadm -Ln

keepalivedインストール

keepalivedをインストールするのにlibnlパッケージとlibnl-develパッケージがインストール済みであることが前提です。
今回はkeepalivedのソースが格納されたtarボールからRPMパッケージを作成して、RPMでインストールしたいと思います。

# yum install libnl libnl-devel

# cd /usr/local/src

# wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz

# ls -l keepalived-1.2.2.tar.gz
-rw-r--r-- 1 root root 249557 1月 17 07:24 2011 keepalived-1.2.2.tar.gz

# tar xzvf keepalived-1.2.2.tar.gz

# cd keepalived-1.2.2

configureスクリプト実行における注意点は、
-with-kernel-dirオプションを付けないと
ほとんどの機能が有効化されないことです。

あと、--enable-debugオプションを付けることで
デバッグ機能を有効化します。

# ./configure \
-with-kernel-dir=/usr/src/kernels/2.6.32-220.el6.x86_64 \
--enable-debug
 ・
 ・
 ・
Keepalived configuration
------------------------
Keepalived version : 1.2.2
Compiler : gcc
Compiler flags : -g -O2
Extra Lib : -lpopt -lssl -lcrypto -lnl
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
IPVS use libnl : Yes
Use VRRP Framework : Yes
Use Debug flags : Yes


RPMパッケージ作成と実行
# cd /usr/local/src/keepalived-1.2.2
# vi keepalived.spec
(修正前)--with-kernel-dir="/lib/modules/%{kernel}/build"
(修正後)--with-kernel-dir="/usr/src/kernels/2.6.32-220.el6.x86_64"

# make rpm
rpmbuild -ba keepalived.spec
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.zFmN40
 ・
 ・
 ・
Processing files: keepalived-debuginfo-1.2.2-5.x86_64
伸張ファイルの検査中: /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/keepalived-1.2.2-5.x86_64
書き込み完了: /root/rpmbuild/SRPMS/keepalived-1.2.2-5.src.rpm
書き込み完了: /root/rpmbuild/RPMS/x86_64/keepalived-1.2.2-5.x86_64.rpm
書き込み完了: /root/rpmbuild/RPMS/x86_64/keepalived-debuginfo-1.2.2-5.x86_64.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.dxG902
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd keepalived-1.2.2
+ /bin/rm -rf /root/rpmbuild/BUILDROOT/keepalived-1.2.2-5.x86_64
+ exit 0

RPMパッケージのインストール
# rpm -ivh /root/rpmbuild/RPMS/x86_64/keepalived-1.2.2-5.x86_6
4.rpm
準備中... ########################################### [100%]
1:keepalived ########################################### [100%]

【余談】keepalivedをソースインストールした場合の注意点

今回はRPMパッケージからインストールする方法を記載していますが、この過程の最初はソースからインストールしていました。
つまり、configureを実行した後、make;make installコマンドを実行した訳です。
ソースからインストールする場合、configure実行時にprefixオプションを指定しなかった場合、/usr/localが設定されたものとして処理されます。

この時にいくつかのファイルを修正しなければ、eepalivedが起動しなかったので忘れないように書き留めます。

起動スクリプトの修正
# vi /usr/local/etc/rc.d/init.d/keepalived
(修正前)/etc/sysconfig/keepalived
(修正後)/usr/local/etc/sysconfig/keepalived

(修正前)daemon keepalived ${KEEPALIVED_OPTIONS}
(修正後)daemon /usr/local/sbin/keepalived ${KEEPALIVED_OPTIONS}

実行ファイルのシンボリックリンクの配置
# cd /usr/sbin/

# ln -s /usr/local/keepalived/sbin/keepalived keepalived


# ln -s /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/keepalived

# /etc/init.d/keepalived start
keepalived を起動中: [ OK ]

keepalivedが起動すると以下のようなメッセージがmessagesに出力されます。
# tail /var/log/messages
Feb 24 17:46:17 localhost Keepalived: Starting Keepalived v1.2.2 (02/24,2012)
Feb 24 17:46:17 localhost Keepalived: Starting VRRP child process, pid=6931
Feb 24 17:46:17 localhost Keepalived_vrrp: Registering Kernel netlink reflector
Feb 24 17:46:17 localhost Keepalived_vrrp: Registering Kernel netlink command channel
Feb 24 17:46:17 localhost Keepalived_vrrp: Registering gratutious ARP shared channel
Feb 24 17:46:17 localhost Keepalived_vrrp: Configuration is using : 55089 Bytes
Feb 24 17:46:17 localhost Keepalived_vrrp: Using LinkWatch kernel netlink reflector...

keepalived.confの設定

keepalived.confの文法はバージョンによって変わるようですので注意が必要です。 manコマンドなどでkeepalived.confの書き方は確認しましょう。技術評論社から出版されている『サーバ/インフラを支える技術』に記載されたままだと動作しませんでした。
おまけにkeepalived自体は文法チェックを行わないようです。(間違っていたらすみません)
必要な方はkeepalived-checkと調べると別途ツールがあります。

今回の負荷分散構成ではNATでIPアドレス書き換えを行う構成です。
クライアント(ブラウザ)は仮想サーバのIPアドレス(10.0.0.10)にアクセスすることでロードバランサー(lb01)にアクセスします。

ロードバランサー(lb01)は宛先IPアドレスをリアルサーバー(192.168.100系)に変換してweb01またはweb02に転送します。

# cd /etc/keepalived/

# ls -l
合計 8
-rw-r--r-- 1 root root 3562 2月 24 15:19 2012 keepalived.conf
drwxr-xr-x 2 root root 4096 2月 24 15:19 2012 samples

# cp -p keepalived.conf keepalived.conf-orig

# vi keepalived.conf
! Configuration File for keepalived
virtual_server 10.0.0.10 {
    10.0.0.10 80
}


virtual_server 10.0.0.10 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.100.156 {
    weight 1
    HTTP_GET {
        url {
            path /index.html
            status_code 200
        }

        connect_port 80
        connect_timeout 5
    }
}

real_server 192.168.100.157 {
    weight 1
    HTTP_GET {
        url {
            path /index.html
            status_code 200
        }

        connect_port 80
        connect_timeout 5
    }
}

keepalived.confの起動

自動起動をonにします。
# chkconfig keepalived on

サービスを起動します。
# service keepalived start

ロードバランサーの設定を確認します。
# ipvsadm -Ln