通常,负载均衡器 (NSX Advanced Load Balancer) 为入站请求和出站请求执行地址转换。返回数据包流经负载均衡器,并根据负载均衡器上的配置更改目标地址和源地址。
以下是启用了直接服务器返回 (Direct Server Return, DSR) 时的数据包流程图:
负载均衡器不会对入站请求执行任何地址转换。
流量传送到池成员,而不对源地址和目标地址进行任何更改。
数据包将虚拟 IP 地址作为目标地址以到达服务器。
服务器将虚拟 IP 地址作为源地址以进行响应。到客户端的返回路径不会流经负载均衡器,因此,这称为直接服务器返回。
仅 IPv4 支持该功能。
用例
DSR 通常适用于音频和视频应用程序,因为这些应用程序对延迟比较敏感。
支持的模式
DSR 支持的模式如下所示:
DSR 类型 |
封装 |
工作方式 |
---|---|---|
第 2 层 DSR |
基于 MAC 的转换 |
NSX Advanced Load Balancer 控制器 将源 MAC 地址重写为服务引擎接口 MAC 地址,将目标 MAC 地址重写为服务器 MAC 地址。 |
第 3 层 DSR |
IP-in-IP |
IP-in-IP 隧道是在 NSX Advanced Load Balancer 和池成员之间创建的,这些成员可能离路由器一个或多个跳段远。 来自客户端的入站数据包是以 IP-in-IP 模式封装的,将源作为服务引擎的接口 IP,并将目标作为后端服务器 IP 地址。 |
第 3 层 DSR |
GRE |
第 3 层 DSR 支持通用路由封装 (Generic Routing Encapsulation, GRE) 隧道。在这种情况下,来自客户端的入站数据包封装在 GRE 标头中,后跟外部 IP 标头(传送标头)。 |
功能 |
支持 |
---|---|
封装 |
IP-in-IP,基于 MAC 的转换 |
生态系统 |
VMware 写入、VMware 无权访问和 Linux 服务器云 |
数据平面驱动程序 |
Linux 服务器云支持 DPDK 和 PCAP |
BGP |
使用 BGP 在前端放置 VIP |
负载均衡算法 |
L2 和 L3 DSR 仅支持一致哈希 |
TCP UDP |
在 L2 和 L3 DSR 中支持 TCP 快速路径和 UDP 快速路径 |
高可用性 (SE) |
N+M、活动-活动、活动-备用 |
第 2 层 DSR
入站数据包的目标 MAC 地址已更改为服务器 MAC 地址。
支持的模式:通过 TCP 和 UDP 的 DSR。
也支持 TCP 第 2 层 DSR 运行状况监控。
下图显示了第 2 层 DSR 的数据包流程图:
- 数据包传输
-
客户端向负载均衡器提供的虚拟 IP (VIP) 发送请求(步骤 1)。
LB 确定将请求转发到的实际服务器。
LB 执行 MAC 地址转换(步骤 2)。
服务器直接响应客户端,从而绕过 LB(步骤 3)。
- 第 2 层 - DSR
-
服务器必须位于直接连接到负载均衡器的网络上。
LB 和服务器需要位于同一 L2 网络分段上。
必须为服务器的环回 IP 配置 VIP IP。
为第 2 层 DSR 配置网络配置文件
登录到 NSX Advanced Load Balancer CLI,然后使用 configure networkprofile <profile name> 命令进入 TCP 快速路径配置文件模式。对于第 2 层 DSR,输入 dsr_type_l2
以作为 DSR 类型值。
[admin:10-X-X-X]: > configure networkprofile <profile name> [admin:10-X-X-X]: networkprofile> profile [admin:10-X-X-X]: networkprofile profile> tcp_fast_path_profile [admin:10-X-X-X]: networkprofile profile:tcp_fast_path_profile>dsr_profile dsr_type dsr_type_l2 [admin:10-X-X-X]: networkprofile profile:dsr_profile> save [admin:10-X-X-X]: networkprofile> save
在创建网络配置文件后,使用上面创建的 DSR 网络配置文件创建一个 L4 应用程序虚拟服务,并将支持 DSR 的服务器附加到与虚拟服务关联的池。
配置服务器
ifconfig lo:0 <VIP ip> netmask 255.255.255.255 -arp up echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 >/proc/sys/net/ipv4/conf/<Intraface of pool server ip configured>/rp_filter sysctl -w net.ipv4.ip_forward=1