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配置文件

修改nginx1的keepalived配置文件

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 小时前
Ubuntu安装flume
linux·ubuntu·flume
承渊政道3 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
讯捷蓝达5 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
且从容.6 小时前
ubuntu安装flink
linux·ubuntu·flink
爱和冰阔落7 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨7 小时前
WSL2的安装与使用
linux·wsl
微小的鱼8 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng8 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
严肃小白兔8 小时前
Cloudflare 更新 API Token 管理:从最小权限到自动化凭据安全
网络·安全·自动化
Android系统攻城狮9 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频