使用IPVS分发MySQL读请求
在MySQL的部署场景中,经常使用HAproxy和ipvs来作为读请求转发的网关.
ipvs的好处在于本身不需要daemon的方式来运行,而是直接作为kernel的服务来提供;
当ipvs和应用程序服务器在同一网段时,可以使用DR模式,这样可以避免在返回
数据时还需由网关来处理.
本例使用了4台Mysql从库,1台主机充当ipvs服务器.
VIP:192.168.10.225
RIP1:192.168.10.145
RIP2:192.168.10.150
RIP3:192.168.10.151
RIP4:192.168.10.180
在ipvs主机上安装ipvs模块,由于系统是2.6.18-194的内核,因此下载了 ipvs 1.4.6的版本
[root@db135 ~]# uname -r
2.6.18-194.el5
[root@db135 ~]#ln -s /usr/src/kernels/2.6.18-194.el5-x86_64/ /usr/src/linux
[root@db135 soft]# cd ipvsadm-1.24
[root@db135 ipvsadm-1.24]# make
[root@db135 ipvsadm-1.24]# make install
检查是否安装成功
[root@db135 ipvsadm-1.24]# ipvsadm --version
ipvsadm v1.24 2005/12/10 (compiled with popt and IPVS v1.2.1)
[root@db135 ipvsadm-1.24]# lsmod | grep ip_vs
ip_vs_rr 35009 1
ip_vs_wrr 35905 0
ip_vs 122113 5 ip_vs_rr,ip_vs_wrr
模块已成功加载
现在开始配置ipvs,先为转发的网卡配置一个虚拟ip
[root@db135 ~]#ifconfig eth0:1 192.168.10.225 netmask 255.255.255.255 up
[root@db135 ~]#route add -host 192.168.10.225 dev eth0:1
清除原来的ipvs配置
[root@db135 ~]#ipvsadm -C
在ipvs上新增一个服务器,使用负载平均分发到后端服务器的策略
[root@db135 ~]#ipvsadm -A -t 192.168.10.225:3307 -s rr
为ipvs新增服务器增加后端真实的服务器
[root@db135 ~]#ipvsadm -a -t 192.168.10.225:3307 -r 192.168.10.145:3307 -g
[root@db135 ~]#ipvsadm -a -t 192.168.10.225:3307 -r 192.168.10.150:3307 -g
[root@db135 ~]#ipvsadm -a -t 192.168.10.225:3307 -r 192.168.10.151:3307 -g
[root@db135 ~]#ipvsadm -a -t 192.168.10.225:3307 -r 192.168.10.180:3307 -g
查看现在的ipvsadm的配置情况
[root@db135 ipvsadm-1.24]# ipvsadm --list
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.225:opsession-prxy rr
-> 192.168.10.140:opsession-prxy Route 1 0 0
-> 192.168.10.150:opsession-prxy Route 1 0 0
-> 192.168.10.151:opsession-prxy Route 1 0 0
-> 192.168.10.180:opsession-prxy Route 1 0 0
在145,150,151和180的机器上分别执行以下命令
[root@c12 ~]# ifconfig lo:0 192.168.10.225 netmask 255.255.255.255 up
[root@c12 ~]# route add -host 192.168.10.225 dev lo:0
[root@c12 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@c12 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@c12 ~]#echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@c12 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
[root@c12 ~]# sysctl -p >/dev/null 2>&1
为了使配置永久生效,建议把配置写入/etc/sysctl.conf的文件中.
至此使用ipvs充当mysql读请求转发网关配置完成,使用sysbenc做压力测试,可以看到客户连接能够均匀的在四台服务器上被分发.
[root@db135 ipvsadm-1.24]# ipvsadm --list
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.225:opsession-prxy rr
-> 192.168.10.140:opsession-prxy Route 1 64 0
-> 192.168.10.150:opsession-prxy Route 1 64 0
-> 192.168.10.151:opsession-prxy Route 1 64 0
-> 192.168.10.180:opsession-prxy Route 1 63 1