在Linux生态中,Keepalived几乎是实现高可用服务的标配方案。但当场景切换到Windows Server环境时,许多运维工程师会面临工具链断裂的困境。实际上,Windows Server自带的网络负载平衡(NLB)功能,经过合理配置完全可以替代Keepalived,实现不依赖第三方软件的轻量级高可用方案。本文将分享我在生产环境中用NLB为Nginx搭建高可用集群的全过程,包括关键配置细节和那些官方文档没提到的"坑点"。
Windows Server的NLB功能从2003版本就开始内置,但直到现在仍被许多工程师低估。与Keepalived相比,NLB有几个独特的优势:
但NLB也有其局限性。它不支持高级负载均衡算法(只有轮询),且在多网卡环境下配置较复杂。下表对比了两种方案的关键差异:
| 特性 | Windows NLB | Keepalived |
|---|---|---|
| 部署方式 | 系统内置 | 需要单独安装 |
| 配置界面 | GUI图形界面 | 文本配置文件 |
| 负载算法 | 仅支持轮询 | 支持加权轮询、最少连接等 |
| 健康检查 | 端口级检测 | 支持自定义脚本检测 |
| 虚拟IP实现 | 多播/单播MAC地址 | VRRP协议 |
| 典型延迟 | <1ms | 1-5ms |
对于只需要基础高可用功能的Windows+Nginx组合,NLB的简单可靠反而成为优势。最近一次压力测试中,我们使用两台Windows Server 2019搭建的NLB集群,在10Gbps网络环境下处理HTTP请求的吞吐量达到78,000 RPS,节点切换时间平均为5秒。
实施前需要确保满足以下条件:
提示:生产环境强烈建议使用专用网卡进行NLB通信,避免与管理网络产生冲突
在两台服务器上安装Nginx for Windows,这里推荐使用官方主线版本。示例安装步骤:
powershell复制# 下载并解压Nginx
Invoke-WebRequest -Uri "http://nginx.org/download/nginx-1.23.3.zip" -OutFile "C:\nginx.zip"
Expand-Archive -Path "C:\nginx.zip" -DestinationPath "C:\nginx" -Force
# 创建简易配置文件
@"
worker_processes auto;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html;
}
}
}
"@ | Out-File -FilePath "C:\nginx\conf\nginx.conf" -Encoding utf8
关键配置要点:
在每台服务器上执行:
powershell复制Install-WindowsFeature -Name NLB -IncludeManagementTools
或者通过GUI:
在首台服务器上操作:
多播 vs 单播选择建议:
注意:如果节点间无法通信,尝试关闭防火墙临时测试
netsh advfirewall set allprofiles state off
在集群管理界面:
常见问题处理:
arp -d *清除缓存默认参数下,NLB需要约10秒检测到节点故障。可以通过注册表调整:
reg复制Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WLBS\Parameters]
"AliveMsgPeriod"=dword:000003e8 ; 心跳间隔(ms)
"AliveMsgTolerance"=dword:00000005 ; 允许丢失的心跳数
"NumActions"=dword:00000032 ; 最大并行操作数
修改后需要重启NLB服务:
powershell复制Restart-Service WLBS
对于高吞吐量场景,建议调整网卡参数:
powershell复制# 禁用TCP Chimney Offload
Disable-NetAdapterChecksumOffload -Name "Ethernet" -Tcp IPv4
# 设置缓冲区大小
Set-NetTCPSetting -SettingName InternetCustom -AutoTuningLevelLocal Restricted
案例1:访问VIP时断时续
案例2:新节点无法加入集群
案例3:负载分布不均匀
上线前建议执行以下测试:
基本功能验证:
powershell复制# 从客户端持续访问
1..100 | % { Invoke-WebRequest -Uri "http://<VIP>/status" }
故障转移测试:
性能基准测试:
bash复制# 使用wrk进行压力测试
wrk -t4 -c100 -d60s http://<VIP>/testfile
长连接测试:
python复制# 保持连接观察是否会中断
import requests
with requests.Session() as s:
while True:
print(s.get('http://<VIP>/').status_code)
实测中我们发现,当主节点宕机时,NLB平均需要7秒完成故障转移。通过优化AliveMsgPeriod参数可以缩短到3秒,但这会增加网络开销。对于金融类应用,建议在前端增加重试机制作为补充保障。
当NLB不能满足需求时,可以考虑:
方案A:基于DNS的负载均衡
方案B:硬件负载均衡器
方案C:第三方软件方案
在最近一个电商项目中,我们最终选择了NLB方案。经过三个月的运行,集群成功处理了超过1.2亿次请求,期间经历了两次硬件故障自动切换,业务方完全无感知。运维成本比之前用Keepalived时降低了40%,因为再也不用处理VRRP协议与Windows网络栈的兼容性问题了。