使用脚本实现LVS负载均衡 环境: 3台主机 DS:192.168.100.1 RS1:192.168.100.11 RS2:192.168.100.12 VIP:192.168.100.100 安装ipvsadm ./configure --prefix=/usr/local/ipvsadm make && make install DS脚本如下:
#!/bin/bash # description: start LVS of DirectorServer VIP=192.168.100.100 RIP1=192.168.100.11 RIP2=192.168.100.12 ./etc/rc.d/init.d/functions
logger LVS is $1 case "$1" in start) /sbin/ipvsadm --set 30 5 60 /sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev eth0:0 /sbin/ipvsadm -A -t $VIP:80 -s wrr -p 3 /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g -w 1 /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g -w 1 touch /var/lock/subsys/ipvsadm >/dev/null 2>&1 echo "LVS is started!" ;; stop) /sbin/ipvsadm -C /sbin/ipvsadm -Z ifconfig eth0:0 down ifconfig eth0:1 down route del $VIP route del $VIP rm -rf /var/lock/subsys/ipvsadm >/dev/null 2>&1 echo "LVS is stoped" ;; status) if [ ! -e /var/lock/subsys/ipvsadm ];then echo "ipvsadm has stoped" else echo "ipvsadm has started" fi ;; *) echo "Usage: $0 {start|stop|status}" exit 1 esac exit 0
RS脚本如下:
#!/bin/bash # description: Config realserver lo and apply noarp VIP=192.168.100.100 . /etc/rc.d/init.d/functions case "$1" in start) ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP /sbin/route add -host $VIP dev lo:0 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce sysctl -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) ifconfig lo:0 down route del $VIP >/dev/null 2>&1 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0
LVS+Keepalived实现负载均衡高可用 环境: DS1:192.168.100.1 DS2:192.168.100.2 RS1:192.168.100.11 RS2:192.168.100.12 VIP:192.168.100.100 之前已经安装ipvsadm这里不再阐述 安装keepalived ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.xxxxx make && make install mkdir /etc/keepalived cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ cp /usr/local/keepalived/sbin/keepalived /sbin 配置keepalived.conf DS1:
global_defs { notification_email { root@localhost } notification_email_from root@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL }
vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.100.100 } }
virtual_server 192.168.100.100 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP
real_server 192.168.100.11 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.100.12 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } DS2:
global_defs { notification_email { root@localhost } notification_email_from root@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL }
vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.100.100 } }
virtual_server 192.168.100.100 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP
real_server 192.168.100.11 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.100.12 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 }
两台DS都启动keepalived /etc/init.d/keepalived start 两台RS也需要都运行上文的脚本 ipvsadm -ln 查看LVS状态 ipvsadm -lnc 查看LVS链接状态 可通过一个测试页面进行测试,代码如下(每两秒刷新一次,不缓存数据): 通过不同的客户端访问,页面会轮流出现node1和node2
<html> <head> <title>test</title> <meta HTTP-EQUIV="Cache-Control" CONTENT="no-cache"/> <meta http-equiv="Refresh" content="2"/> </head> <body>this is node1或2</body> </html>
|