Linux yum搭建Keepalived,2 台机器都有虚拟 IP 问题

文章目录

Keepalived 搭建

服务 IP 服务器
Keepalived虚拟 IP 172.25.14.20 虚拟
nginx1 172.25.14.21 物理
nginx2 172.25.14.22 物理

一、安装

2台服务安装Keepalived和 nginx

bash 复制代码
yum -y install keepalived
yum -y install nginx

2台服务器同时操作

配置文件位置:/etc/keepalived/keepalived.conf

sh 复制代码
# 备份原文件
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.backup

二、keepalived配置

1、配置文件详解

基础三个模块,global_defs全局模块,vrrp_instance配置vip模块,vrrp_script 脚本模块,用来检测nginx服务。
注:vrrp_script定义脚本后,在vrrp_instance模块必须加上track_script 参数。

global_defs模块参数
  • notification_email : keepalived在发生诸如切换操作时需要发送email通知地址,后面的 smtp_server 相比也都知道是邮件服务器地址。也可以通过其它方式报警,毕竟邮件不是实时通知的。
  • router_id : 机器标识,通常可设为hostname。故障发生时,邮件通知会用到。
vrrp_instance模块参数
  • state : 指定instance(Initial)的初始状态, MASTER 或者BACKUP,不是唯一性的,跟后面的优先级priority参数有关。
  • interface : 实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的,(注意自己系统,我的默认是ens33,有的是eth0)
  • mcast_src_ip : 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
  • virtual_router_id : 这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址
  • priority: 设置本节点的优先级,优先级高的为master(1-255)
  • advert_int : 检查间隔,默认为1秒。这就是VRRP的定时器,MASTER每隔这样一个时间间隔,就会发送一个advertisement报文以通知组内其他路由器自己工作正常
  • authentication : 定义认证方式和密码,主从必须一样
  • virtual_ipaddress : 这里设置的就是VIP,也就是虚拟IP地址,他随着state的变化而增加删除,当state为master的时候就添加,当state为backup的时候删除,这里主要是有优先级来决定的,和state设置的值没有多大关系,这里可以设置多个IP地址
  • track_script: 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。
vrrp_script模块参数

告诉 keepalived 在什么情况下切换,所以尤为重要。可以有多个 vrrp_script

  • script : 自己写的检测脚本。也可以是一行命令如killall -0 nginx
  • interval 2: 每2s检测一次
  • weight -5 : 检测失败(脚本返回非0)则优先级 -5
  • fall 2: 检测连续 2 次失败才算确定是真失败。会用weight减少优先级(1-255之间)
  • rise 1 : 检测 1 次成功就算成功。但不修改优先级

2、修改配置文件

keepalived配置文件

修改nginx1keepalived配置文件

vim /etc/keepalived/keepalived.conf

json 复制代码
global_defs {               
    router_id Nginx_01
}
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight -5
    fall 3
    rise 2
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
     172.25.14.20
    }
    track_script {
    	check_nginx
    }
}

在备用nginx2服务器172.25.14.22上,配置一样,就三点不同,一点必须相同

  1. router_id 不同,
  2. state BACKUP不同 ,
  3. priority不同。
  4. virtual_router_id 必相同。

配置如下:

json 复制代码
global_defs {               
   router_id Nginx_02
}
vrrp_script check_nginx {
	script "/etc/keepalived/check_nginx.sh"
	interval 2
    weight -5
    fall 3
    rise 2
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
      172.25.14.20
    }
    track_script {
    	check_nginx
    }
}

2台机器上的自启动和 VIP 漂移脚本

vim /etc/keepalived/check_nginx.sh

sh 复制代码
#! /bin/bash
#检测nginx是否启动了
pidof nginx
if [ $? -ne 0 ];then
    systemctl restart nginx
    if [ $? -ne 0 ];then
        systemctl stop keepalived 
    fi
fi

3、启动服务

在 2 台机器执行启动服务

sh 复制代码
# 设置开机自启并启动服务
systemctl enable nginx && systemctl start nginx 

systemctl enable keepalived && systemctl start keepalived 

Tips:

1️⃣问题:两台机器上面都有VIP的情况

排查:

  1. 检查防火墙,发现已经是关闭状态。
  2. keepalived.conf配置问题。
  3. 可能是上联交换机禁用了arp的广播限制,造成keepalive无法通过广播通信,两台服务器抢占vip,出现同时都有vip的情况。tcpdump -i eth0 vrrp -n 检查发现 14和15都在对224.0.0.18发送消息。但是在正常情况下,备节点如果收到主节点的心跳消息时,优先级高于自己,就不会主动对外发送消息。

如果没有tcpdump可以使用yum -y install tcpdump安装

解决方法,将多播调整为单播然后重启服务:

vim /etc/keepalived.conf

sh 复制代码
unicast_src_ip 172.25.14.21 #本机ip
unicast_peer {
172.25.14.22 #对端ip
}
sh 复制代码
unicast_src_ip 172.25.14.22 #本机ip
unicast_peer {
172.25.14.21 #对端ip
}

配置完成后恢复正常,查看: tcpdump -i eth0 vrrp -n

2️⃣完整配置文件

json 复制代码
[root@nginx1 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
   router_id Nginx_01
}
vrrp_script check_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight -5
    fall 3
    rise 2
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.14.20
    }
    track_script {
        check_nginx
    }
    unicast_src_ip 172.25.14.21
    unicast_peer {
    172.25.14.22
    }

}
json 复制代码
[root@nginx2 ~]# cat /etc/keepalived/keepalived.conf
global_defs {               
   router_id Nginx_02
}
vrrp_script check_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight -5
    fall 3
    rise 2
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.14.20
    }
    track_script {
        check_nginx
    }
    unicast_src_ip 172.25.14.22
    unicast_peer {
    172.25.14.21
    }
}

参考文档:

Linux搭建nginx+keepalived 高可用(主备+双主模式)_advert_int-CSDN博客

keepalived两台机器同时出现vip问题-CSDN博客

相关推荐
数数科技的数据干货3 小时前
从爆款到厂牌:解读游戏工业化的业务持续增长道路
运维·数据库·人工智能
网安小白的进阶之路4 小时前
A模块 系统与网络安全 第四门课 弹性交换网络-6
网络·安全·web安全
大聪明-PLUS6 小时前
如何使用 Docker 打包一个简单的应用程序:简易指南
linux·嵌入式·arm·smarc
深耕AI7 小时前
【完整教程】宝塔面板FTP配置与FileZilla连接服务器
运维·服务器
serve the people7 小时前
Prompts for Chat Models in LangChain
java·linux·langchain
李昊哲小课8 小时前
Ubuntu 24.04 MariaDB 完整安装与配置文档
linux·ubuntu·mariadb
无聊的小坏坏8 小时前
从单 Reactor 线程池到 OneThreadOneLoop:高性能网络模型的演进
服务器·网络·一个线程一个事件循环
AI智域边界 - Alvin Cho9 小时前
Bloomberg、LSEG 与 MCP 缺口:为什么尚未发布完整的 MCP 服务器,以及多智能体系统如何解決这问题
运维·服务器
还下着雨ZG9 小时前
TCP/IP协议族详细介绍
网络·网络协议·tcp/ip·计算机网络
人间打气筒(Ada)9 小时前
zerotier内网穿透部署(rockylinux部署本地服务器)超详细~~~
linux·内网穿透·内网·公网·zerotier·穿透