LVS-DR 模式负载均衡实战从原理到部署与验证
DR模式实验过程LVS-DR是LVS的一种负载均衡模式通过直接路由技术将请求分发到后端真实服务器响应数据直接由真实服务器返回给客户端避免调度器成为性能瓶颈。 核心工作流程 请求接收与转发 客户端发送请求到虚拟IPVIP调度器接收到请求后通过负载均衡算法选择一台后端真实服务器Real Server。 调度器修改请求报文的目标MAC地址为选定Real Server的MAC地址保持VIP不变通过二层转发将请求发送到Real Server。 Real Server处理请求 Real Server需配置VIP在本地回环接口lo上并设置ARP抑制避免与调度器冲突。 Real Server接收到请求后确认目标IP为本地VIP直接处理请求并生成响应数据。 响应直接返回客户端 Real Server将响应数据包的源IP设置为VIP目标IP为客户端IP通过默认路由直接返回给客户端不经过调度器。一. 环境环境配置client:172.25.254.10 router双网卡 NAT:172.25.254.100 hostonly:192.168.0.100 vs: vip:192.168.0.200 dip:192.168.0.50 rs1: vip:192.168.0.200 rip:192.168.0.10 rs2: vip:192.168.0.200 rip:192.168.0.20环境流程图二 环境设定#在路由器中使用脚本快速配置双网卡[rootrouter ~]# vmset.sh eth0 172.25.254.100 Router[rootrouter ~]# vmset.sh eth1 192.168.0.100 Router noroute#设定内核路由功能[rootrouter ~]# echo net.ipv4.ip_forward1 /etc/sysctl.conf[rootrouter ~]# sysctl -pnet.ipv4.ip_forward1#数据转发策略[rootrouter ~]# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.0.100[rootvsnode ~]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.100#vs调度器使用脚本快速配置网卡[rootvsnode ~]# vmset.sh eth0 192.168.0.50 vsnode norouter[rootvsnode ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection[connection]ideth0typeethernet interface-nameeth0[ipv4]methodmanualaddress1192.168.0.50/24gateway192.168.0.100#在lo配置vip节省网卡资源[rootvsnode ~]# cd /etc/NetworkManager/system-connections/[rootvsnode system-connections]# cp -p eth0.nmconnection lo.nmconnection[rootvsnode system-connections]# vim lo.nmconnection[connection]idlotypeloopback interface-namelo[ipv4]methodmanualaddress1127.0.0.1/8address2192.168.0.200/32[rootRS1 system-connections]# nmcli connection reload[rootRS1 system-connections]# nmcli connection up eth0连接已成功激活D-Bus 活动路径/org/freedesktop/NetworkManager/ActiveConnection/7[rootRS1 system-connections]# nmcli connection up lo连接已成功激活D-Bus 活动路径/org/freedesktop/NetworkManager/ActiveConnection/8#检测rootvsnode system-connections]# route -nKernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0192.168.0.1000.0.0.0 UG10000eth0127.0.0.00.0.0.0255.0.0.0 U3000lo192.168.0.00.0.0.0255.255.255.0 U10000eth0[rootvsnode system-connections]# ip a1: lo:LOOPBACK,UP,LOWER_UPmtu65536qdisc noqueue state UNKNOWN group default qlen1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet127.0.0.1/8 scopehostlo valid_lft forever preferred_lft forever inet192.168.0.200/32 brd192.168.0.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet6 ::1/128 scopehostvalid_lft forever preferred_lft forever2: eth0:BROADCAST,MULTICAST,UP,LOWER_UPmtu1500qdisc mq state UP group default qlen1000link/ether 00:0c:29:41:e5:8b brd ff:ff:ff:ff:ff:ff altname enp3s0 altname ens160 inet192.168.0.50/24 brd192.168.0.255 scope global secondary noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fe80::e40:8975:6b9:fea8/64 scopelinknoprefixroute valid_lft forever preferred_lft forever#客户端使用脚本快速配置网卡[rootclient ~]# vmset.sh eth0 172.25.254.10 client norouter连接已成功激活D-Bus 活动路径/org/freedesktop/NetworkManager/ActiveConnection/42: eth0:BROADCAST,MULTICAST,UP,LOWER_UPmtu1500qdisc mq state UP group default qlen1000link/ether 00:0c:29:e5:75:af brd ff:ff:ff:ff:ff:ff altname enp3s0 altname ens160 inet172.25.254.99/24 brd172.25.254.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fee5:75af/64 scopelinktentative noprefixroute valid_lft forever preferred_lft forever client[rootclient ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection[connection]ideth0typeethernet interface-nameeth0[ipv4]methodmanualaddress1172.25.254.10/24gateway172.25.254.100dns8.8.8.8;[rootclient ~]# nmcli connection reload[rootclient ~]# nmcli connection up eth0连接已成功激活D-Bus 活动路径/org/freedesktop/NetworkManager/ActiveConnection/5[rootclient ~]# route -nKernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0172.25.254.1000.0.0.0 UG10000eth0172.25.254.00.0.0.0255.255.255.0 U10000eth0#检测[rootclient ~]# ping 192.168.0.100PING192.168.0.100(192.168.0.200)56(84)比特的数据。64比特来自192.168.0.100:icmp_seq1ttl128时间1.08毫秒#RS1使用脚本快速配置网卡[rootRS1 ~]# vmset.sh eth0 192.168.0.10 RS1 noroute[rootRS1 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.0.100[rootRS1 ~]# nmcli connection reload[rootRS1 ~]# nmcli connection up eth0[rootRS1 ~]# route -nKernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0192.168.0.1000.0.0.0 UG10000eth0192.168.0.00.0.0.0255.255.255.0 U10000eth0#在lo上设定vip[rootRS1 ~]# cd /etc/NetworkManager/system-connections/[rootRS1 system-connections]# cp -p eth0.nmconnection lo.nmconnection[rootRS1 system-connections]# vim lo.nmconnection[connection]idlotypeloopback interface-namelo[ethernet][ipv4]address1127.0.0.1/8address2192.168.0.100/32methodmanual[rootRS1 system-connections]# nmcli connection reload[rootRS1 system-connections]# nmcli connection up lo连接已成功激活D-Bus 活动路径/org/freedesktop/NetworkManager/ActiveConnection/6[rootRS1 system-connections]# ip a1: lo:LOOPBACK,UP,LOWER_UPmtu65536qdisc noqueue state UNKNOWN group default qlen1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet127.0.0.1/8 scopehostlo valid_lft forever preferred_lft forever inet192.168.0.200/32 scope global lo valid_lft forever preferred_lft forever inet6 ::1/128 scopehostvalid_lft forever preferred_lft forever#arp禁止响应[rootrs1 ~]# echo 1 /proc/sys/net/ipv4/conf/all/arp_ignore[rootrs1 ~]# echo 1 /proc/sys/net/ipv4/conf/lo/arp_ignore[rootrs1 ~]# echo 2 /proc/sys/net/ipv4/conf/lo/arp_announce[rootrs1 ~]# echo 2 /proc/sys/net/ipv4/conf/all/arp_announce#RS2使用脚本快速配置网卡[rootRS2 ~]# vmset.sh eth0 192.168.0.20 RS2 noroute[rootRS2 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.0.100[rootRS2 ~]# nmcli connection reload[rootRS2 ~]# nmcli connection up eth0[rootRS2 ~]# route -nKernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0192.168.0.1000.0.0.0 UG10000eth0192.168.0.00.0.0.0255.255.255.0 U10000eth0#在lo上设定vip[rootRS2 ~]# cd /etc/NetworkManager/system-connections/[rootRS2 system-connections]# cp -p eth0.nmconnection lo.nmconnection[rootRS2 system-connections]# vim lo.nmconnection[connection]idlotypeloopback interface-namelo[ethernet][ipv4]address1127.0.0.1/8address2192.168.0.100/32methodmanual[rootRS2 system-connections]# nmcli connection reload[rootRS2 system-connections]# nmcli connection up lo连接已成功激活D-Bus 活动路径/org/freedesktop/NetworkManager/ActiveConnection/6[rootRS2 system-connections]# ip a1: lo:LOOPBACK,UP,LOWER_UPmtu65536qdisc noqueue state UNKNOWN group default qlen1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet127.0.0.1/8 scopehostlo valid_lft forever preferred_lft forever inet192.168.0.200/32 scope global lo valid_lft forever preferred_lft forever inet6 ::1/128 scopehostvalid_lft forever preferred_lft forever#arp禁止响应[rootrs2 ~]# echo 1 /proc/sys/net/ipv4/conf/all/arp_ignore[rootrs2 ~]# echo 1 /proc/sys/net/ipv4/conf/lo/arp_ignore[rootrs2 ~]# echo 2 /proc/sys/net/ipv4/conf/lo/arp_announce[rootrs2 ~]# echo 2 /proc/sys/net/ipv4/conf/all/arp_announceLVS 设置转发规则#在vs调度器设置转发规则[rootVS ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr[rootVS ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10 -g[rootVS ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20 -g#配置规则持久化[rootVS ~]# ipvsadm-save /etc/sysconfig/ipvsadm[rootVS ~]# systemctl enable --now ipvsadm.service[rootVS ~]# ipvsadm -LnIP Virtual Server version1.2.1(size4096)Prot LocalAddress:Port Scheduler Flags -RemoteAddress:Port Forward Weight ActiveConn InActConn TCP192.168.0.200:80 wrr -192.168.0.10:80 Route100-192.168.0.20:80 Route100使用Apache辅助测试RS1/2做相同配置[rootRS1 system-connections]# dnf install http -y[rootRS1 system-connections]# echo RS1 /var/www/html/index.html[rootRS1 system-connections]# systemctl enable --now httpdCreated symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.测试[rootClient ~]# for i in {1..10};do curl 192.168.0.200;doneRS1 RS2 RS1 RS2 RS1 RS2 RS1 RS2 RS1 RS2