介绍
LVS架构中,不管是NAT模式还是DR模式,当后端的RS宕掉时,调度器依然会把请求转发到宕掉的RS上,这样的结果并不是我们想要的。其实,keepalived就可以解决该问题,它不仅仅有高可用的功能,还有负载均衡的功能。在调度器上只要安装了keepalived,就不用再安装ipvsadm了,也不用去编写LVS相关的脚本了,也就是说keepalived已经嵌人了LVS功能。完整的keepalived+LVS架构需要有两台调度器实现高可用,提供调度服务的只需要一台,另外一台作为备用。
为了节省资源,我们只设置一台主keepalived,备用的暂时就省略掉了。下面为各机器的角色和IP。
主keepalived(调度器):192.168.91.129
真实服务器rs1:192.168.91.130
真是服务器rs2:192.168.91.131
VIP:192.168.91.100
案例实施
首先关闭三个节点防火墙
[root@dir ~]# setenforce 0
[root@dir ~]# systemctl stop firewalld
为调度器节点安装keepalived,其余两个节点安装nginx
yum install -y keepalived
yum install -y nginx
编辑keepalived的配置文件
[root@dir ~]# vi /etc/keepalived/keepalived.conf
nstance VI_1 {
state MASTER
interface ens36
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.91.100
}
}virtual_server 192.168.91.100 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.91.130 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.91.131 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
因为我们在keepalived的配置文件中定义的LVS模式为DR模式,所以还需要在两台rs上写个脚本
[root@rs1 ~]# vi /usr/local/sbin/lvs_rs.sh
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#/bin/bash
vip=192.168.91.100
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
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
执行脚本,启动nginx服务,启动keepalived服务。
[root@rs1 ~]# sh /usr/local/sbin/lvs_rs.sh
[root@rs2 ~]# sh /usr/local/sbin/lvs_rs.sh
[root@rs1 ~]# systemctl start nginx
[root@rs2 ~]# systemctl start nginx
[root@dir ~]# systemctl start keepalived
检查有无keepalived进程
[root@dir ~]# ps aux |grep keepalived
root 9477 0.0 0.1 122876 1416 ? Ss 15:54 0:00 /usr/sbin/keepalived -D
root 9478 0.0 0.3 133840 3380 ? S 15:54 0:00 /usr/sbin/keepalived -D
root 9479 0.0 0.2 133708 2596 ? S 15:54 0:00 /usr/sbin/keepalived -D
root 9501 0.0 0.0 112724 992 pts/0 R+ 15:55 0:00 grep --color=auto keepalived
测试
检验是否成功的方法也很简单,需要在浏览器直接访问vip192.168.91.100,然后故意把其中一台 rs的Nginx服务关掉;然后再刷新浏览器看结果,刷新的时候需要使用组合键(Ctrl+F5)强制刷新浏览器,这样就不会有缓存数据了。同时,也可以在调度器(130)上执行命令ipvsadm -ln查看连接数。
[root@dir ~]# 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.91.100:80 wlc persistent 60
-> 192.168.91.130:80 Route 100 0 0
-> 192.168.91.131:80 Route 90 0 0
关掉rs1节点的nginx:
[root@dir ~]# 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.91.100:80 wlc persistent 60
-> 192.168.91.131:80 Route 90 0 0
对应的rs只有一台rs2,然后再把rs1的Nginx服务启动,再来查看:
[root@dir ~]# 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.91.100:80 wlc persistent 60
-> 192.168.91.130:80 Route 100 0 0
-> 192.168.91.131:80 Route 90 0 0
后端的rs又变成两台了。