1.1 LVS/DR模式介绍
-
双地址配置:所有真实服务器(RS)都需要配置两个IP地址:一个是真实服务器的IP地址(RIP),另一个是虚拟服务器的IP地址(VIP),后者与LVS上的VIP一致。
-
二层网络要求:LVS必须与所有RS处于同一二层广播域内,这样LVS才能通过ARP协议获取到RS的IP地址和对应的MAC地址。
-
请求转发:当用户发送请求到LVS时,LVS在转发请求到选定的RS时,保持请求报文的源和目的IP地址及端口号不变。LVS更改报文的源MAC地址为自己的MAC地址,目的MAC地址更改为RS的MAC地址。
-
MAC地址修改:LVS在DR模式下将请求报文的源MAC地址替换为自身的MAC地址,目的MAC地址替换为选定RS的MAC地址。
-
IP地址保持不变:在转发过程中,请求报文的源IP地址和目的IP地址以及端口号都保持原始客户端的值不变。
-
响应直接返回:RS处理请求后,响应报文直接发送回客户端,不经过LVS,减轻了LVS的负荷。
-
VIP配置一致性:RS上配置的VIP需与LVS的VIP一致,以确保请求能够正确地分发到RS。
-
ARP广播禁用:为避免IP地址冲突,RS上的VIP地址相关网卡需关闭ARP广播和应答功能。
-
VIP配置位置:VIP通常配置在回环口上,这样做可以提高配置的灵活性并避免地址冲突。
-
同一网段要求:LVS的DIP和RS的RIP需在同一网段内,这是DR模式的一个限制。
-
端口号不支持修改:在DR模式中,LVS不支持修改请求报文的目的端口号。
-
部署限制:由于DIP和RIP必须在同一网段,DR模式不适合用于大规模或远距离部署,限制了其在大型分布式系统中的应用。
1.2 LVS/DR模式与NAT模式对比
特性/方面 | LVS/DR模式 | LVS/NAT模式 |
---|---|---|
工作原理 | 修改数据包的MAC地址,不改变IP地址 | 修改数据包的目的IP地址和MAC地址 |
请求处理 | 请求报文经过LVS,响应报文直接从RS返回给客户端 | 请求和响应报文都需要经过LVS |
网络要求 | LVS和RS必须在同一物理网络 | LVS作为RS的网关,通常在同一网络 |
VIP配置 | RS上的VIP配置在lo接口的别名上 | VIP作为整个群集的外部IP地址 |
端口要求 | RS和LVS的VIP提供服务的端口必须一致 | 支持端口映射,VIP端口可以与RS端口不同 |
性能效率 | 高性能,响应快速,因为响应不经过LVS | 相对较低,因为所有流量都需经过LVS,可能成为瓶颈 |
适用场景 | 大型、高负载且对性能要求极高的场景 | 中小型应用,配置相对简单 |
扩展性 | 由于网络限制,不适合大规模或远距离部署 | 伸缩能力有限,但可以跨网络部署 |
安全性 | 较高,因为响应流量不经过LVS | 由于流量均需经过LVS,可能面临更大的安全风险 |
地址冲突 | 需要注意ARP广播和应答的配置以避免冲突 | 无特殊地址冲突问题 |
RS的网关设置 | RS的网关不能指向DIP | RS的网关必须指向LVS的DIP |
1.3 LVS/DR模式ARP抑制
-
LVS-DR模式中,ARP抑制是一个重要的配置步骤,其目的是保证网络流量正确地通过LVS调度器进行分发,同时避免因ARP广播导致网络混乱。
1.3.1 原因:
-
避免ARP广播导致混乱:在LVS-DR模式下,LVS调度器(Director Server)和真实服务器(Real Server, RS)都配置有相同的虚拟IP地址(VIP)。如果不进行ARP抑制,当ARP请求到达时,所有配置了该VIP的服务器都可能响应,导致网络中充斥着大量错误的MAC地址信息,从而使得流量不能正确地通过LVS进行负载均衡。
-
确保流量正确分发:ARP抑制确保只有LVS调度器响应ARP请求,RS不响应,这样客户端的请求将被LVS调度器接收,并根据配置的规则分发到不同的RS。
1.3.2 修改内核参数做ARP抑制
-
在 Linux 系统中,可以通过以下两个参数来配置 ARP 抑制:
-
net.ipv4.conf.< interface >.arp_ignore = 1: 这个参数告诉内核在处理 ARP 请求时忽略 ARP 响应。当设为 1 时,内核会忽略所有的 ARP 响应,除非请求的目标 IP 地址在本地子网中。
-
net.ipv4.conf.< interface >.arp_announce = 2: 这个参数定义了在网络接口上发送的 ARP 请求包中的源 IP 地址。当设为 2 时,内核会始终使用与目标 IP 地址最匹配的本地 IP 地址作为源 IP 地址进行 ARP 请求。这样可以防止 ARP 请求被发送到不应该接收这些请求的主机。
-
-
配置方法:
-
要使这些设置在系统重启后依然有效,需要将它们添加到/etc/sysctl.conf文件中。对于所有网络接口,可以设置all作为
<interface>的值:
net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2
-
应用这些更改,执行命令:
[root@rs1 ~]# sysctl -p
-
-
临时修改:
-
如果需要临时修改(不重启系统),可以直接通过/proc文件系统进行设置,例如在每台RS上执行:
[root@LVS-RS1 ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@LVS-RS1 ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce [root@LVS-RS1 ~]# echo "1" > /proc/sys
-