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 MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.110
}
}
virtual_server 192.168.200.110 80 { #VIP
delay_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 { #真实服务器ip
weight 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 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_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/bash
vip=192.168.200.110
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
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
分别在三台机器上执行各自脚本;
[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 -D
root 12185 0.0 0.0 129616 3308 ? S 03:00 0:00 /usr/sbin/keepalived -D
root 12186 0.0 0.0 129484 2592 ? S 03:00 0:00 /usr/sbin/keepalived -D
root 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 -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 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