两台服务器虚拟一个IP的核心答案是:通过Keepalived结合VRRP协议,在两台服务器上配置同一个虚拟IP(VIP),由VRRP协议决定哪台服务器持有该VIP并对外提供服务,另一台作为热备实时待命,当主服务器宕机或网络异常时,VIP会自动“漂移”到备用服务器,整个过程对客户端完全透明。
虚拟IP工作的基本原理是什么?
理解虚拟IP之前,先举个直观的例子,传统架构里,一台服务器对应一个IP,用户通过这个IP访问服务,这就好比一家门店只有一个门牌号,一旦门店关门,客户就找不到你了。
虚拟IP(VIP)则不同,它不是绑定在物理网卡上,而是由软件在两台服务器之间“协商”出来的一个逻辑IP,两台服务器对外宣称“我们用同一个IP”,但同一时刻只有一台真正持有它,这个机制依赖两个核心协议:VRRP和心跳检测。
VRRP(虚拟路由冗余协议)是虚拟IP技术的基石,它允许一组服务器组成一个虚拟路由器,共享同一个IP地址,组内会选举出一个Master(主节点)和若干Backup(备用节点),Master负责接收VIP的流量,Backup则安静地等待,行业共识认为,VRRP协议的选举机制成熟可靠,在局域网环境中能确保VIP在毫秒级完成切换。
心跳检测是判断主服务器“死活”的依据,Keepalived会每隔一定时间(默认1秒)发送一次VRRP通告报文,如果备用服务器连续3次没收到主服务器的通告,就会立刻进入Master状态,抢占VIP,这个周期通常被称为“抢占延迟”,会直接影响到故障切换的速度。
对比一下单IP和虚拟IP的差异会更好理解:
| 维度 | 单IP部署 | 虚拟IP部署 |
|---|---|---|
| 故障恢复时间 | 需要人工干预,等待时间较长 | 自动切换,一般在几秒以内 |
| 维护成本 | 升级或重启时需停机 | 主备轮流维护,业务不中断 |
| 风险等级 | 单点故障风险较高 | 具备冗余能力,可靠性明显提升 |
现在清楚了,虚拟IP的本质是一套“自动故障转移”机制。
怎么用Keepalived在两台服务器上设置虚拟IP?
这是最常见的实施路径,这里以两台CentOS 7/8服务器为例,假设它们的IP分别为192.168.1.10和192.168.1.20,需要虚拟出一个192.168.1.100的VIP,整个操作分为三步:安装、配置、验证。
安装Keepalived软件包
在两台服务器上都执行相同的安装命令:
yum install -y keepalived
安装完成后,使用keepalived --version确认版本号,接下来编辑主配置文件/etc/keepalived/keepalived.conf,这个文件控制着虚拟IP的一切行为。
配置主服务器的Keepalived
主服务器的配置文件如下(重点关注state和priority两个参数):
global_defs {
router_id LB-MASTER # 服务器唯一标识,主备不能相同
}
vrrp_instance VI_1 {
state MASTER # 主服务器标记为MASTER
interface eth0 # 承载VIP的物理网卡
virtual_router_id 51 # 虚拟路由ID,主备必须一致
priority 100 # 优先级,主服务器通常设为100
advert_int 1 # 心跳通告间隔(秒)
authentication {
auth_type PASS
auth_pass 1234 # 认证密码,主备保持一致
}
virtual_ipaddress {
192.168.1.100/24 dev eth0 # 虚拟IP及子网掩码
}
}
配置备用服务器的Keepalived
备用服务器除router_id、state和priority外,其余保持相同:
global_defs {
router_id LB-BACKUP # 与主服务器不同的标识
}
vrrp_instance VI_1 {
state BACKUP # 备用服务器标记为BACKUP
interface eth0
virtual_router_id 51
priority 90 # 备用服务器优先级更低
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.1.100/24 dev eth0
}
}
配置完成后,在两台服务器上分别执行:
systemctl enable keepalived
systemctl start keepalived
验证虚拟IP是否生效和切换
在主服务器上执行ip addr show eth0,会看到VIP已经出现在网卡上,此时用命令测试:
ping 192.168.1.100
能正常ping通,接着模拟故障,执行systemctl stop keepalived关闭主服务器的Keepalived服务,等待数秒后,在备用服务器上执行ip addr show,你就会看到192.168.1.100已经“漂移”到了备用服务器上,同时ping测试仍然保持正常。
这个验证过程证明,虚拟IP机制已经自动接管了故障。
如何配置Nginx健康检查避免异常切换?
默认情况下Keepalived只检测服务器是否宕机或网络是否断开,但如果Nginx进程还活着、端口却已无响应,就会出现“假死”状态,在这种情况下,Keepalived依然认为主服务器健康,不会触发切换,服务实则已经中断。
业内专家指出,针对这种情况需要额外配置健康检查脚本,定期探测Nginx的实际服务状态,具体做法是在配置文件中添加脚本定义:
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2 # 每2秒执行一次
weight -20 # 检查失败时,优先级降低20
}
然后在vrrp_instance块中引用这个脚本:
vrrp_instance VI_1 {
...
track_script {
chk_nginx
}
}
对应的/etc/keepalived/check_nginx.sh
#!/bin/bash
if [ "$(ps -ef | grep nginx | grep -v grep | wc -l)" -eq 0 ]; then
exit 1
fi
给脚本赋予执行权限:chmod +x /etc/keepalived/check_nginx.sh,现在当Nginx进程异常退出时,脚本返回失败,当前服务器的优先级自动降低,备用服务器就会接管VIP,避免了服务中断。
两台服务器做虚拟IP一般用什么方案?
Keepalived是主流选择,但根据业务场景不同,还有其他常用方案,选型时可根据实际需求对比:
| 方案 | 实现方式 | 适用场景 |
|---|---|---|
| Keepalived + VRRP | Linux平台经典方案 | Web服务、数据库、负载均衡器高可用 |
| HAProxy + Keepalived | 负载均衡结合VIP | 大型Web集群入口层高可用 |
| Corosync + Pacemaker | 集群资源管理器 | 需要管理多个VIP或服务的高级场景 |
| Windows故障转移集群 | 微软原生方案 | Windows Server环境下的SQL Server等应用 |
对于绝大多数中小业务场景,Keepalived方案是成本最低、维护最简单、社区文档最丰富的选择,如果只是两台服务器做基础高可用,无需引入过于复杂的集群架构,毕竟Keepalived和Nginx搭配使用,是当前比较成熟的组合方式,涉及两台服务器如何设置虚拟IP的疑问,多数情况下都是通过这套组合来解决的。
常见故障排查和维护建议
虚拟IP的部署并不复杂,但运维中的一些细节值得注意,整理几个容易踩坑的点:
- 防火墙拦截:Keepalived使用VRRP组播地址224.0.0.18和协议号112,如果云服务器安全组或本地iptables把这个协议拦了,就会一直出现主备抢占的奇怪现象,需要放行VRRP协议。
- 网卡名称不一致:配置文件中
interface参数必须与服务器实际网卡名一致,如果一台叫eth0、另一台叫ens33,VIP永远无法正常漂移。
- 云环境限制:简米云、酷番云等公有云厂商默认不支持组播,直接使用Keepalived会报错,通常要改用云厂商自研的高可用IP方案,或者在VPC中配置组播白名单。
- 脑裂问题:两台服务器同时持有VIP,称为脑裂,对业务影响较大,排查思路是优先检查心跳网络是否连通,建议为心跳使用独立的物理网卡或内网专线。
从维护角度来看,定期检查主备状态是基础动作,执行systemctl status keepalived能查看运行状态,tail -f /var/log/messages能观察VRRP切换日志,日志中出现“Entering MASTER STATE”说明当前服务器已成为主节点。
全方位解读两台服务器设置虚拟IP的细节
两台服务器能不能只用一个业务IP对外提供服务?答案是确定的,虚拟IP让运维团队在日常工作中获得了极大自由度,比如需要升级Nginx版本时,只需在主备服务器之间手动切换VIP,再对原主服务器做维护,业务全程不停顿,涉及到MySQL数据库高可用,也可以用虚拟IP挂载在VIP后面的方式保持连接稳定,不用担心客户端频繁报错,切换发生在网络层,应用层无感知。
一台服务器的成本与故障时的业务损失相比,多数情况下是划算的,两台服务器做冗余意味着在硬件故障、系统崩溃、网络中断等意外状态下,备用节点能在几秒内接管流量。
两台服务器设置虚拟IP常见问题
Keepalived部署后两台服务器频繁抢占VIP是什么原因?
优先检查两台服务器的priority值是否设置相同,如果相同会导致抢占竞争,其次确认advert_int心跳间隔是否一致,最后排查防火墙是否放行了VRRP协议,这是最容易被忽略的原因。
虚拟IP能否跨网段进行漂移?
理论上不能直接实现,VRRP协议设计之初是针对同一二层网络的设备进行协商,如果两台服务器部署在不同网段,需要借助VXLAN等隧道技术或者使用云厂商提供的跨可用区高可用VIP能力,才能实现类似效果。
两台服务器之间的心跳断了但业务正常,VIP会怎样切换?
心跳中断后,备用服务器失去主服务器的通告,会认为主服务器故障从而抢占VIP,导致两台服务器同时持有同一IP,即脑裂状态,为避免这种问题,生产环境建议配置独立的双心跳线路,并引入fencing机制,在检测到脑裂时强制关闭异常节点的网络端口。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/602432.html




