KeepAlived系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.htmlhtml
本文只给出几个keepalived+lvs(VS/DR模式)的配置示例,关于keepalived的配置文件说明见:高可用之KeepAlived(一):基本概念和配置文件分析。web
在实验开始前,须要说明几点:vim
实验环境以下:bash
RS上操做:服务器
yum -y install httpd echo "rs1:192.168.100.49" > /var/www/html/index.html # RS1上操做 echo "rs1:192.168.100.50" > /var/www/html/index.html # RS2上操做 service httpd start echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce ifconfig lo:0 192.168.100.10/32 up route add -host 192.168.100.10 dev lo route add default gw 192.168.100.51
Router上操做:负载均衡
echo 1 >/proc/sys/net/ipv4/ip_forward
Director上操做:oop
[root@xuexi ~]# route del default
[root@xuexi ~]# route add default gw 192.168.100.51
[root@xuexi ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@xuexi ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_1
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 12345678
}
virtual_ipaddress {
192.168.100.10/32 dev eth0 label eth0:0
}
}
virtual_server 192.168.100.10 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
protocol TCP
real_server 192.168.100.49 80 {
weight 2
TCP_CHECK {
connect_port 80
connect_timeout 1
nb_get_retry 2
delay_before_retry 1
}
}
real_server 192.168.100.50 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 1
nb_get_retry 2
delay_before_retry 1
}
}
}
测试是否能实现链接的负载均衡。性能
KeepAlived经过vrrp的冗余路由切换协议实现高可用功能,主要用于lvs Director的高可用。测试
在配置KeepAlived高可用功能时,须要注意如下几点:网站
实验环境以下:
RS一、RS二、Router、director_lvs(master)和前文实验的配置一致,不需修改。所以,只需提供director_lvs(backup)的配置文件便可。
如下是master上的操做。
[root@xuexi ~]# route del default
[root@xuexi ~]# route add default gw 192.168.100.51
[root@xuexi ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@xuexi ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_2 # 和master不一样
}
vrrp_instance VI_1 { # 和master相同
state BACKUP # 和master不一样
interface eth0
virtual_router_id 51 # 和master相同
priority 50 # 和maste不一样
advert_int 1
authentication {
auth_type PASS # 和master相同
auth_pass 12345678 # 和master相同
}
virtual_ipaddress {
192.168.100.10/32 dev eth0 label eth0:0
}
}
virtual_server 192.168.100.10 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
protocol TCP
real_server 192.168.100.49 80 {
weight 2
TCP_CHECK {
connect_port 80
connect_timeout 1
nb_get_retry 2
delay_before_retry 1
}
}
real_server 192.168.100.50 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 1
nb_get_retry 2
delay_before_retry 1
}
}
}
启动两Director,查看是否只有master上设置了VIP。注意:ipvs规则在master和backup上都设置了,但因为backup没有VIP,所以backup设置的ipvs规则暂时是没有意义的。当backup切换为master状态时,只会设置VIP。
而后查看master是否已经生效。生效后,将master断开。观察原来的backup切换为master的日志:
Mar 1 20:52:19 xuexi Keepalived_vrrp[4709]: VRRP_Instance(VI_1) Transition to MASTER STATE
Mar 1 20:52:20 xuexi Keepalived_vrrp[4709]: VRRP_Instance(VI_1) Entering MASTER STATE
Mar 1 20:52:20 xuexi Keepalived_vrrp[4709]: VRRP_Instance(VI_1) setting protocol VIPs.
Mar 1 20:52:20 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar 1 20:52:20 xuexi Keepalived_vrrp[4709]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 192.168.100.10
Mar 1 20:52:20 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar 1 20:52:20 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar 1 20:52:20 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar 1 20:52:20 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar 1 20:52:25 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar 1 20:52:25 xuexi Keepalived_vrrp[4709]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 192.168.100.10
Mar 1 20:52:25 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar 1 20:52:25 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar 1 20:52:25 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar 1 20:52:25 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
能够看到,切换速度极快(1秒之内)。
再测试将原来的master(高优先级)启动,发现它再次成为master,切换速度也是极快。
将RS1上的httpd中止。再查看主、备director上的ipvs规则。
[root@xuexi ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.100.10:80 wrr
-> 192.168.100.50:80 Route 1 0 0
发现master和backup两边都把不健康的RealServer1节点给踢出去了。由此能够知道,健康检查是master和backup都会循环进行的,并非只有master进行检查。
再将RS1上的httpd启动。而后查看ipvs规则。发现没过几秒钟就把规则添加回来了。
keepalive的vrrp多实例能够管理多个director和vip,进而能够实现"双主模型"的高可用。
实验环境以下图:
其中Director1的vrrp实例1上是R1的master,vrrp实例2是R2的backup,Director2的vrrp实例1是R1的backup,vrrp实例2是R2的master。
这里略过4个RS的配置步骤(若有问题,参照前文配置RS一、RS2的过程)。
如下是Director1和Director2的keepalived.conf不一样部分和相同部分的内容:
# 如下是两台Director上相同部分的内容
! Configuration File for keepalived |! Configuration File for keepalived
|
global_defs { |global_defs {
router_id LVS_1 | router_id LVS_2
} |}
|
vrrp_instance VI_1 { |vrrp_instance VI_1 {
state MASTER | state BACKUP
interface eth0 | interface eth0
virtual_router_id 51 | virtual_router_id 51
priority 100 | priority 50
advert_int 1 | advert_int 1
authentication { | authentication {
auth_type PASS | auth_type PASS
auth_pass 12345678 | auth_pass 12345678
} | }
virtual_ipaddress { | virtual_ipaddress {
192.168.100.10/32 dev eth0 label eth0:0 | 192.168.100.10/32 dev eth0 label eth0:0
} | }
} |}
# 不一样vrrp实例绑定在同一接口上,vrid必须不能相同 |# 不一样vrrp实例绑定在同一接口上,vrid必须不能相同
vrrp_instance VI_2 { |vrrp_instance VI_2 {
state BACKUP | state MASTER
interface eth0 | interface eth0
virtual_router_id 55 | virtual_router_id 55
priority 50 | priority 100
advert_int 1 | advert_int 1
authentication { | authentication {
auth_type PASS | auth_type PASS
auth_pass 12345678 | auth_pass 12345678
} | }
virtual_ipaddress { | virtual_ipaddress {
192.168.100.11/32 dev eth0 label eth0:1 | 192.168.100.11/32 dev eth0 label eth0:1
} | }
} |}
######################################################################################### # 如下是两台Director上相同部分的内容 virtual_server 192.168.100.10 80 { delay_loop 6 lb_algo wrr lb_kind DR protocol TCP real_server 192.168.100.49 80 { weight 2 TCP_CHECK { connect_port 80 connect_timeout 1 nb_get_retry 2 delay_before_retry 1 } } real_server 192.168.100.50 80 { weight 1 TCP_CHECK { connect_port 80 connect_timeout 1 nb_get_retry 2 delay_before_retry 1 } } } virtual_server 192.168.100.11 80 { delay_loop 6 lb_algo wrr lb_kind DR protocol TCP real_server 192.168.100.57 80 { weight 2 TCP_CHECK { connect_port 80 connect_timeout 1 nb_get_retry 2 delay_before_retry 1 } } real_server 192.168.100.58 80 { weight 1 TCP_CHECK { connect_port 80 connect_timeout 1 nb_get_retry 2 delay_before_retry 1 } } }
分别测试访问两个VIP:http://192.168.100.10
和http://192.168.100.11
。其中前者目前只能调度R1:RS1和R1:RS2,后者只能调度R2:RS1和R2:RS2。将任一Director断开,测试4个RS是否仍能继续提供服务。
若是全部RS都宕了,对于外界来讲就真的没法再访问网站了,这显然不适合。这时能够经过keepalived来配置一个服务页面。例如告诉外界客户端网站正在维护状态,或者只提供一个网站的一个主页面。
通常来讲,由于是在全部RS都宕机的状况下sorry server提供的临时服务才生效,所以一般将sorry server配置在virtual_server中而非real_server中。
配置时,只需在keepalived配置文件的virtual_server段落中添加sorry_server指令便可。而且,若是启用了vrrp的高可用,应该在master和backup节点上都加上sorry server。
virtual_server 192.168.100.10 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
protocol TCP
sorry_server 127.0.0.1 80
重启keepalived后,再在每一个vrrp机器上配置好httpd。
yum -y install httpd echo "web Maintenancing" >/var/www/html/index.html service httpd start
而后将全部的RS节点的httpd服务停掉。再看keepalived上的ipvs规则,发现已经将VIP做为规则添加进来了,因而下次访问VIP时将调度这台sorry server。当某一台RS恢复的时候,ipvs规则又会变动为RS的节点。
对于集群系统不大的状况下,LVS Director通常会比较空闲,这样就比较浪费资源。这时一般会将LVS Director自身也做为一个RS,一边提供web服务,一边提供调度功能,不过应该将它的调度权重设置低一点,以避免影响负载均衡的性能。这称为local RS,local RS的RIP能够写Director上的任意地址(127.0.0.1均可以)。例如:
real_server 127.0.0.1 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 1
nb_get_retry 2
delay_before_retry 1
}
}
local RS和sorry server不该该同时设置,由于若是local RS坏了,sorry server确定没法被调度到。