当前位置: 首页 > article >正文

windows 下通过脚本方式实现 类似 Linux keepalived IP 动态绑定效果

基本信息:

VIP: 10.50.1.170

node1: 10.50.1.171

node2: 10.50.1.172

实现原理:

1. 脚本每2s 运行一次(注册为windows 服务, 开机同步启动)

2. 监听VIP 是否可用, 可用则跳过;

3. 如果不可用 则 判断本机 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
}


http://www.kler.cn/a/458851.html

相关文章:

  • 解决安装pynini和WeTextProcessing报错问题
  • 原生js封装ajax请求以及css实现提示效果和禁止点击效果
  • 【密码学】基于 fastcoll 实现 MD5 碰撞快速生成(MD5碰撞)
  • 19704 团建
  • Spring实现Logback日志模板设置动态参数
  • 【Elasticsearch】集群配置深度解析与实践
  • 有限元分析学习——Anasys Workbanch第一阶段笔记(2)应力奇异及位移结果对比、初步了解单元的基本知识
  • JVM的详细介绍
  • 【机器学习】 卷积神经网络 (CNN)
  • 基于Docker基础与操作实战
  • 【WdatePicker】选择不能小于当天
  • 深度学习模型格式转换:pytorch2onnx(包含自定义操作符)
  • 当现代教育技术遇上仓颉---探秘华为仓颉编程语言与未来教育技术的接轨
  • 电子电器架构 ---什么是智能电动汽车上的BMS?
  • VScode怎么重启
  • C# init 关键字的使用
  • 【ArcGIS Pro/GeoScene Pro】可视化时态数据
  • javaweb线上问题排查(若依定时任务)
  • 分布式版本管理工具——git 中忽略文件的版本跟踪(初级方法及高级方法)
  • 进程、线程和协程是什么,以及他们之间的区别
  • K-means 聚类:Python 和 Scikit-learn实现
  • uniapp 微信小程序开发使用高德地图定位SDK
  • ZYQN MPSoc系列芯片综述
  • MOS管驱动方案汇总
  • WeNet:面向生产的流式和非流式端到端语音识别工具包
  • 下载mysql免安装版和配置