LVS 实验搭建LVS 介绍Linux 虚拟服务器LVSLinux Virtual Servers使用负载均衡技术将多台服务器组成一个虚拟服务器。它为适应快速增长的网络访问需求提供了一个负载能力易于扩展、价格低廉的解决方案。LVS 是章文嵩博士于 1998 年创建的一款开源负载均衡软件。LVS 工作在内核空间中能够根据请求报文的目标 IP 和目标 PORT将请求调度转发至后端服务器集群中的某节点。LVS 术语调度器负载均衡器DirectorVirtual ServerVS后端服务器真实服务器Real ServerRSBackend Server调度器一般配置两个 IP 地址VIP向外提供服务的 IP 地址DIP与后端 RS 通信的 IP 地址RIPRS 的 IPCIP客户端的 IPLVS 由ipvsadm和ipvs组成ipvsadm用户空间命令行工具用于在 Director 上定义集群服务和添加集群上的 Real Serversipvs工作于内核 netfilter 中 INPUT 钩子上的程序代码要想将某台主机配置为 Director首先应确保当前内核支持 ipvs 并安装 ipvsadm。另外由于 Director 要调度转发所有客户端的请求负载压力较大生产环境中 Director 不要使用虚拟机。工作原理ipvs 使用内核 netfilter 子系统处理进入本机器的数据包当用户向负载均衡调度器Director Server发起请求调度器将请求发往内核空间。PREROUTING 链首先会接收到用户请求判断目标 IP 确定是本机 IP将数据包发往 INPUT 链。IPVS 是工作在 INPUT 链上的代码块。当用户请求到达 INPUT 时IPVS 会将用户请求和自己已定义好的集群服务进行比对如果用户请求的就是定义的集群服务那么此时 IPVS 会强行修改数据包里的目标 IP 地址及端口并将新的数据包发往 POSTROUTING 链。POSTROUTING 链接收数据包后发现目标 IP 地址刚好是自己的后端服务器那么此时通过选路将数据包最终发送给后端的服务器。工作模式LVS 的常用工作模式有四种分别是lvs-natlvs-drlvs-tunlvs-fullnatNAT 模式工作方式通过将请求报文的目标地址和目标端口修改为某 RS 的 IP 和 PORT 来实现报文转发。原报文源IP源MAC目标IP目标MACClient IPClient MACDirector VIPDirector MAC更改为源IP源MAC目标IP目标MACClient IPClient MACRS IPRS MAC工作原理当用户请求到达 Director Server此时请求的数据报文会先到内核空间的 PREROUTING 链。此时报文的源 IP 为 CIP目标 IP 为 VIP。PREROUTING 检查发现数据包的目标 IP 是本机将数据包送至 INPUT 链。IPVS 比对数据包请求的服务是否为集群服务若是修改数据包的目标 IP 地址为后端服务器 IP后将数据包发至 POSTROUTING 链。此时报文的源 IP 为 CIP目标 IP 为 RIP。POSTROUTING 链通过选路将数据包发送给 Real Server。Real Server 比对发现目标为自己的 IP开始构建响应报文发回给 Director Server。此时报文的源 IP 为 RIP目标 IP 为 CIP。Director Server 在响应客户端前会将源 IP 地址修改为自己的 VIP 地址然后响应给客户端。此时报文的源 IP 为 VIP目标 IP 为 CIP。特点RS 和 DIP 应使用私网地址且 RS 的网关要指向 DIP。请求和响应报文都要经由 Director 转发极高负载的场景中Director 可能会成为系统瓶颈。支持端口映射。RS 可以使用任意 OS。RS 的 RIP 和 Director 的 DIP 必须在同一 IP 网络。缺陷对 Director Server 压力会比较大请求和响应都需经过 Director ServerDirector 往往会成为系统的性能瓶颈。DR 模式工作方式通过为请求报文重新封装一个 MAC 首部进行报文转发新 MAC 首部的源 MAC 是 DIP 所在网卡的 MAC目标 MAC 为某 RS 所在接口的 MAC整个过程源报文的 IP 首部不会发生变化源 IP 为 CIP目标 IP 始终为 VIP。原报文源IP源MAC目标IP目标MACClient IPClient MACDirector VIPDirector MAC更改为源IP源MAC目标IP目标MACClient IPDirector DIP 对应的 MACDirector VIPRS MAC工作原理当用户请求到达 Director Server此时请求的数据报文会先到内核空间的 PREROUTING 链。此时报文的源 IP 为 CIP目标 IP 为 VIP。PREROUTING 检查发现数据包的目标 IP 是本机将数据包送至 INPUT 链。IPVS 比对数据包请求的服务是否为集群服务若是将请求报文中的源 MAC 地址修改为 DIP 的 MAC 地址将目标 MAC 地址修改为 RIP 的 MAC 地址然后将数据包发至 POSTROUTING 链。此时的源 IP 和目的 IP 均未修改仅修改了源 MAC 地址为 DIP 的 MAC 地址目标 MAC 地址为 RIP 的 MAC 地址。POSTROUTING 链发现目标 MAC 地址为 RIP 的 MAC 地址那么此时数据包将会发至 Real Server。RS 发现请求报文的 MAC 地址是自己的 MAC 地址就接收此报文。处理完成之后将响应报文通过 lo 接口传送给 eth0 网卡然后向外发出。此时的源 IP 地址为 VIP目标 IP 为 CIP。响应报文最终送达至客户端。特点RS 的 lo 网卡配置一个 IP 地址地址为 VIP。确保路由器只会把目标 IP 为 VIP 的请求报文发往 Director即会忽略 RS 上的 VIP。实现方案如下路由器静态绑定 Director 的 VIP 和 MAC 地址禁止 RS 响应 VIP 的 ARP 请求arptables修改各 RS 的内核参数并把 VIP 配置在特定的接口上实现禁止其响应。RS 的 RIP 跟 Director 的 DIP 必须在同一物理网络中RS 的网关不能指向 DIP。RS 的 RIP 可以使用私有地址也可以使用公网地址。请求报文必须由 Director 调度但响应报文不经过 DirectorRS 直接用 VIP 作为源 IP 发送响应报文。不支持端口映射。缺陷RS 和 DS 必须在同一机房中因为它是由二层进行转发的根据 MAC 地址来进行匹配。TUN 模式工作方式不修改请求报文的 IP 首部源 IP 仍为 CIP目标 IP 仍为 VIP而是在原有的 IP 首部之外再封装一个 IP 首部源 IP 为 DIP目标 IP 为 RIP。原报文源IP源MAC目标IP目标MACClient IPClient MACDirector VIPDirector MAC更改为封装源IP封装目标IP源IP源MAC目标IP目标MACDIPRIPClient IPClient MACDirector VIPDirector MAC工作原理当用户请求到达 Director Server此时请求的数据报文会先到内核空间的 PREROUTING 链。此时报文的源 IP 为 CIP目标 IP 为 VIP。PREROUTING 检查发现数据包的目标 IP 是本机将数据包送至 INPUT 链。IPVS 比对数据包请求的服务是否为集群服务若是在请求报文的首部再次封装一层 IP 报文封装源 IP 为 DIP目标 IP 为 RIP然后发至 POSTROUTING 链。此时源 IP 为 DIP目标 IP 为 RIP。POSTROUTING 链根据最新封装的 IP 报文将数据包发至 RS因为在外层封装多了一层 IP 首部所以可以理解为此时通过隧道传输。此时源 IP 为 DIP目标 IP 为 RIP。RS 接收到报文后发现是自己的 IP 地址就将报文接收下来拆除掉最外层的 IP 后会发现里面还有一层 IP 首部而且目标是自己的 lo 接口 VIP那么此时 RS 开始处理此请求处理完成之后通过 lo 接口送给 eth0 网卡然后向外传递。此时的源 IP 地址为 VIP目标 IP 为 CIP。响应报文最终送达至客户端。特点RIP、DIP、VIP 必须都是公网地址。RS 的网关不能也不可能指向 DIP。请求报文经由 Director 调度但响应报文将直接发给 CIP。不支持端口映射。RS 的 OS 必须支持 IP 隧道功能。调度算法LVS 的调度算法分为静态与动态两类。静态算法根据算法进行调度不考虑后端服务器的实际连接情况和负载情况。RR轮叫调度Round Robin调度器通过「轮叫」调度算法将外部请求按顺序轮流分配到集群中的真实服务器上它均等地对待每一台服务器而不管服务器上实际的连接数和系统负载。WRR加权轮叫Weight RR调度器通过「加权轮叫」调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况并动态地调整其权值。DH目标地址散列调度Destination Hash根据请求的目标 IP 地址作为散列键HashKey从静态分配的散列表找出对应的服务器若该服务器是可用的且未超载将请求发送到该服务器否则返回空。SH源地址 HashSource Hash源地址散列调度算法根据请求的源 IP 地址作为散列键HashKey从静态分配的散列表找出对应的服务器若该服务器是可用的且未超载将请求发送到该服务器否则返回空。动态算法前端的调度器会根据后端真实服务器的实际连接情况来分配请求。LC最少连接Least Connections调度器通过「最少连接」调度算法动态地将网络请求调度到已建立的连接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能采用「最小连接」调度算法可以较好地均衡负载。WLC加权最少连接Weighted Least Connections默认采用在集群系统中的服务器性能差异较大的情况下调度器采用「加权最少连接」调度算法优化负载均衡性能具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况并动态地调整其权值。SED最短延迟调度Shortest Expected Delay在 WLC 基础上改进Overhead (ACTIVE1) × 256 / 加权不再考虑非活动状态把当前处于活动状态的数目 1 来实现数目最小的接受下次请求。1 的目的是为了考虑加权的时候非活动连接过多的缺陷当权值过大的时候会导致空闲服务器一直处于无连接状态。NQ永不排队 / 最少队列调度Never Queue Scheduling无需队列。如果有台 Real Server 的连接数 0 就直接分配过去不需要再进行 SED 运算保证不会有一个主机很空闲。在 SED 基础上无论 几第二次一定给下一个保证不会有一个主机一直空闲着。不考虑非活动连接才用 NQSED 要考虑活动状态连接。对于 DNS 的 UDP 不需要考虑非活动连接而 httpd 的处于保持状态的服务就需要考虑非活动连接给服务器的压力。LBLC基于局部性的最少连接Locality-Based Least Connections基于局部性的最少连接调度算法是针对目标 IP 地址的负载均衡目前主要用于 Cache 集群系统。该算法根据请求的目标 IP 地址找出该目标 IP 地址最近使用的服务器若该服务器是可用的且没有超载将请求发送到该服务器若服务器不存在或者该服务器超载且有服务器处于一半的工作负载则用「最少连接」的原则选出一个可用的服务器将请求发送到该服务器。LBLCR带复制的基于局部性最少连接Locality-Based Least Connections with Replication带复制的基于局部性最少连接调度算法也是针对目标 IP 地址的负载均衡目前主要用于 Cache 集群系统。它与 LBLC 算法的不同之处是它要维护从一个目标 IP 地址到一组服务器的映射而 LBLC 算法维护从一个目标 IP 地址到一台服务器的映射。该算法根据请求的目标 IP 地址找出该目标 IP 地址对应的服务器组按「最小连接」原则从服务器组中选出一台服务器若服务器没有超载将请求发送到该服务器若服务器超载则按「最小连接」原则从这个集群中选出一台服务器将该服务器加入到服务器组中将请求发送到该服务器。同时当该服务器组有一段时间没有被修改将最忙的服务器从服务器组中删除以降低复制的程度。LVS 实践通过 LVS 实现 httpd 负载均衡。基本配置主机名与网络/etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 ###### lvs 代理集群 ######## # lvs 主机记录一定要设置为 VIP 地址 # 如果 lvs 主机解析为 10.1.8.10则会导致 ipvs 规则的 VIP 变为 10.1.8.10 10.1.1.10 lvs lvs.rich.cloud 10.1.8.11 web1 web1.rich.cloud 10.1.8.12 web2 web2.rich.cloud 10.1.8.13 web3 web3.rich.cloud 10.1.8.20 router router.rich.cloud 10.1.8.21 client1 client1.rich.cloud 10.1.1.21 client2 client2.rich.cloudWeb 服务器[rootweb1-3 ~]#yuminstall-ynginx systemctlenablenginx--nowechoWelcome to$(hostname)/usr/share/nginx/html/index.htmlLVS 服务器[rootlvs ~]#yuminstall-yipvsadm# systemctl enable ipvsadm# 等 ipvs 规则配置完成后再启动 ipvsadm 服务ipvsadm 命令定义集群服务ipvsadm -A|E -t|u|f service-address[-s scheduler][-p[timeout]][-M netmask]参数说明-A添加一个新的集群服务-E编辑一个集群服务-tTCP 协议-uUDP 协议-ffirewall-Mark防火墙标记service-address集群服务的 IP 地址即 VIP-s指定调度算法-p持久连接时长如ipvsadm -Lcn查看持久连接状态-M定义掩码删除与维护规则# 删除一个集群服务ipvsadm-D-t|u|f service-address# 清空所有的规则ipvsadm-C# 重新载入规则ipvsadm-R# 保存规则ipvsadm-S[-n]管理集群服务中的 Real Serveripvsadm -a|e -t|u|f service-address-rserver-address[-g|i|m][-w weight]参数说明-a添加一个新的 Real Server 规则-e编辑 Real Server 规则-g定义为 LVS-DR 模型-i定义为 LVS-TUN 模型-m定义为 LVS-NAT 模型-w定义权重# 删除一个 Real Serveripvsadm-d-t|u|f service-address-rserver-address# 查看定义的规则ipvsadm -L|l[options]ipvsadm-L-n# 清空计数器ipvsadm-Z[-t|u|f service-address]NAT 模式实验网络拓扑主机名IP 地址服务器角色client2.rich.cloud10.1.1.21客户端client1.rich.cloud10.1.8.21客户端router.rich.cloud10.1.1.20, 10.1.8.20路由器lvs.rich.cloud10.1.1.10, 10.1.8.10LVS 服务器web1.rich.cloud10.1.8.11Web 服务器web2.rich.cloud10.1.8.12Web 服务器web3.rich.cloud10.1.8.13Web 服务器网络说明所有主机第一块网卡名为 ens33第二块网卡名为 ens192。默认第一块网卡模式为 NAT第二块网卡模式为 hostonly。网关设置10.1.1.0/24 网段网关为 10.1.1.1010.1.8.0/24 网段网关为 10.1.8.10。注意本次实验的网关指向 LVS 服务器。基础配置网关配置命令参考# 10.1.8.0/24 网段网关为 10.1.8.10nmcli connection modify ens33 ipv4.gateway10.1.8.10 nmcli connection up ens33# 10.1.1.0/24 网段网关为 10.1.1.10nmcli connection modify ens33 ipv4.gateway10.1.1.10 nmcli connection up ens33配置 Web注意所有 Web 都要执行以下命令。# 部署 webyuminstall-ynginxechoWelcome to$(hostname)/usr/share/nginx/html/index.html systemctlenablenginx.service--now# 访问后端 nginx[rootclient1 ~]# curl 10.1.8.11Welcome to web1.rich.cloud[rootclient1 ~]# curl 10.1.8.12Welcome to web2.rich.cloud[rootclient1 ~]# curl 10.1.8.13Welcome to web3.rich.cloud配置 LVS[rootlvs ~]## 开启路由echonet.ipv4.ip_forward1/etc/sysctl.conf# 或者# sed -i s/ip_forward0/ip_forward1/g /etc/sysctl.confsysctl-p# 设置防火墙systemctlenablefirewalld.service--nowfirewall-cmd --set-default-zonetrusted firewall-cmd --add-masquerade--permanentfirewall-cmd --add-masquerade# 安装 ipvsadmyuminstall-yipvsadm# ipvsadm 服务启动的时候从该文件中读取 ipvs 规则touch/etc/sysconfig/ipvsadm systemctlenableipvsadm--now# 创建轮询负载## 增加一个 tcp 模式虚拟 IP调度模式轮询ipvsadm-A-t10.1.1.10:80-srr# 为虚拟 IP 增加后端真实主机模式 masqueradeNATipvsadm-a-t10.1.1.10:80-r10.1.8.11-mipvsadm-a-t10.1.1.10:80-r10.1.8.12-mipvsadm-a-t10.1.1.10:80-r10.1.8.13-m# 保存转发规则到文件中ipvsadm-save-n/etc/sysconfig/ipvsadm# 核实配置是否生效[rootlvs ~]# ipvsadm -LnIP Virtual Server version1.2.1(size4096)Prot LocalAddress:Port Scheduler Flags -RemoteAddress:Port Forward Weight ActiveConn InActConn TCP10.1.1.10:80 rr -10.1.8.11:80 Masq100-10.1.8.12:80 Masq100-10.1.8.13:80 Masq100# 多次访问验证[rootclient2 ~]# for i in {1..90};do curl -s 10.1.1.10 ;done|sort|uniq -c30Welcome to web1.rich.cloud30Welcome to web2.rich.cloud30Welcome to web3.rich.cloud负载均衡模式更改为加权轮询[rootlvs ~]## 修改调度模式为带权重的轮询ipvsadm-E-t10.1.1.10:80-swrr# 设置权重为 2ipvsadm-e-t10.1.1.10:80-r10.1.8.12-m-w2# 设置权重为 3ipvsadm-e-t10.1.1.10:80-r10.1.8.13-m-w3[rootlvs ~]# ipvsadm -LnProtLocalAddress:PortSchedulerRemoteAddress:PortForwardWeightActiveConnInActConnTCP10.1.1.10:80wrr10.1.8.11:80Masq103010.1.8.12:80Masq203010.1.8.13:80Masq3030访问验证[rootclient2 ~]# for i in {1..90};do curl -s 10.1.1.10 ;done|sort|uniq -c15Welcome to web1.rich.cloud30Welcome to web2.rich.cloud45Welcome to web3.rich.cloud思考1. 此时 client1 是否可以通过 10.1.1.10 访问后端服务器具体原因是什么答案不能访问。因为 client1 发出去的数据包是经过 LVS 的 ipvs 模块处理的而后端 Web 服务器收到数据包后根据来源地址 10.1.8.21 进行回复也就是直接返回给 client1导致数据包没有返回给 LVS 处理。2. 如果不能需要如何配置才能实现访问[rootweb1-3 ~]# nmcli connection modify ens33 ipv4.routes 10.1.8.21 255.255.255.255 10.1.8.10[rootweb1-3 ~]# nmcli connection up ens33DR 模式实验网络拓扑主机名IP 地址服务器角色client2.rich.cloud10.1.1.21客户端client1.rich.cloud10.1.8.21客户端router.rich.cloud10.1.1.20, 10.1.8.20路由器lvs.rich.cloud10.1.8.10LVS 服务器web1.rich.cloud10.1.8.11Web 服务器web2.rich.cloud10.1.8.12Web 服务器web3.rich.cloud10.1.8.13Web 服务器网络说明所有主机第一块网卡名为 ens33第二块网卡名为 ens192。默认第一块网卡模式为 NAT第二块网卡模式为 hostonly。网关设置10.1.1.0/24 网段网关为 10.1.1.2010.1.8.0/24 网段网关为 10.1.8.20。基础配置# 10.1.8.0/24 网段网关为 10.1.8.20nmcli connection modify ens33 ipv4.gateway10.1.8.20 nmcli connection up ens33# 10.1.1.0/24 网段网关为 10.1.1.20nmcli connection modify ens33 ipv4.gateway10.1.1.20 nmcli connection up ens33配置 Router# 开启路由echonet.ipv4.ip_forward1/etc/sysctl.conf# 或者# sed -i s/ip_forward0/ip_forward1/g /etc/sysctl.confsysctl-p配置 Web注意所有 Web 都要执行以下命令。# 部署 webyuminstall-ynginxechoWelcome to$(hostname)/usr/share/nginx/html/index.html systemctlenablenginx.service--now# 访问后端 nginx[rootclient1 ~]# curl 10.1.8.11Welcome to web1.rich.cloud[rootclient1 ~]# curl 10.1.8.12Welcome to web2.rich.cloud[rootclient1 ~]# curl 10.1.8.13Welcome to web3.rich.cloud配置 LVS-RS所有后端主机都要做相同配置。[rootweb1-3 ~]## 增加虚拟网卡子网掩码一定要设置为 32 位nmcli connectionaddtypedummy ifname dummy con-name dummy ipv4.method manual ipv4.addresses10.1.8.100/32 nmcli connection up dummy# 配置 arp 参数关闭 arp 对 dummy 网卡的解析cat/etc/sysctl.confEOF net.ipv4.conf.all.arp_ignore 1 net.ipv4.conf.all.arp_announce 2 net.ipv4.conf.dummy.arp_ignore 1 net.ipv4.conf.dummy.arp_announce 2 EOFsysctl-p内核参数net.ipv4.conf.all.arp_ignore作用控制主机收到 ARP 请求时是否回复 ARP 响应即是否告知对方「该 IP 对应的 MAC 地址是我」。参数值及含义参数值行为说明0默认只要本机有该 IP 地址无论哪个网卡就回复 ARP 响应。问题多网卡场景下可能导致「ARP 漂移」例如网卡 A 的 IP 被网卡 B 响应。1仅当 ARP 请求的目标 IP 与接收请求的网卡上的主 IP完全匹配时才回复响应。主 IP 指网卡配置的第一个 IP 地址2仅当 ARP 请求的目标 IP 与接收请求的网卡上的任一 IP包括 secondary IP匹配时才回复响应。3不回复 ARP 请求除非是本地环回地址。4-7更复杂的策略如忽略来自非本网络的请求较少使用。典型场景服务器有多个网卡如 eth0、eth1分别属于不同子网需避免跨网卡响应 ARP 请求。配置虚拟 IP如 Keepalived 高可用集群的 VIP时防止非主节点响应 VIP 的 ARP 请求。内核参数net.ipv4.conf.all.arp_announce作用控制主机发送 ARP 通告主动告知「我的 IP 对应的 MAC 地址」时如何选择源 IP 地址。参数值及含义参数值行为说明0默认允许使用任意本地 IP 作为 ARP 通告的源 IP可能选择与目标网络无关的 IP。问题跨子网通信时可能导致其他主机学习到错误的 IP-MAC 映射。1尽量使用与目标 IP 同子网的本地 IP 作为源 IP若没有则使用接收接口的 IP。2推荐严格选择与目标 IP 同子网的本地 IP 作为源 IP若没有则不发送 ARP 通告或使用环回地址。典型场景多网卡服务器访问外部网络时确保 ARP 通告的源 IP 属于目标网络所在的子网避免其他主机误将 IP 关联到错误的网卡 MAC。负载均衡或高可用集群中防止虚拟 IP 被错误的物理网卡 MAC 通告。配置 LVS-DS[rootlvs ~]## 配置虚拟网卡nmcli connectionaddtypedummy ifname dummy con-name dummy ipv4.method manual ipv4.addresses10.1.8.100/32 nmcli connection up dummy# 安装 ipvsadmyuminstall-yipvsadmtouch/etc/sysconfig/ipvsadm systemctlenableipvsadm--now# 创建轮询负载ipvsadm-A-t10.1.8.100:80-srr ipvsadm-a-t10.1.8.100:80-r10.1.8.11:80-gipvsadm-a-t10.1.8.100:80-r10.1.8.12:80-gipvsadm-a-t10.1.8.100:80-r10.1.8.13:80-gipvsadm-save-n/etc/sysconfig/ipvsadm# 核实配置是否生效[rootlvs ~]# ipvsadm -LnProtLocalAddress:PortSchedulerRemoteAddress:PortForwardWeightActiveConnInActConnTCP10.1.8.100:80rr10.1.8.11:80Route10010.1.8.12:80Route10010.1.8.13:80Route100Forward 值为Route代表当前模式为 DR。访问验证[rootclient2 ~]# for i in {1..90};do curl -s 10.1.8.100 ;done|sort|uniq -c30Welcome to web1.rich.cloud30Welcome to web2.rich.cloud30Welcome to web3.rich.cloud[rootclient1 ~]# for i in {1..90};do curl -s 10.1.8.100 ;done|sort|uniq -c30Welcome to web1.rich.cloud30Welcome to web2.rich.cloud30Welcome to web3.rich.cloud参考脚本Real Server 配置#!/bin/bash# description : 配置 Real Server./etc/rc.d/init.d/functionsVIP10.1.8.100case$1instart)echo-nStart LVS Real Server ... # 设置 VIPifnmcli connection|grep-qdummy;thennmcli connection modify dummy ipv4.method manual ipv4.addresses$VIP/32elsenmcli connectionaddtypedummy ifname dummy con-name dummy\ipv4.method manual ipv4.addresses$VIP/32finmcli connection up dummy# 关闭 ARPecho1/proc/sys/net/ipv4/conf/all/arp_ignoreecho2/proc/sys/net/ipv4/conf/all/arp_announceecho1/proc/sys/net/ipv4/conf/dummy/arp_ignoreecho2/proc/sys/net/ipv4/conf/dummy/arp_announceechoOK;;stop)echo-nStop LVS Real Server ... # 关闭 VIPnmcli connection delete dummy# 启用 ARPecho0/proc/sys/net/ipv4/conf/dummy/arp_ignoreecho0/proc/sys/net/ipv4/conf/dummy/arp_announceecho0/proc/sys/net/ipv4/conf/all/arp_ignoreecho0/proc/sys/net/ipv4/conf/all/arp_announceechoOK;;*)echoUsage:$0start|stopexit1;;esacDirector Server 配置#!/bin/bash# description : 配置 Director Server./etc/rc.d/init.d/functions# 安装 ipvsadmifrpm-qipvsadm/dev/null;thentrueelseyuminstall-yipvsadm/dev/nullfiVIP10.1.8.100PORT80rs110.1.8.11rs210.1.8.12rs310.1.8.13interfaceens33con_nameens33ipv/sbin/ipvsadmcase$1instart)echo-nStart LVS Director Server ... # 设置 VIPifip-braddr|grep-q$VIP;thentrueelsenmcli connection modify${con_name}ipv4.addresses$VIP/32 nmcli connection up${con_name}fi# 设置 LB$ipv-C$ipv-A-t$VIP:${PORT}-swrr$ipv-a-t$VIP:${PORT}-r$rs1:${PORT}-g-w1$ipv-a-t$VIP:${PORT}-r$rs2:${PORT}-g-w1$ipv-a-t$VIP:${PORT}-r$rs3:${PORT}-g-w1echoOK;;stop)echo-nStop LVS Director Server ... # 关闭 VIPifip-braddr|grep-q$VIP;thennmcli connection modify${con_name}-ipv4.addresses$VIP/32 nmcli connection up${con_name}fi# 关闭 LB$ipv-CechoOK;;*)echoUsage:$0start|stopexit1;;esac
LVS 实验搭建
LVS 实验搭建LVS 介绍Linux 虚拟服务器LVSLinux Virtual Servers使用负载均衡技术将多台服务器组成一个虚拟服务器。它为适应快速增长的网络访问需求提供了一个负载能力易于扩展、价格低廉的解决方案。LVS 是章文嵩博士于 1998 年创建的一款开源负载均衡软件。LVS 工作在内核空间中能够根据请求报文的目标 IP 和目标 PORT将请求调度转发至后端服务器集群中的某节点。LVS 术语调度器负载均衡器DirectorVirtual ServerVS后端服务器真实服务器Real ServerRSBackend Server调度器一般配置两个 IP 地址VIP向外提供服务的 IP 地址DIP与后端 RS 通信的 IP 地址RIPRS 的 IPCIP客户端的 IPLVS 由ipvsadm和ipvs组成ipvsadm用户空间命令行工具用于在 Director 上定义集群服务和添加集群上的 Real Serversipvs工作于内核 netfilter 中 INPUT 钩子上的程序代码要想将某台主机配置为 Director首先应确保当前内核支持 ipvs 并安装 ipvsadm。另外由于 Director 要调度转发所有客户端的请求负载压力较大生产环境中 Director 不要使用虚拟机。工作原理ipvs 使用内核 netfilter 子系统处理进入本机器的数据包当用户向负载均衡调度器Director Server发起请求调度器将请求发往内核空间。PREROUTING 链首先会接收到用户请求判断目标 IP 确定是本机 IP将数据包发往 INPUT 链。IPVS 是工作在 INPUT 链上的代码块。当用户请求到达 INPUT 时IPVS 会将用户请求和自己已定义好的集群服务进行比对如果用户请求的就是定义的集群服务那么此时 IPVS 会强行修改数据包里的目标 IP 地址及端口并将新的数据包发往 POSTROUTING 链。POSTROUTING 链接收数据包后发现目标 IP 地址刚好是自己的后端服务器那么此时通过选路将数据包最终发送给后端的服务器。工作模式LVS 的常用工作模式有四种分别是lvs-natlvs-drlvs-tunlvs-fullnatNAT 模式工作方式通过将请求报文的目标地址和目标端口修改为某 RS 的 IP 和 PORT 来实现报文转发。原报文源IP源MAC目标IP目标MACClient IPClient MACDirector VIPDirector MAC更改为源IP源MAC目标IP目标MACClient IPClient MACRS IPRS MAC工作原理当用户请求到达 Director Server此时请求的数据报文会先到内核空间的 PREROUTING 链。此时报文的源 IP 为 CIP目标 IP 为 VIP。PREROUTING 检查发现数据包的目标 IP 是本机将数据包送至 INPUT 链。IPVS 比对数据包请求的服务是否为集群服务若是修改数据包的目标 IP 地址为后端服务器 IP后将数据包发至 POSTROUTING 链。此时报文的源 IP 为 CIP目标 IP 为 RIP。POSTROUTING 链通过选路将数据包发送给 Real Server。Real Server 比对发现目标为自己的 IP开始构建响应报文发回给 Director Server。此时报文的源 IP 为 RIP目标 IP 为 CIP。Director Server 在响应客户端前会将源 IP 地址修改为自己的 VIP 地址然后响应给客户端。此时报文的源 IP 为 VIP目标 IP 为 CIP。特点RS 和 DIP 应使用私网地址且 RS 的网关要指向 DIP。请求和响应报文都要经由 Director 转发极高负载的场景中Director 可能会成为系统瓶颈。支持端口映射。RS 可以使用任意 OS。RS 的 RIP 和 Director 的 DIP 必须在同一 IP 网络。缺陷对 Director Server 压力会比较大请求和响应都需经过 Director ServerDirector 往往会成为系统的性能瓶颈。DR 模式工作方式通过为请求报文重新封装一个 MAC 首部进行报文转发新 MAC 首部的源 MAC 是 DIP 所在网卡的 MAC目标 MAC 为某 RS 所在接口的 MAC整个过程源报文的 IP 首部不会发生变化源 IP 为 CIP目标 IP 始终为 VIP。原报文源IP源MAC目标IP目标MACClient IPClient MACDirector VIPDirector MAC更改为源IP源MAC目标IP目标MACClient IPDirector DIP 对应的 MACDirector VIPRS MAC工作原理当用户请求到达 Director Server此时请求的数据报文会先到内核空间的 PREROUTING 链。此时报文的源 IP 为 CIP目标 IP 为 VIP。PREROUTING 检查发现数据包的目标 IP 是本机将数据包送至 INPUT 链。IPVS 比对数据包请求的服务是否为集群服务若是将请求报文中的源 MAC 地址修改为 DIP 的 MAC 地址将目标 MAC 地址修改为 RIP 的 MAC 地址然后将数据包发至 POSTROUTING 链。此时的源 IP 和目的 IP 均未修改仅修改了源 MAC 地址为 DIP 的 MAC 地址目标 MAC 地址为 RIP 的 MAC 地址。POSTROUTING 链发现目标 MAC 地址为 RIP 的 MAC 地址那么此时数据包将会发至 Real Server。RS 发现请求报文的 MAC 地址是自己的 MAC 地址就接收此报文。处理完成之后将响应报文通过 lo 接口传送给 eth0 网卡然后向外发出。此时的源 IP 地址为 VIP目标 IP 为 CIP。响应报文最终送达至客户端。特点RS 的 lo 网卡配置一个 IP 地址地址为 VIP。确保路由器只会把目标 IP 为 VIP 的请求报文发往 Director即会忽略 RS 上的 VIP。实现方案如下路由器静态绑定 Director 的 VIP 和 MAC 地址禁止 RS 响应 VIP 的 ARP 请求arptables修改各 RS 的内核参数并把 VIP 配置在特定的接口上实现禁止其响应。RS 的 RIP 跟 Director 的 DIP 必须在同一物理网络中RS 的网关不能指向 DIP。RS 的 RIP 可以使用私有地址也可以使用公网地址。请求报文必须由 Director 调度但响应报文不经过 DirectorRS 直接用 VIP 作为源 IP 发送响应报文。不支持端口映射。缺陷RS 和 DS 必须在同一机房中因为它是由二层进行转发的根据 MAC 地址来进行匹配。TUN 模式工作方式不修改请求报文的 IP 首部源 IP 仍为 CIP目标 IP 仍为 VIP而是在原有的 IP 首部之外再封装一个 IP 首部源 IP 为 DIP目标 IP 为 RIP。原报文源IP源MAC目标IP目标MACClient IPClient MACDirector VIPDirector MAC更改为封装源IP封装目标IP源IP源MAC目标IP目标MACDIPRIPClient IPClient MACDirector VIPDirector MAC工作原理当用户请求到达 Director Server此时请求的数据报文会先到内核空间的 PREROUTING 链。此时报文的源 IP 为 CIP目标 IP 为 VIP。PREROUTING 检查发现数据包的目标 IP 是本机将数据包送至 INPUT 链。IPVS 比对数据包请求的服务是否为集群服务若是在请求报文的首部再次封装一层 IP 报文封装源 IP 为 DIP目标 IP 为 RIP然后发至 POSTROUTING 链。此时源 IP 为 DIP目标 IP 为 RIP。POSTROUTING 链根据最新封装的 IP 报文将数据包发至 RS因为在外层封装多了一层 IP 首部所以可以理解为此时通过隧道传输。此时源 IP 为 DIP目标 IP 为 RIP。RS 接收到报文后发现是自己的 IP 地址就将报文接收下来拆除掉最外层的 IP 后会发现里面还有一层 IP 首部而且目标是自己的 lo 接口 VIP那么此时 RS 开始处理此请求处理完成之后通过 lo 接口送给 eth0 网卡然后向外传递。此时的源 IP 地址为 VIP目标 IP 为 CIP。响应报文最终送达至客户端。特点RIP、DIP、VIP 必须都是公网地址。RS 的网关不能也不可能指向 DIP。请求报文经由 Director 调度但响应报文将直接发给 CIP。不支持端口映射。RS 的 OS 必须支持 IP 隧道功能。调度算法LVS 的调度算法分为静态与动态两类。静态算法根据算法进行调度不考虑后端服务器的实际连接情况和负载情况。RR轮叫调度Round Robin调度器通过「轮叫」调度算法将外部请求按顺序轮流分配到集群中的真实服务器上它均等地对待每一台服务器而不管服务器上实际的连接数和系统负载。WRR加权轮叫Weight RR调度器通过「加权轮叫」调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况并动态地调整其权值。DH目标地址散列调度Destination Hash根据请求的目标 IP 地址作为散列键HashKey从静态分配的散列表找出对应的服务器若该服务器是可用的且未超载将请求发送到该服务器否则返回空。SH源地址 HashSource Hash源地址散列调度算法根据请求的源 IP 地址作为散列键HashKey从静态分配的散列表找出对应的服务器若该服务器是可用的且未超载将请求发送到该服务器否则返回空。动态算法前端的调度器会根据后端真实服务器的实际连接情况来分配请求。LC最少连接Least Connections调度器通过「最少连接」调度算法动态地将网络请求调度到已建立的连接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能采用「最小连接」调度算法可以较好地均衡负载。WLC加权最少连接Weighted Least Connections默认采用在集群系统中的服务器性能差异较大的情况下调度器采用「加权最少连接」调度算法优化负载均衡性能具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况并动态地调整其权值。SED最短延迟调度Shortest Expected Delay在 WLC 基础上改进Overhead (ACTIVE1) × 256 / 加权不再考虑非活动状态把当前处于活动状态的数目 1 来实现数目最小的接受下次请求。1 的目的是为了考虑加权的时候非活动连接过多的缺陷当权值过大的时候会导致空闲服务器一直处于无连接状态。NQ永不排队 / 最少队列调度Never Queue Scheduling无需队列。如果有台 Real Server 的连接数 0 就直接分配过去不需要再进行 SED 运算保证不会有一个主机很空闲。在 SED 基础上无论 几第二次一定给下一个保证不会有一个主机一直空闲着。不考虑非活动连接才用 NQSED 要考虑活动状态连接。对于 DNS 的 UDP 不需要考虑非活动连接而 httpd 的处于保持状态的服务就需要考虑非活动连接给服务器的压力。LBLC基于局部性的最少连接Locality-Based Least Connections基于局部性的最少连接调度算法是针对目标 IP 地址的负载均衡目前主要用于 Cache 集群系统。该算法根据请求的目标 IP 地址找出该目标 IP 地址最近使用的服务器若该服务器是可用的且没有超载将请求发送到该服务器若服务器不存在或者该服务器超载且有服务器处于一半的工作负载则用「最少连接」的原则选出一个可用的服务器将请求发送到该服务器。LBLCR带复制的基于局部性最少连接Locality-Based Least Connections with Replication带复制的基于局部性最少连接调度算法也是针对目标 IP 地址的负载均衡目前主要用于 Cache 集群系统。它与 LBLC 算法的不同之处是它要维护从一个目标 IP 地址到一组服务器的映射而 LBLC 算法维护从一个目标 IP 地址到一台服务器的映射。该算法根据请求的目标 IP 地址找出该目标 IP 地址对应的服务器组按「最小连接」原则从服务器组中选出一台服务器若服务器没有超载将请求发送到该服务器若服务器超载则按「最小连接」原则从这个集群中选出一台服务器将该服务器加入到服务器组中将请求发送到该服务器。同时当该服务器组有一段时间没有被修改将最忙的服务器从服务器组中删除以降低复制的程度。LVS 实践通过 LVS 实现 httpd 负载均衡。基本配置主机名与网络/etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 ###### lvs 代理集群 ######## # lvs 主机记录一定要设置为 VIP 地址 # 如果 lvs 主机解析为 10.1.8.10则会导致 ipvs 规则的 VIP 变为 10.1.8.10 10.1.1.10 lvs lvs.rich.cloud 10.1.8.11 web1 web1.rich.cloud 10.1.8.12 web2 web2.rich.cloud 10.1.8.13 web3 web3.rich.cloud 10.1.8.20 router router.rich.cloud 10.1.8.21 client1 client1.rich.cloud 10.1.1.21 client2 client2.rich.cloudWeb 服务器[rootweb1-3 ~]#yuminstall-ynginx systemctlenablenginx--nowechoWelcome to$(hostname)/usr/share/nginx/html/index.htmlLVS 服务器[rootlvs ~]#yuminstall-yipvsadm# systemctl enable ipvsadm# 等 ipvs 规则配置完成后再启动 ipvsadm 服务ipvsadm 命令定义集群服务ipvsadm -A|E -t|u|f service-address[-s scheduler][-p[timeout]][-M netmask]参数说明-A添加一个新的集群服务-E编辑一个集群服务-tTCP 协议-uUDP 协议-ffirewall-Mark防火墙标记service-address集群服务的 IP 地址即 VIP-s指定调度算法-p持久连接时长如ipvsadm -Lcn查看持久连接状态-M定义掩码删除与维护规则# 删除一个集群服务ipvsadm-D-t|u|f service-address# 清空所有的规则ipvsadm-C# 重新载入规则ipvsadm-R# 保存规则ipvsadm-S[-n]管理集群服务中的 Real Serveripvsadm -a|e -t|u|f service-address-rserver-address[-g|i|m][-w weight]参数说明-a添加一个新的 Real Server 规则-e编辑 Real Server 规则-g定义为 LVS-DR 模型-i定义为 LVS-TUN 模型-m定义为 LVS-NAT 模型-w定义权重# 删除一个 Real Serveripvsadm-d-t|u|f service-address-rserver-address# 查看定义的规则ipvsadm -L|l[options]ipvsadm-L-n# 清空计数器ipvsadm-Z[-t|u|f service-address]NAT 模式实验网络拓扑主机名IP 地址服务器角色client2.rich.cloud10.1.1.21客户端client1.rich.cloud10.1.8.21客户端router.rich.cloud10.1.1.20, 10.1.8.20路由器lvs.rich.cloud10.1.1.10, 10.1.8.10LVS 服务器web1.rich.cloud10.1.8.11Web 服务器web2.rich.cloud10.1.8.12Web 服务器web3.rich.cloud10.1.8.13Web 服务器网络说明所有主机第一块网卡名为 ens33第二块网卡名为 ens192。默认第一块网卡模式为 NAT第二块网卡模式为 hostonly。网关设置10.1.1.0/24 网段网关为 10.1.1.1010.1.8.0/24 网段网关为 10.1.8.10。注意本次实验的网关指向 LVS 服务器。基础配置网关配置命令参考# 10.1.8.0/24 网段网关为 10.1.8.10nmcli connection modify ens33 ipv4.gateway10.1.8.10 nmcli connection up ens33# 10.1.1.0/24 网段网关为 10.1.1.10nmcli connection modify ens33 ipv4.gateway10.1.1.10 nmcli connection up ens33配置 Web注意所有 Web 都要执行以下命令。# 部署 webyuminstall-ynginxechoWelcome to$(hostname)/usr/share/nginx/html/index.html systemctlenablenginx.service--now# 访问后端 nginx[rootclient1 ~]# curl 10.1.8.11Welcome to web1.rich.cloud[rootclient1 ~]# curl 10.1.8.12Welcome to web2.rich.cloud[rootclient1 ~]# curl 10.1.8.13Welcome to web3.rich.cloud配置 LVS[rootlvs ~]## 开启路由echonet.ipv4.ip_forward1/etc/sysctl.conf# 或者# sed -i s/ip_forward0/ip_forward1/g /etc/sysctl.confsysctl-p# 设置防火墙systemctlenablefirewalld.service--nowfirewall-cmd --set-default-zonetrusted firewall-cmd --add-masquerade--permanentfirewall-cmd --add-masquerade# 安装 ipvsadmyuminstall-yipvsadm# ipvsadm 服务启动的时候从该文件中读取 ipvs 规则touch/etc/sysconfig/ipvsadm systemctlenableipvsadm--now# 创建轮询负载## 增加一个 tcp 模式虚拟 IP调度模式轮询ipvsadm-A-t10.1.1.10:80-srr# 为虚拟 IP 增加后端真实主机模式 masqueradeNATipvsadm-a-t10.1.1.10:80-r10.1.8.11-mipvsadm-a-t10.1.1.10:80-r10.1.8.12-mipvsadm-a-t10.1.1.10:80-r10.1.8.13-m# 保存转发规则到文件中ipvsadm-save-n/etc/sysconfig/ipvsadm# 核实配置是否生效[rootlvs ~]# ipvsadm -LnIP Virtual Server version1.2.1(size4096)Prot LocalAddress:Port Scheduler Flags -RemoteAddress:Port Forward Weight ActiveConn InActConn TCP10.1.1.10:80 rr -10.1.8.11:80 Masq100-10.1.8.12:80 Masq100-10.1.8.13:80 Masq100# 多次访问验证[rootclient2 ~]# for i in {1..90};do curl -s 10.1.1.10 ;done|sort|uniq -c30Welcome to web1.rich.cloud30Welcome to web2.rich.cloud30Welcome to web3.rich.cloud负载均衡模式更改为加权轮询[rootlvs ~]## 修改调度模式为带权重的轮询ipvsadm-E-t10.1.1.10:80-swrr# 设置权重为 2ipvsadm-e-t10.1.1.10:80-r10.1.8.12-m-w2# 设置权重为 3ipvsadm-e-t10.1.1.10:80-r10.1.8.13-m-w3[rootlvs ~]# ipvsadm -LnProtLocalAddress:PortSchedulerRemoteAddress:PortForwardWeightActiveConnInActConnTCP10.1.1.10:80wrr10.1.8.11:80Masq103010.1.8.12:80Masq203010.1.8.13:80Masq3030访问验证[rootclient2 ~]# for i in {1..90};do curl -s 10.1.1.10 ;done|sort|uniq -c15Welcome to web1.rich.cloud30Welcome to web2.rich.cloud45Welcome to web3.rich.cloud思考1. 此时 client1 是否可以通过 10.1.1.10 访问后端服务器具体原因是什么答案不能访问。因为 client1 发出去的数据包是经过 LVS 的 ipvs 模块处理的而后端 Web 服务器收到数据包后根据来源地址 10.1.8.21 进行回复也就是直接返回给 client1导致数据包没有返回给 LVS 处理。2. 如果不能需要如何配置才能实现访问[rootweb1-3 ~]# nmcli connection modify ens33 ipv4.routes 10.1.8.21 255.255.255.255 10.1.8.10[rootweb1-3 ~]# nmcli connection up ens33DR 模式实验网络拓扑主机名IP 地址服务器角色client2.rich.cloud10.1.1.21客户端client1.rich.cloud10.1.8.21客户端router.rich.cloud10.1.1.20, 10.1.8.20路由器lvs.rich.cloud10.1.8.10LVS 服务器web1.rich.cloud10.1.8.11Web 服务器web2.rich.cloud10.1.8.12Web 服务器web3.rich.cloud10.1.8.13Web 服务器网络说明所有主机第一块网卡名为 ens33第二块网卡名为 ens192。默认第一块网卡模式为 NAT第二块网卡模式为 hostonly。网关设置10.1.1.0/24 网段网关为 10.1.1.2010.1.8.0/24 网段网关为 10.1.8.20。基础配置# 10.1.8.0/24 网段网关为 10.1.8.20nmcli connection modify ens33 ipv4.gateway10.1.8.20 nmcli connection up ens33# 10.1.1.0/24 网段网关为 10.1.1.20nmcli connection modify ens33 ipv4.gateway10.1.1.20 nmcli connection up ens33配置 Router# 开启路由echonet.ipv4.ip_forward1/etc/sysctl.conf# 或者# sed -i s/ip_forward0/ip_forward1/g /etc/sysctl.confsysctl-p配置 Web注意所有 Web 都要执行以下命令。# 部署 webyuminstall-ynginxechoWelcome to$(hostname)/usr/share/nginx/html/index.html systemctlenablenginx.service--now# 访问后端 nginx[rootclient1 ~]# curl 10.1.8.11Welcome to web1.rich.cloud[rootclient1 ~]# curl 10.1.8.12Welcome to web2.rich.cloud[rootclient1 ~]# curl 10.1.8.13Welcome to web3.rich.cloud配置 LVS-RS所有后端主机都要做相同配置。[rootweb1-3 ~]## 增加虚拟网卡子网掩码一定要设置为 32 位nmcli connectionaddtypedummy ifname dummy con-name dummy ipv4.method manual ipv4.addresses10.1.8.100/32 nmcli connection up dummy# 配置 arp 参数关闭 arp 对 dummy 网卡的解析cat/etc/sysctl.confEOF net.ipv4.conf.all.arp_ignore 1 net.ipv4.conf.all.arp_announce 2 net.ipv4.conf.dummy.arp_ignore 1 net.ipv4.conf.dummy.arp_announce 2 EOFsysctl-p内核参数net.ipv4.conf.all.arp_ignore作用控制主机收到 ARP 请求时是否回复 ARP 响应即是否告知对方「该 IP 对应的 MAC 地址是我」。参数值及含义参数值行为说明0默认只要本机有该 IP 地址无论哪个网卡就回复 ARP 响应。问题多网卡场景下可能导致「ARP 漂移」例如网卡 A 的 IP 被网卡 B 响应。1仅当 ARP 请求的目标 IP 与接收请求的网卡上的主 IP完全匹配时才回复响应。主 IP 指网卡配置的第一个 IP 地址2仅当 ARP 请求的目标 IP 与接收请求的网卡上的任一 IP包括 secondary IP匹配时才回复响应。3不回复 ARP 请求除非是本地环回地址。4-7更复杂的策略如忽略来自非本网络的请求较少使用。典型场景服务器有多个网卡如 eth0、eth1分别属于不同子网需避免跨网卡响应 ARP 请求。配置虚拟 IP如 Keepalived 高可用集群的 VIP时防止非主节点响应 VIP 的 ARP 请求。内核参数net.ipv4.conf.all.arp_announce作用控制主机发送 ARP 通告主动告知「我的 IP 对应的 MAC 地址」时如何选择源 IP 地址。参数值及含义参数值行为说明0默认允许使用任意本地 IP 作为 ARP 通告的源 IP可能选择与目标网络无关的 IP。问题跨子网通信时可能导致其他主机学习到错误的 IP-MAC 映射。1尽量使用与目标 IP 同子网的本地 IP 作为源 IP若没有则使用接收接口的 IP。2推荐严格选择与目标 IP 同子网的本地 IP 作为源 IP若没有则不发送 ARP 通告或使用环回地址。典型场景多网卡服务器访问外部网络时确保 ARP 通告的源 IP 属于目标网络所在的子网避免其他主机误将 IP 关联到错误的网卡 MAC。负载均衡或高可用集群中防止虚拟 IP 被错误的物理网卡 MAC 通告。配置 LVS-DS[rootlvs ~]## 配置虚拟网卡nmcli connectionaddtypedummy ifname dummy con-name dummy ipv4.method manual ipv4.addresses10.1.8.100/32 nmcli connection up dummy# 安装 ipvsadmyuminstall-yipvsadmtouch/etc/sysconfig/ipvsadm systemctlenableipvsadm--now# 创建轮询负载ipvsadm-A-t10.1.8.100:80-srr ipvsadm-a-t10.1.8.100:80-r10.1.8.11:80-gipvsadm-a-t10.1.8.100:80-r10.1.8.12:80-gipvsadm-a-t10.1.8.100:80-r10.1.8.13:80-gipvsadm-save-n/etc/sysconfig/ipvsadm# 核实配置是否生效[rootlvs ~]# ipvsadm -LnProtLocalAddress:PortSchedulerRemoteAddress:PortForwardWeightActiveConnInActConnTCP10.1.8.100:80rr10.1.8.11:80Route10010.1.8.12:80Route10010.1.8.13:80Route100Forward 值为Route代表当前模式为 DR。访问验证[rootclient2 ~]# for i in {1..90};do curl -s 10.1.8.100 ;done|sort|uniq -c30Welcome to web1.rich.cloud30Welcome to web2.rich.cloud30Welcome to web3.rich.cloud[rootclient1 ~]# for i in {1..90};do curl -s 10.1.8.100 ;done|sort|uniq -c30Welcome to web1.rich.cloud30Welcome to web2.rich.cloud30Welcome to web3.rich.cloud参考脚本Real Server 配置#!/bin/bash# description : 配置 Real Server./etc/rc.d/init.d/functionsVIP10.1.8.100case$1instart)echo-nStart LVS Real Server ... # 设置 VIPifnmcli connection|grep-qdummy;thennmcli connection modify dummy ipv4.method manual ipv4.addresses$VIP/32elsenmcli connectionaddtypedummy ifname dummy con-name dummy\ipv4.method manual ipv4.addresses$VIP/32finmcli connection up dummy# 关闭 ARPecho1/proc/sys/net/ipv4/conf/all/arp_ignoreecho2/proc/sys/net/ipv4/conf/all/arp_announceecho1/proc/sys/net/ipv4/conf/dummy/arp_ignoreecho2/proc/sys/net/ipv4/conf/dummy/arp_announceechoOK;;stop)echo-nStop LVS Real Server ... # 关闭 VIPnmcli connection delete dummy# 启用 ARPecho0/proc/sys/net/ipv4/conf/dummy/arp_ignoreecho0/proc/sys/net/ipv4/conf/dummy/arp_announceecho0/proc/sys/net/ipv4/conf/all/arp_ignoreecho0/proc/sys/net/ipv4/conf/all/arp_announceechoOK;;*)echoUsage:$0start|stopexit1;;esacDirector Server 配置#!/bin/bash# description : 配置 Director Server./etc/rc.d/init.d/functions# 安装 ipvsadmifrpm-qipvsadm/dev/null;thentrueelseyuminstall-yipvsadm/dev/nullfiVIP10.1.8.100PORT80rs110.1.8.11rs210.1.8.12rs310.1.8.13interfaceens33con_nameens33ipv/sbin/ipvsadmcase$1instart)echo-nStart LVS Director Server ... # 设置 VIPifip-braddr|grep-q$VIP;thentrueelsenmcli connection modify${con_name}ipv4.addresses$VIP/32 nmcli connection up${con_name}fi# 设置 LB$ipv-C$ipv-A-t$VIP:${PORT}-swrr$ipv-a-t$VIP:${PORT}-r$rs1:${PORT}-g-w1$ipv-a-t$VIP:${PORT}-r$rs2:${PORT}-g-w1$ipv-a-t$VIP:${PORT}-r$rs3:${PORT}-g-w1echoOK;;stop)echo-nStop LVS Director Server ... # 关闭 VIPifip-braddr|grep-q$VIP;thennmcli connection modify${con_name}-ipv4.addresses$VIP/32 nmcli connection up${con_name}fi# 关闭 LB$ipv-CechoOK;;*)echoUsage:$0start|stopexit1;;esac