什么是 Windows NLB (Network Load Balancing)?
NLB (Network Load Balancing) 是微软 Windows Server 操作系统内置的一种高性能、可扩展的负载均衡技术,它主要部署在网络层(OSI 第3层),通过将多台服务器组成一个虚拟的“NLB 群集”(NLB Cluster),将外部传入的客户端流量分发到集群中的各个成员服务器上,从而实现:

- 高可用性:如果集群中的一台服务器发生故障,NLB 会自动将流量重新分配给其他仍在运行的服务器,确保服务不中断。
- 可扩展性:当服务器负载过高时,你可以向集群中添加更多的服务器来分担流量,线性地提升整个系统的处理能力。
- 可管理性:对于客户端而言,整个集群看起来就像一台单一的服务器,客户端只需要知道一个统一的 IP 地址(即“群集 IP 地址”或“虚拟 IP 地址”),而不需要关心背后有多少台真实的服务器。
NLB 的工作原理
NLB 的核心工作方式可以概括为以下几个关键点:
虚拟网络适配器
在每台安装了 NLB 服务的服务器上,都会创建一个虚拟网络适配器,这个虚拟适配器拥有一个独特的 IP 地址,即群集 IP 地址,所有客户端发往这个群集 IP 地址的请求,都会首先到达这台服务器,即使它不是最终处理请求的服务器。
NLB 驱动程序
NLB 通过一个在内核模式下的网络驱动程序来工作,这个驱动程序直接在网卡驱动程序之上、TCP/IP 协议栈之下,拦截所有发送到群集 IP 地址的网络数据包。
端口规则
NLB 的分发策略是通过端口规则来定义的,你可以为不同的服务或端口范围设置不同的规则,每个规则包含以下关键属性:

- 端口范围:规则应用到的 TCP 或 UDP 端口(HTTP 的 80 端口,或 1-1024 的所有端口)。
- 处理:定义如何处理匹配此规则的流量,有三种模式:
- 单一主机:所有流量都只发送给集群中的一台特定服务器(即“主节点”或“指定主机”),这对于主从架构(如数据库主从复制)或需要单点写入的场景非常有用。
- 多个主机:流量可以分发到集群中的多台服务器上,这是最常见的模式,用于负载均衡。
- 禁止:丢弃所有匹配此规则的流量。
- 筛选模式:定义如何选择“多个主机”模式下的目标服务器,这是 NLB 负载均衡算法的核心。
- 相等:将新传入的连接均匀地分发给所有可用的主机,这是一种简单的轮询机制。
- 主机优先:将新连接优先分发给“优先级”数值较低的主机(优先级为 1 的主机比优先级为 2 的主机优先接收流量),如果优先级高的主机负载过高或不可用,流量才会分发给优先级次之的主机,这常用于确保性能更强的服务器优先处理请求。
- 相对权重:根据你为每台主机设置的“权重”值来分配流量,权重越高的服务器接收的流量比例越大,三台服务器权重分别为 50, 30, 20,那么它们将按 5:3:2 的比例分担流量。
群集通信
集群中的服务器之间会通过一个独立的多播或单播通道进行通信,以同步状态信息(如哪个服务器在线、哪个服务器下线)并确保它们对传入连接的判断是一致的,这个通信流量不会被负载均衡到客户端。
NLB 的两种操作模式
NLB 支持两种网络模式,你需要根据你的网络环境来选择:
单播模式
- 工作方式:在集群中的每台服务器上,NLB 会修改其网卡的MAC 地址,使其与群集虚拟 MAC 地址相同,由于所有服务器都使用相同的 MAC 地址,在网络交换机上会看到大量的ARP 冲突,导致交换机无法正确学习端口与 MAC 地址的映射关系。
- 后果:交换机会将发往群集 MAC 地址的广播包泛洪到所有端口,这会严重影响网络性能,并可能使交换机 CPU 占用过载。
- 适用场景:不推荐在现代网络中使用,它只适用于非常简单的网络环境,例如将 NLB 服务器直接连接到一个集线器上,或者将服务器连接到支持“端口镜像”或“动态 ARP 检测”的交换机上。
多播模式
- 工作方式:这是默认推荐的模式,它解决了单播模式的 ARP 冲突问题。
- 为 NLB 虚拟适配器分配一个多播 MAC 地址。
- 保留服务器原始的、唯一的单播 MAC 地址。
- 工作流程:
- 当 NLB 服务器需要向外发送群集流量时,它使用自己的单播 MAC 地址作为源地址。
- 当交换机学习 ARP 缓存时,它会学到 NLB 群集 IP 地址对应的是那个多播 MAC 地址。
- 当客户端请求发往群集 IP 时,交换机会将数据包泛洪到所有连接了 NLB 服务器的端口。
- 每台 NLB 服务器收到数据包后,通过 NLB 驱动程序判断自己是否应该处理该请求。
- 优点:解决了 ARP 冲突问题,兼容性更好。
- 缺点:由于交换机需要泛洪流量,可能会对网络中的其他设备造成不必要的流量负担。
注意:从 Windows Server 2012 开始,NLB 还支持IGMP 多播和ARP 静态绑定模式,可以进一步优化多播模式下的网络效率,减少不必要的泛洪流量。
NLB 的典型应用场景
NLB 非常适合部署无状态或客户端无关的应用服务,因为 NLB 本身不维护客户端会话状态,如果后端服务器需要维护会话,必须依赖应用层(如 ASP.NET Session、ARR Cookie)或硬件负载均衡器(如 F5, A10)的会话保持功能。

