目录
4.1 配置虚拟 IP 地址(VIP:192.168.200.101)
一.、LVS_DR的概念
1 LVS_DR数据包流向
为方便进行原理分析,将Client与群集机器放在同一网 络中,数据包流经的路线为client-->调度器-->节点服务器-->client
- 客户端发送请求到Director Server (负载均衡器),请求的数据报文(源IP是CIP,目标IP是VIP)到达内核空间。
- Director Server和Real Server在同-一个网络中,数据通过二层数据链路层来传输。
- 内核空间判断数据包的目标IP是本机VIP,此时IPVS(IP虚拟服务器)比对数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源MAC地址为Director Server 的MAC地址,修改目标MAC地址为Real Server. 的MAC地址,源IP地址与目标IP地址没有改变,然后将数据包发送给Real Server
- 到达Real Server的请求报文的MAC地址是自身的MAC地址,就接收此报文。数据包重新封装报文(源IP地址为VIP,目标IP为CIP),将响应报文通过lo接口传送给物理网卡然后向外发出。
Real Server直接将响应报文传送到客户端。
2 DR模式的特点
- Director Server 和Real Server必须在同一个物理网络中。
- RealServer可以使用私有地址,也可以使用公网地址。如果使用公网地址,可以通过互联网对RIP进行直接访问。
- Director Server作为群集的访问入口,但不作为网关使用。
- 所有的请求报文经由Director Server,但回复响应报文不能经过Director Server。
- Real Server 的网关不允许指向Director Server IP,即Real Server发 送的数据包不允许经过Director Server。
- Real Server上的lo接口配置VIP的IP地址。
二. LVS-DR中的ARP问题
在LVS-DR负载均衡集群中,负载均衡器与节点服务器都要配置相同的VIP地址
发送响应报文需要经过网关路由器的转发,就需要先对网关IP进行ARP请求获取网关接口的MAC地址(因为主机在发送报文给对目标主机首先需要查询本地的ARP缓存表中有没有目标IP和目标MAC的对应关系,如果有则直接单播发送,如果没有则要先进行ARP广播探测请求解析到目标IP所对应的MAC地址)
ARP请求报文
源IP --> VIP
目的IP --> 网关IP
源MAC --> 节点服务器MAC地址
目的MAC --> FF-FF-FF-FF-FF-FF-FF 广播地址
1 导致的问题
网关的ARP缓存表VIP--> 调度器MAC地址被更新成节点服务器MAC地址
节点服务器物理网卡的IP --> 节点服务器MAC地址
在LVS-DR负载均衡集群中,负载均衡服务器与节点服务器都要配置相同的VIP地址,在局域网中具有相同的IP地址,必会造成各服务器ARP通信的紊乱
-
当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播
-
只有前端的负载均衡器进行响应,其他节点服务器不应该响应ARP广播
RealServer返回报文(源IP是VIP)经路由器转发,重新封装报文时,需要先获取路由器的MAC地址,发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包中的源IP地址,而不使用发送接口的IP地址
- 路由器收到ARP请求后,将更新ARP表项
- 原有的VIP对应Director的MAC地址会被更新为VIP对应Real Server的MAC地址
- 路由器根据ARP表项,会将新来的请求报文转发给Real Server,导致Director的VIP失效。
2 解决方法
- 对节点服务器进行处理,使其不响应针对VIP的ARP请求
- 使用虚接口 lo:0 承载VIP地址
- 设置内核参数 arp_ignore=1: 系统只响应目的IP为本地IP的ARP请求
- 对节点服务器进行处理,设置内核参数arp_announce=2: 系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址
2.1 解决ARP的两个问题的设置方法
1、修改/etc/sysctl.conf文件
##使用linux系统只响应目的地址为本地物理网卡IP的ARP请求
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
##使用linux系统不使用数据包的源IP来作为ARP请求报文的源IP,而使用发送接口的IP地址作为ARP请求报文的源IP net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
三. DR模式 LVS负载均衡群集部署
1 实验环境
DR 服务器:192.168.200.100
vip:192.168.200.101
Web 服务器1:192.168.200.10
Web 服务器2:192.168.200.20
NFS服务器:192.168.200.102
客户端:192.168.200.200
2 配置负载调度器
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# modprobe ip_vs
[root@localhost ~]# cat /proc/net/ip_vs
[root@localhost ~]# yum -y install ipvsadm
2.1 配置虚拟 IP 地址
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0 //若隧道模式,复制为ifcfg-tunl0
[root@localhost ~]# vim ifcfg-ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.200.101
NETMASK=255.255.255.255
[root@localhost ~]# ifup ens33:0
[root@localhost ~]# ifconfig ens33:0
2.2 调整 proc 响应参数
由于 LVS 负载调度器和各节点需要共用 VIP 地址,需要关闭 icmp 的重定向,不充当路由器。
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@localhost ~]# sysctl -p
2.3 配置负载分配策略
[root@localhost ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@localhost ~]# systemctl start ipvsadm
[root@localhost ~]# ipvsadm -C
[root@localhost ~]# ipvsadm -A -t 192.168.200.101:80 -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.200.101:80 -r 192.168.200.10:80 -g //若隧道模式,-g替换为-i
[root@localhost ~]# ipvsadm -a -t 192.168.200.101:80 -r 192.168.200.20:80 -g
[root@localhost ~]# ipvsadm //查看调度策略
[root@localhost ~]# ipvsadm -ln //查看节点状态,Route代表 DR模式
3 部署共享存储(NFS服务器)
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install nfs-utils rpcbind
[root@localhost ~]# mkdir /opt/kgc /opt/benet
[root@localhost ~]# chmod 777 /opt/kgc /opt/benet
[root@localhost ~]# vim /etc/exports
/usr/share *(ro,sync)
/opt/kgc 192.168.200.0/24(rw,sync)
/opt/benet 192.168.200.0/24(rw,sync)
[root@localhost ~]# systemctl start rpcbind.service
[root@localhost ~]# systemctl start nfs.service
4 配置节点服务器(web1、web2)
关闭防火墙、核心防护
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
4.1 配置虚拟 IP 地址(VIP:192.168.200.101)
此地址仅用作发送 Web响应数据包的源地址,并不需要监听客户机的访问请求(改由调度器监听并分发)。因此使用虚接口 lo∶0 来承载 VIP 地址,并为本机添加一条路由记录,将访问 VIP 的数据限制在本地,以避免通信紊乱。
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost ~]# cp ifcfg-lo ifcfg-lo:0
[root@localhost ~]# vim ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.200.101
NETMASK=255.255.255.255 #注意:子网掩码必须全为 1
[root@localhost ~]# ifup lo:0
[root@localhost ~]# ifconfig lo:0
[root@localhost ~]# route add -host 192.168.200.101 dev lo:0 //添加静态路由信息,dev指定出站网卡
[root@localhost ~]# vim /etc/rc.local //也可以添加路由的命令写入开机自启配置文件中,每次开机后自动启动
/sbin/route add -host 192.168.200.101 dev lo:0
[root@localhost ~]# chmod +x /etc/rc.d/rc.local
4.2 调整内核的 ARP 响应参数
阻止更新 VIP 的 MAC 地址,避免发生冲突
1:
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1 #系统只响应目的IP为本地IP的ARP请求
net.ipv4.conf.lo.arp_announce = 2 #系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@localhost ~]# sysctl -p
2:
[root@localhost ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@localhost ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@localhost ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@localhost ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
[root@localhost ~]# sysctl -p
4.3 配置web主机端NFS挂载
[root@localhost ~]# yum -y install nfs-utils rpcbind httpd
[root@localhost ~]# systemctl start rpcbind
[root@localhost ~]# systemctl start httpd
web1:192.168.200.10
[root@localhost ~]# mount.nfs 192.168.200.102:/opt/can /var/www/html
[root@localhost ~]# echo 'this is can web!' > /var/www/html/index.html
web2:192.168.200.20
[root@localhost ~]# mount.nfs 192.168.200.102:/opt/benet /var/www/html
[root@localhost ~]# echo 'this is benet web!' > /var/www/html/index.html
5 测试 LVS 群集
在客户端使用浏览器访问 http://192.168.200.200/