基本信息:
VIP: 10.50.1.170
node1: 10.50.1.171
node2: 10.50.1.172
实现原理:
-
脚本每2s 运行一次(注册为windows 服务, 开机同步启动)
-
监听VIP 是否可用, 可用则跳过;
-
如果不可用 则 判断本机 Nginx 服务是否可用
3.1 可用则执行绑定动作, 将VIP绑定到本机
3.2 不可用则跳过
脚本:
while ($true) {
# 1. 判断 http://10.50.1.170/health 返回是否是OK
Write-Host "Checking Nginx health status via http://10.50.1.170/health..."
try {
$response = Invoke-WebRequest -Uri "http://10.50.1.170/health" -UseBasicParsing -Method HEAD -TimeoutSec 2 -ErrorAction Stop
$status = if ($response.StatusCode -eq 200) { "OK" } else { "NOT OK" }
Write-Host "Nginx health status: $status"
}
catch {
$status = "ERROR"
Write-Host "Error accessing Nginx health status: $($_.Exception.Message)"
}
# 2. 如果第1步返回的OK 则不做任何处理
if ($status -eq "OK") {
Write-Host "Nginx health status is OK, no operation needed."
}
else {
# 3. 如果第一步返回的不是OK, 则执行解绑VIP的动作
Write-Host "Nginx health status is not OK, starting to remove VIP binding..."
$vip = "10.50.1.170"
$interfaceName = "Ethernet0"
$interfaceInfo = Get-NetIPAddress -InterfaceAlias $interfaceName -ErrorAction SilentlyContinue
$vipExists = $interfaceInfo | Where-Object { $_.IPAddress -eq $vip }
if ($vipExists) {
try {
Remove-NetIPAddress -IPAddress $vip -InterfaceAlias $interfaceName -ErrorAction Stop -Confirm:$false
Write-Host "Removed VIP $vip binding from $interfaceName interface."
}
catch {
Write-Host "Failed to remove VIP $vip binding. Error: $($_.Exception.Message)"
}
}
else {
Write-Host "VIP $vip is not bound on $interfaceName interface."
}
# 4. 然后判断本机Nginx (jg-nginx) 是否可用
Write-Host "Checking if local Nginx (jg-nginx) is available..."
$localNginxProcess = Get-Process -Name "jg-nginx" -ErrorAction SilentlyContinue
if ($localNginxProcess) {
Write-Host "Local Nginx (jg-nginx) is available."
# 5. 如果可用则执行绑定VIP的动作
Write-Host "Starting to bind VIP $vip to $interfaceName interface..."
try {
New-NetIPAddress -IPAddress $vip -PrefixLength 32 -InterfaceAlias $interfaceName -ErrorAction Stop -Confirm:$false
Write-Host "VIP $vip bound to $interfaceName interface."
}
catch {
Write-Host "Failed to bind VIP $vip. Error: $($_.Exception.Message)"
}
}
else {
Write-Host "Local Nginx (jg-nginx) is not available, skipping VIP binding."
}
}
# 等待2秒后再次循环执行
Start-Sleep -Seconds 2
}