简单实现windows下的应用热备
在项目开发中遇到了应用系统需要热备的需求,于是按照以前做过 VRRP 的经验,在 IP 地址可以切换的前提条件下设计了一些应用层的切换方式,等到应用层都准备完毕、项目即将上线的时候,突然傻眼了,发现 Windows 不支持 VRRP。
我当然知道,强大的 WindowsServer 系统肯定是能支持这种 IP 地址切换的功能的,只是我确实对 WindowsServer 的管理一无所知,上网搜索一番后也没有什么收获,又觉得自己需要的切换功能实在很简单,于是决定自己做一个简单的实现。
需求
大概需求是这样:
- 有两台服务器,主机和备机。
- 有三个IP地址,主机IP,备机IP,业务IP。
- 客户通过业务IP访问服务。
- 业务IP平时配置在主机上,当主机不可用(断电或断网)时则配置在备机上。
思路
有了这样的需求,思路就很简单了,主机始终保持自己有业务IP,备机持续对主机 ping 包,在主机不可用时给自己配置业务IP,在主机可用后把自己的业务IP删除就行了。那么需要解决的问题就变成了这些:
- 程序通过配置文件了解自己是主机还是备机
- 程序可以添加或者删除IP配置
- 程序可以ping包并了解结果
上网搜了一下,添加或者删除 IP 配置都可以通过命令解决:
而 ping 包这件事可以通过一个库来解决
按照以上思路,很快一个可以切换 IP 的程序就制作完成了,再使用 nssm 把他和应用服务什么的都注册到一起,轻松完成需求。
踩坑
测试过程中发现,主机切换到备机始终正常,备机切换主机一直失败。
观察发现,备机切换主机的过程中,会有短时间的主备机同时在线且同时拥有虚IP的情况。切换主机后(也就是备机删除虚 IP 配置),主机虚 IP 不可用,主机本机也 ping 不通虚 IP。
并不清楚原理,可能是 windows 系统会自己禁用这种地址冲突的子 IP。
发现只要主机重新配置一次子 IP 就可以正常使用,于是给主机添加了一个接收通知的接口,当备机让出虚拟 IP 的所有权后,给主机发送一条通知,主机收到通知后执行一次把虚拟 IP 删除再重新添加的动作,随后虚拟 IP 可以正常使用。
实现
最终的实现也放到 github 啦,在这里vwinvrrp。