前言
ipvsadm是Linux虚拟服务器的管理命令,是用于设置、维护和检查Linux内核中虚拟服务器列表的命令。Linux虚拟服务器可用于基于两个或更多个节点的集群构建可扩展的网络服务。群集的活动节点将服务请求重定向到真正执行服务的服务器主机上。支持TCP和UDP协议,支持三咱数据包转发方法(NAT、隧道、直接路径)以及八种负载均衡算法(轮询、加权轮询、最少连接、加权最少连接、基于位置的最小连接,基于位置的最小连接与复制,目标散列和源散列)。
keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
LVS集群搭建
1 环境准备
主机名 |
主机IP |
备注 |
lb03 |
172.16.7.15 |
01.Cent0S7.4系统 02.防止干扰暂时防火墙firewall和Selinux关闭 03.web03和web04只安装web服务,并满足 curl http://10.0.0.17/页尾得到结果为web03 curl http://10.0.0.18/页尾得到结果为web04 |
lb04 |
172.16.7.16 |
|
vip | 172.16.7.13 | |
web03 |
172.16.7.17 |
|
web04 |
172.16.7.18 |
2 安装ipvsadm管理工具
lsmod |grep ip_vs #查看系统的LVS模块->默认没有加载模块,需安装管理工具才会激活
yum -y install ipvsadm
查看当前LVS状态,顺便激活LVS内核模块
[root@lb03 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@lb03 ~]# lsmod|grep ip_vs
ip_vs 141092 0
nf_conntrack 133387 1 ip_vs
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
注意ipvsadm -ln作用:健康检查,即当某台web服务器出现问题时LVS将自动踢出;等恢复后再添加进来
2.1 在eth0网卡绑定VIP地址(高可用)
ip addr add 172.16.7.13/24 dev eth0 #lb服务的IP地址可扩展性较差,故使用VIP地址(删除del;显示show)
2.2 清除当前所有LVS规则
ipvsadm -C
2.3 设置tcp、tcpfin、udp链接超时时间(s)
ipvsadm --set 30 5 60 #控制浏览器与lb01的超时时间
2.4 添加虚拟服务,调度算法见man ipvsadm
ipvsadm -A -t 172.16.7.13:80 -s wrr -p 20 #LVS默认无80端口,需另外添加新的虚拟IP记录->控制lb01与web01、web02的超时时间
2.5 将虚拟服务vip地址关联到真实服务上
ipvsadm -a -t 172.16.7.13:80 -r 172.16.7.17:80 -g -w 1
ipvsadm -a -t 172.16.7.13:80 -r 172.16.7.18:80 -g -w 1
2.6 查看配置结果
[root@lb03 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096) #LVS版本号
Prot LocalAddress:Port Scheduler Flags #协议(TCP)本地IP:端口 调度算法 标志(持续时间20s)
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
#后端节点IP:端口 工作模式 权重 已建立连接 正在连接
TCP 172.16.7.3:80 wrr persistent 20
-> 172.16.7.17:80 Route 1 0 0
-> 172.16.7.18:80 Route 1 0 0
3 web服务器配置
3.1 .在两台web上的lo网卡绑定VIP地址
ip addr add 172.16.7.13/32 dev lo
3.2 .修改内核参数抑制ARP响应
cat >>/etc/sysctl.conf<<EOF #其目的是为了让rs顺利发送mac地址给客户端
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF
sysctl -p
检查绑定情况
[root@lb03 ~]# ip a s eth0
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:50:56:3b:cb:36 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.13/24 scope global secondary eth0
valid_lft forever preferred_lft forever
[root@web03 ~]# ip a s lo
lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 172.16.7.13/32 scope global lo valid_lft forever preferred_lft forever
web浏览器测试
http://172.16.7.13/
说明:当lb服务器断开连接后VIP会自动消失,重新连接后需再次添加VIP
3.3 arp解析查看
[root@lb04 ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
172.16.7.254 ether 00:50:56:e9:9f:2c C eth0
172.16.7.18 ether 00:0c:29:ea:ca:55 C eth0
172.16.7.13 ether 00:0c:29:de:7c:97 C eth0
172.16.1.15 ether 00:0c:29:de:7c:a1 C eth1
172.16.7.17 ether 00:0c:29:4a:ac:4a C eth0
4 LVS集群的工作模式
选DR直接路由模式,工作原理如下图所示
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS。
③.RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端
得知以上工作原理后,我们来配合keepalived服务,实现vip地址在两台lb中偏移 。
Keepalive+LVS实现
1 安装配置keepalive实例
开始前先清理lb03服务器上lvs配置,网卡配置
ipvsadm -C
ip addr del 172.16.7.13/24 dev eth0
1.1 在lb03和lb04上安装keepalive
yum install -y keepalived
1.2 编辑keepalived.conf配置文件
[root@lb03 ~]# vi /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_01
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150 #优先级,官方建议2个服务器相差值是50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.7.13/24
}
}
virtual_server 172.16.7.13 80 {
delay_loop 6
lb_algo wrr #采用权重轮训方式均衡负载
lb_kind DR #直接路由模式
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 172.16.7.17 80 {
weight 1 #权重
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 172.16.7.18 80 {
weight 1 #权重
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
复制一份到lb04服务器上,并修改
state MASTER---->state SLAVE
priority 150 ----> priority 100
1.3 开启keepalived服务
启动lb03、lb04服务器keepalived服务
systemctl start keepalived.service
两台服务器分别, ip a #查看VIP,此时应在lb03上。master为主模拟服务器lb03故障
systemctl stop keepalived.service
两台服务器分别, ip a #查看VIP,此时应漂移到lb04上
1.4 web03/web04同时操作以下步骤
需要配置 ARP 抑制,VIP绑定LO网卡
ip addr add 172.16.7.13/32 dev lo
cat >>/etc/sysctl.conf<<EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF
sysctl -p
注意:因为虚拟的ip重启之后就会失效,故须加入开机启动项rc.local文件并赋予其可执行权限
1.5 keepalive健康检查功能
模拟web03出现问题
1.5.1 查看lb03 lvs状态
1.5.2 关闭web03
1.5.3 查看lb03状态
如图发现,web03被剔除
1.5.4 开启web03
1.5.5 查看lvs状态
web03恢复,自动添加到LVS中
总结:
搭建服务时需要注意如下几点。
- real-server(web03、web04)需要设置lo接口的VIP不能在公网上出现,并且需要配置 ARP 抑制。
- LVS有多种网络模式,采用LVS-DR可以减少负载均衡的负担,让节点直接应答客户端请求,DR 模式是通过 MAC 地址改写机制实现转发,因此所有 RS 节点和调度器 LB 只能在一个局域网里面。
- 由于采用的是直接路由模式,集群节点RIP不能将网关指向DIP(lvs的直连ip),需要把路由指向前端路由地址。