LVS架构中,不管是NAT模式还是DR模式,当后端的RS宕掉时,调度器依然会把请求转发到宕掉的RS上,这样的结果并不是我们想要的。其实,keepalived就可以解决该问题,它不仅仅有高可用的功能,还有负载均衡的功能。在调度器上只要安装了keepalived,就不用再安装ipvsadm了,也不用去编写LVS相关的脚本了,也就是说keepalived已经嵌人了LVS功能。完整的keepalived+LVS架构需要有两台调度器实现高可用,提供调度服务的只需要一台,另外一台作为备用。
| 节点规划 | 服务器名 | IP | VIP |
|---|---|---|---|
| 调度器 | keepalived | 192.168.200.130 | 192.168.200.110 |
| 真实服务器1 | rs1 | 192.168.200.131 | 192.168.200.110 |
| 真实服务器2 | rs2 | 192.168.200.132 | 192.168.200.110 |
1.安装keepalived
如未安装keepalived,则需要先安装keepalived
# yum install -y keepalived
接着编辑keepalived的配置文件:
# > /etc/keepalived/keepalived.conf //清空配置文件# vim /etc/keepalived/keepalived.conf //添加内容如下vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.200.110}}virtual_server 192.168.200.110 80 { #VIPdelay_loop 10 #每隔10秒查询realserver状态lb_algo wlc #lvs算法lb_kind DR #DR模式persistence_timeout 60 #(同一IP的连接60秒内被分配到同一台realserver)protocol TCP #用TCP协议检查realserver状态real_server 192.168.200.131 80 { #真实服务器ipweight 100 #权重TCP_CHECK {connect_timeout 10 # 10秒无响应超时(连接超时时间)nb_get_retry 3 #失败重试次数delay_before_retry 3 #失败重试的间隔时间connect_port 80 #连接的后端端口}}real_server 192.168.200.132 80 {weight 100TCP_CHECK {connect_timeout 10nb_get_retry 3delay_before_retry 3connect_port 80}}}
2.清空LVS脚本
# ipvsadm -C //把之前的ipvsadm规则清空# systemctl restart network //可以把之前设置的VIP删除掉
3.为rs1、rs2运行lvs_rs.sh脚本
因为我们在keepalived的配置文件中定义的LVS模式为DR模式,所以需要运行lvs_rs.sh
# vim /usr/local/sbin/lvs_rs.sh //两台rs上添加的内容一致#/bin/bashvip=192.168.200.110#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 uproute add -host $vip lo:0#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.htmlecho "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announce分别在三台机器上执行各自脚本;[root@dir ~]# bash /usr/local/sbin/lvs_dr.sh[root@rs1 ~]# bash /usr/local/sbin/lvs_rs.sh[root@rs2 ~]# bash /usr/local/sbin/lvs_rs.sh
4.在192.168.200.130上启动keepalived服务
# systemctl start keepalived# ps aux |grep keepalived // 检查有无keepalived进程root 12184 0.0 0.0 118684 1344 ? Ss 03:00 0:00 /usr/sbin/keepalived -Droot 12185 0.0 0.0 129616 3308 ? S 03:00 0:00 /usr/sbin/keepalived -Droot 12186 0.0 0.0 129484 2592 ? S 03:00 0:00 /usr/sbin/keepalived -Droot 12188 0.0 0.0 112704 976 pts/0 S+ 03:00 0:00 grep --color=auto keepalived
检验是否成功的方法也很简单,需要在浏览器直接访问vip192.168.200.110,然后故意把其中一台 rs的Nginx服务关掉,比如说关闭131的;然后再刷新浏览器看结果,刷新的时候需要使用组合键(Ctrl+F5)强制刷新浏览器,这样就不会有缓存数据了。同时,也可以在调度器(130)上执行命令ipvsadm -ln查看连接数:
# $ ps -ef | grep nginx //查看nginx主进程#kill
对应的rs只有一台131,然后再把132的Nginx服务启动,再来查看:
# ipvsadm -lnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.200.110:80 wlc persistent 60-> 192.168.200.131:80 Route 100 2 0-> 192.168.200.132:80 Route 100 0 4