- Web 服务器负载均衡:这是最常见的用途,将多台运行 IIS (Internet Information Services) 的服务器组成 NLB 集群,为网站或 Web 应用提供高可用和可扩展的访问入口。
- VPN 服务器:将多台运行“路由和远程访问服务”(RRAS) 的服务器组成集群,为企业提供高可用的 VPN 接入点。
- 流媒体服务器:如 Windows Media Services,将大量的媒体请求分发到多台服务器上,保证视频流的稳定播放。
- 终端服务 / 虚拟桌面基础架构:将多台运行 Remote Desktop Services 或虚拟桌面主机角色的服务器组成集群,为用户提供高可用的远程桌面访问。
- DNS 服务器:虽然不常见,但也可以用于 DNS 的高可用性。
NLB 的优缺点
优点
- 成本效益高:作为 Windows Server 的内置功能,无需额外购买软件或硬件许可证。
- 部署简单:通过服务器管理器或 PowerShell 可以相对容易地配置和管理。
- 性能高:工作在网络层,处理延迟低,性能开销小。
- 高可用性:内置的故障检测和自动恢复机制,能快速剔除故障节点。
缺点
- 无内置会话保持:这是 NLB 最大的限制,它不关心来自同一个客户端的后续请求是否被发送到同一台服务器,如果应用需要会话粘性,必须在应用层自行实现。
- 网络模式复杂性:单播模式存在严重问题,多播模式也可能在某些网络设备上配置复杂,需要管理员对网络有深入了解。
- 配置不当的风险:NLB 的端口规则或网络模式配置错误,可能导致服务中断或网络风暴。
- 不支持 TCP 拆分:NLB 无法像一些硬件负载均衡器那样处理一个 TCP 连接被拆分到多个服务器上的复杂场景。
与其他负载均衡技术的比较
| 特性 | Windows NLB | ARR (Application Request Routing) | F5 / A10 (硬件负载均衡器) |
|---|---|---|---|
| 工作层级 | 网络层 (L3/L4) | 应用层 (L7) | 网络层、传输层、应用层 (L3-L7) |
| 会话保持 | 无 (需应用层支持) | 有 (基于 Cookie, URL 等) | 有 (多种高级方式) |
| ** |
