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/keepaliveddaemon 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