Linux虚拟服务器DR模式负载均衡集群搭建
(1).DR模式与TUN模式技术解析
直接路由(Direct Routing):调度器将客户端请求分发至不同的后端服务器。处理完成后,服务器直接响应客户端,这样调度器仅需处理客户端与服务器间的一半连接。这种设计避免了新的性能瓶颈,同时提升了系统的可扩展性。由于DR模式采用物理层技术(修改MAC地址),所有服务器必须位于同一网段。
IP隧道(IP Tunneling):调度器将客户端请求分发至不同的后端服务器。处理完成后,服务器直接响应客户端,调度器同样仅处理一半连接。IP隧道技术显著提升了调度器的处理能力,大幅增加了系统可容纳的最大节点数,可支持超过100个节点。后端服务器可在任何局域网或广域网上运行,这意味着允许地理分布,这对灾难恢复具有重要意义。服务器必须拥有正式的公网IP地址用于与客户端直接通信,且所有服务器必须支持IP隧道协议。
两种模式的主要区别在于IP地址是否在同一物理网段,这也是DR模式仅需服务器能上网即可,而TUN模式必须拥有正式公网IP的原因。
(2).DR模式工作原理
DR模式下数据流全程保持目标地址和源地址不变,因为DR模式工作于第二层。以下是数据包传输过程:
第一步:客户端发送请求报文,源IP为CIP,目标IP为VIP,源MAC为CMAC,目标MAC为VMAC;
第二步:请求到达负载均衡器,调度器将其分配至真实服务器(修改MAC),源IP仍为CIP,目标IP仍为VIP,源MAC变为DMAC,目标MAC变为RMAC;
第三步:真实服务器接收报文,处理并直接响应客户端,源IP变为RIP,目标IP变为CIP,源MAC为RMAC,目标MAC为CMAC。
说明: 1)基于MAC的数据报文转发效率最高,但依赖交换机的MAC地址表实现; 2)二层设备不具备路由功能,广播无法跨路由,因此MAC地址广播必须在同一物理网段实现; 3)VLAN具有隔离广播的功能,要实现MAC地址广播,所有设备应在同一VLAN中。
总体而言,所有设备应在同一物理网段,所有设备应在同一广播域中。
(3).实践部署
服务器配置:
- node1 192.168.5.100(DIP),192.168.5.100(VIP) 负载均衡器
- node2 192.168.5.102 真实服务器1
- node3 192.168.5.103 真实服务器2
1)在负载均衡器node1上创建虚拟接口配置文件,配置VIP地址192.168.5.101
[root@node1 ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens33{,:1}
[root@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33:1 //修改以下参数
NAME="ens33:1"
DEVICE="ens33:1"
IPADDR="192.168.5.101"
GATEWAY="192.168.5.2" //指向网关IP
//如果存在HWADDR,ens33和ens33:1的HWADDR不必一致。
[root@node1 ~]# systemctl restart network //重启网络服务
[root@node1 ~]# ip addr show //查看网络接口状态
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e6:d6:27 brd ff:ff:ff:ff:ff:ff
inet 192.168.5.100/24 brd 192.168.5.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.5.101/24 brd 192.168.5.255 scope global secondary noprefixroute ens33:1
valid_lft forever preferred_lft forever
inet6 fe80::201:7257:85b:7dc8/64 scope link noprefixroute
valid_lft forever preferred_lft forever
2)在负载均衡器node1上安装LVS管理工具ipvsadm,并设置开机自启
[root@node1 ~]# yum -y install ipvsadm
[root@node1 ~]# systemctl enable ipvsadm.service
Created symlink from /etc/systemd/system/multi-user.target.wants/ipvsadm.service to /usr/lib/systemd/system/ipvsadm.service.
暂时不启动ipvsadm服务,因为需要/etc/sysconfig/ipvsadm配置文件。
3)在负载均衡器node1上使用ipvsadm命令配置负载均衡规则
[root@node1 ~]# ipvsadm -A -t 192.168.5.101:80 -s wrr //设置虚拟服务IP和端口,使用加权轮询模式
[root@node1 ~]# ipvsadm -a -t 192.168.5.101:80 -r 192.168.5.102:80 -g -w 1
[root@node1 ~]# ipvsadm -a -t 192.168.5.101:80 -r 192.168.5.103:80 -g -w 2
[root@node1 ~]# 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.5.101:80 wrr
-> 192.168.5.102:80 Route 1 0 0
-> 192.168.5.103:80 Route 2 0 0
[root@node1 ~]# ipvsadm -S > /etc/sysconfig/ipvsadm
-A -t 192.168.5.101:http -s wrr
-a -t 192.168.5.101:http -r 192.168.5.102:http -g -w 1
-a -t 192.168.5.101:http -r 192.168.5.103:http -g -w 2
[root@node1 ~]# systemctl start ipvsadm
-g参数指定DR模式,-m参数指定TUN模式。
注意:LVS三种模式中,仅NAT模式需要开启路由转发功能,DR和TUN模式都不需要。
如果启用了防火墙,请添加相应端口规则
[root@node1 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
success
success
4)在真实服务器node2和node3上安装Web服务器用于测试
[root@node2 ~]# yum -y install httpd
[root@node2 ~]# systemctl start httpd
[root@node2 ~]# echo "Server Node 2" > /var/www/html/index.html
[root@node3 ~]# yum -y install httpd
[root@node3 ~]# systemctl start httpd
[root@node3 ~]# echo "Server Node 3" > /var/www/html/index.html
如果启用了防火墙,请开放相应端口
[root@node2 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
success
success
[root@node3 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
success
success
5)在真实服务器node2和node3上配置回环接口
[root@node2 ~]# cp /etc/sysconfig/network-scripts/ifcfg-lo{,:1}
[root@node2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:1 //修改配置
DEVICE=lo:1
IPADDR=192.168.5.101 //指向VIP
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback
[root@node3 ~]# cp /etc/sysconfig/network-scripts/ifcfg-lo{,:1}
[root@node3 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:1 //修改配置
DEVICE=lo:1
IPADDR=192.168.5.101 //指向VIP
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback
为什么要在回环接口上配置VIP: 1)因为DR模式只修改MAC地址而不改变IP地址,为使真实服务器能够接收报文,需要配置一个与VIP相同的IP地址; 2)但VIP不能配置在出口网卡上,否则会响应客户端的ARP请求,造成客户端/网关ARP表混乱,导致整个集群无法正常工作。
另外,VIP可以与RIP、DIP不在同一网段,回环接口配置方式不变。
6)关闭真实服务器node2和node3上的ARP响应
[root@node2 ~]# vim /etc/sysctl.conf //添加或修改以下参数
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2
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
[root@node2 ~# sysctl -p //立即生效
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2
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
[root@node3 ~]# vim /etc/sysctl.conf //添加或修改以下参数
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2
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
[root@node3 ~]# sysctl -p //立即生效
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2
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
参数说明:
arp_ignore参数控制系统收到外部ARP请求时是否响应。常用取值: 0:响应任意网卡上接收到的对本机IP地址的ARP请求(包括回环接口); 1:只响应目的IP地址为接收网卡上的本地地址的ARP请求; 2:只响应目的IP地址为接收网卡上的本地地址的ARP请求,且ARP请求的源IP必须与接收网卡同网段; 8:不响应所有ARP请求。
arp_announce参数控制系统发送ARP请求时如何选择源IP地址。常用取值: 0:允许使用任意网卡上的IP地址作为ARP请求的源IP; 1:尽量避免使用不属于该发送网卡子网的本地地址作为ARP请求的源IP; 2:忽略IP数据包的源IP地址,选择该发送网卡上最合适的本地地址作为ARP请求的源IP。
7)测试验证
在客户端浏览器访问http://192.168.5.101,观察返回的内容是否在node2和node3之间轮换。
注意:DR模式下的轮换机制可能与NAT模式有所不同,需要特别验证。