LVSを使ってMySQLへのロードバランシング

1.なんとなく・・・
 今更なんですが keepalivedは使った事がなかったので、keepalived + ipvsadm でLVSを使ってMySQLサーバのLB環境を作ってみた。

2.環境や前提など
構成は以下のような感じになります。LBのVIPとして172.17.3.11を割り当てます。

Client --> LB(172.17.3.10/VIP:172.17.3.11)  ---> MySQL1(172.17.3.21)
               +-> MySQL2(172.17.3.22)

 ※OSはCentOS 4.4を利用
 ※MySQLサーバは既に起動されていること。
 ※LBサーバからはMySQLコマンドにて接続可能な状態であること。

3.LBサーバのモジュールをインストール
 1.ipvsadmをインストール

# yum install ipvsadm

 2.keepalivedのインストール

# wget http://www.keepalived.org/software/keepalived-1.1.19.tar.gz
tar で展開して・・・
# ./configure --with-kernel-dir=/usr/src/kernels/2.6.9-42.0.3.EL-i686
# make してインストール

* symlink の作成
 /etc/sysconfig/keepalived -> /usr/local/etc/sysconfig/keepalived
 /etc/keepalived -> /usr/local/etc/keepalived/

* 起動スクリプトの配置
 ダウンロードしたソースコードにあるファイルをコピーする。
 keepalived-1.1.19]/keepalived/etc/init.d/keepalived.rh.init /etc/init.d/keepalived

 daemon keepalived -D の箇所を以下のように変更する。
 /usr/local/sbin/keepalived -D

* パーミッション付与
 # chmod 755 /etc/init.d/keepalived

4.keepalivedの設定
 1.起動オプションの変更
   ファイル:/etc/sysconfig/keepalived

KEEPALIVED_OPTIONS="-D -P -C"

 2.設定ファイルの記述
   ファイル:/etc/keepalived/keepalived.conf

vrrp_instance vip_mysqld {
    state BACKUP
    interface eth0
    grap_master_delay 5
    virtual_router_id 1
    priority 100
    nopreempt 
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass secret
    }
    virtual_ipaddress {
        172.17.3.11/24 dev eth0
    }
}
virtual_server 172.17.3.11 3306 {
    delay_loop  3
    lvs_sched   rr
    lvs_method  DR
    protocol    TCP
    real_server 172.17.3.21 3306 {
        TCP_CHECK {
            connect_port 3306
            connect_timeout 30
        }
    }
    real_server 172.17.3.22 3306 {
        TCP_CHECK {
            connect_port 3306
            connect_timeout 30
        }
    }
}

5.keepalivedの起動と確認

# /etc/init.d/keepalived start
Starting Keepalived for LVS:

  確認
  # ip show addr

eth0: <BROADCAST,MULTICAST,UP> mtu 1500 **********
link/ether ******
inet 172.17.3.10/24 brd 172.17.3.255 scope global eth0
inet 172.17.3.11/24 scope global secondary eth0    ←登録されている

  # /etc/init.d/keepalived stop    (一応停止)

6.MySQLサーバ側の設定(2台共に同一内容)
  ◯ループバックデバイスにVIPを登録する。

  ファイル:/etc/sysconfig/network-scripts/ifcfg-lo:0
  内容:

DEVICE=lo:0
IPADDR=172.17.3.11
NETMASK=255.255.255.255
NETWORK=172.17.3.0
BROADCAST=172.17.3.255
ONBOOT=yes
NAME=loopback

  ※lo:0 を有効
      # ifup lo:0

  確認
  # ip show addr

1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
    inet 172.17.3.11/32 brd 172.17.3.255 scope global lo:0  ← 登録されている。

  ◯ARPの問題を解決する。

   ファイル:/etc/sysctl.conf
   以下の2行を追加

net.ipv4.conf.eth0.arp_ignore=1
net.ipv4.conf.eth0.arp_announce=2

   設定を有効にする。
   # sysctl -p

7.起動と確認(LB側にて)
  起動
  # /etc/init.d/keepalived start
  確認
  # ipvsadm -Ln

IP Virtual Server version 1.2.0 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.17.3.11:3306 rr
  -> 172.17.3.21:3306             Route   1      0          0         
  -> 172.17.3.22:3306             Route   1      0          0 

8.クライアント側から確認
   %  mysql -h 172.17.3.11 -u testid --password=testpass
   ・・・
   mysql>

この時にLBにて以下のコマンドにて接続している状況が確認できます。
        # ipvsadm -Ln

IP Virtual Server version 1.2.0 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.17.3.11:3306 rr
  -> 172.17.3.21:3306             Route   1      1          0         
  -> 172.17.3.22:3306             Route   1      0          0    

以上非常に簡単にできましたが以下のサイトを見ないと苦戦したかもです。

http://viz.is-a-geek.com/~viz/cw/index.php?LVS#r3ce30ce
http://blog.technology-knowledge.jp/2008/05/12/158/
http://d.hatena.ne.jp/yoshifumi1975/20070731/p1