[经验总结]Linux双机双网卡Keepalived高可用配置及验证细节
1. 前言
这种配置需求比较少见,在网上也很少有相关文章,于是记录在此,供有需要的朋友参考。
本篇重点介绍配置的关键点,基础部分简单提及,不赘述。
2. 需求描述

如上图,即给两个主机配置两对高可用主从配置。
3. 配置步骤
3.1 安装Keepalived
3.1.1 官网下载安装包
https://www.keepalived.org/download.html
之后将安装包上传到服务器上。
如果服务器可直连外网,那么可直接使用wget进行下载。
wget https://www.keepalived.org/software/keepalived-2.3.3.tar.gz
3.1.2 在主机上解压包
tar -xzvf keepalived-2.3.3.tar.gz
在主机上安装keepalived
mkdir -p ~/keepalived # 新建一个空目录,为keepalived需要安装到的目录
cd keepalived-2.3.3 # 进入解压后的源码目录
./configure --prefix=~/keepalived
sudo make && sudo make install
configure的prefix参数,指定了keepalived安装的目录,在指定之前,需要新建该目录。
3.2 配置nginx检查脚本
mkdir -p /home/wingaso/keepalived/log # 新建一个存储日志的目录
cd /home/wingaso/keepalived/etc/keepalived
该目录下有一个keepalived.conf.sample文件。
我们在这个目录下新建一个check_ng.sh文件,其中填写如下内容(注意将以下脚本中的目录改为你服务器上的对应目录)
#/bin/sh
d=`date +%Y%m%d%H%M`;
n=`ps -C nginx --no-heading|wc -l`;
if [ $n -eq "0" ]; then/home/wingaso/nginx/sbin/nginx;n2=`ps -C nginx --no-heading|wc -l`;if [ $n2 -eq "0" ]; thenecho "$d nginx down,keepalived will stop">>/home/wingaso/keepalived/log/check_ng.log;sudo systemctl stop keepalived;fi
fi
3.3 配置keepalived.conf
分别进入两个主机,进入keepalived/etc/keepalived目录(即keepalived.conf.sample),新建keepalived.conf文件。
3.3.1 主机1配置
vrrp_script chk_nginx {script "/home/wingaso/keepalived/etc/keepalived/check_ng.sh"interval 3 # 每3秒执行一次脚本
}
vrrp_instance VIP_A_GROUP { # VIP A(渠道1)的主备组state MASTERinterface eth0 # 绑定网卡Avirtual_router_id 51 # 虚拟路由ID,同一组主备必须相同,不同组需唯一priority 105 # 优先级105(需高于同一组的备节点)advert_int 1 # 主备心跳间隔1秒authentication {auth_type PASS # 使用密码认证auth_pass 密码A}virtual_ipaddress {Vip1/24}track_script { # 绑定健康检查脚本chk_nginx}
}vrrp_instance VIP_B_GROUP { # VIP B(渠道2)的主备组state BACKUPinterface eth1 # 绑定网卡Bvirtual_router_id 52 priority 100 advert_int 1authentication {auth_type PASSauth_pass 密码B}virtual_ipaddress {Vip2/24}track_script {chk_nginx}
}
3.3.2 主机2配置
vrrp_script chk_nginx {script "/home/wingaso/keepalived/etc/keepalived/check_ng.sh"interval 3
}
vrrp_instance VIP_A_GROUP { # VIP A(渠道1)的主备组state BACKUPinterface eth0 # 绑定网卡Cvirtual_router_id 51 # 必须与A组相同priority 100 # 低于A的优先级advert_int 1authentication {auth_type PASSauth_pass 密码A}virtual_ipaddress {Vip1/24}track_script {chk_nginx}
}vrrp_instance VIP_B_GROUP { # VIP B(渠道2)的主备组state MASTERinterface eth1 # 绑定网卡Dvirtual_router_id 52 # 必须与B组相同priority 105 # 高于B的优先级advert_int 1authentication {auth_type PASSauth_pass 密码B}virtual_ipaddress {Vip2/24}track_script {chk_nginx}
}
部分参数的含义已在以上配置中进行注明,不赘述。
3.3.3 配置细节
3.3.3.1 网卡名查看
至于网卡名的查看,可以通过以下命令
ip a # 即 ip address的缩写
如下所示,其中蓝色框项为回环接口,下边两红色框为网卡1和网卡2。

3.3.3.2 Vip与网卡对应
VIP需与 对应网卡在同一子网,例如,假设 eth0 网卡的IP为 192.168.1.10/24(即子网掩码 255.255.255.0),其子网范围是 192.168.1.0 ~ 192.168.1.255。
此时,VIP(例如可取192.168.1.100/24)必须在此范围内,否则无法直接通过 eth0 网卡通信。
为什么VIP要和网卡在同一子网?
- ARP协议依赖:当其他设备访问VIP时,会通过ARP协议(地址解析协议)广播查询“哪个设备的MAC地址对应VIP”。如果VIP与网卡在同一子网,Keepalived节点可以正常响应ARP请求,声明自己持有该VIP。若不在同一子网,ARP请求无法到达目标子网,其他设备无法找到VIP对应的MAC地址,导致VIP不可达。
- 路由限制:默认情况下,操作系统只允许在同一子网内绑定额外的IP地址(即VIP)。如果VIP跨子网,需额外配置路由规则,否则数据包无法正确发送到VIP。
3.4 启动服务
sudo systemctl start keepalived
之后可以通过检查启动状态,确认配置是否存在问题。
sudo systemctl status keepalived
如果无异常,则显示如下所示:

3.5 验证
3.5.1 验证配置文件语法
cd /home/wingaso/keepalived/sbin
./keepalived -t -n -p -f=/home/wingaso/keepalived/etc/keepalived/keepalived.conf
-t:仅检查配置文件语法。
-n:不进入后台运行(直接输出错误)。
-f:指定配置文件路径。
如果配置无异常,则输出的结果为
Configuration file is valid
或者
SECURITY VIOLATION - scripts are being executed but script_security not enabled.
第二种输出情况,是因为我们配置了自定义脚本,但未启用脚本执行的安全权限控制,仅是一个警告,实际配置没有异常。
可以考虑增加以下配置(三选一),或者直接忽略该警告。
global_defs {script_security system # 允许以系统用户身份执行脚本(推荐)# script_security sudo # 或以 sudo 权限执行(需配置sudo权限)# script_security off # 或完全关闭安全限制(不推荐)
}
3.5.2 检查ip绑定情况
在Keepalived启动无异常后,输入以下命令检查Vip绑定情况。
ip addr
正常情况下,会在输出中看到对应的Vip1和Vip2。
主机1中,网卡A绑定了Vip1:

主机2中,网卡D绑定了Vip2:

3.5.3 测试VIP漂移(主备切换)
3.5.3.1 手动停止主节点的Keepalived
在主机1运行
systemctl stop keepalived
在主机2使用ip addr命令查看Vip情况如下:

渠道2验证方式同理。
3.5.3.2 模拟健康检查失败
备份原check_ng.sh,然后将check_ng.sh脚本暂时改为强制返回异常。如下
#!/bin/sh
exit 1
之后通过ip addr命令,查看ip浮动情况。
3.5.3.3 通过Vip访问服务
curl http://Vip1:80 # 替换为实际VIP和端口
nginx接收并返回预期结果,则为正常。
3.6 日志检查
检查命令如下:
tail -f /var/log/messages | grep keepalived # CentOS
tail -f /var/log/syslog | grep keepalived # Ubuntu
3.7 其他问题
3.7.1 频繁主备切换问题
如网络抖动或检查间隔太短,可能会出现频繁主备切换的情况,此时可通过调大keepalived.conf中的参数 interval(脚本检查间隔) 和 advert_int(主备心跳间隔)解决。
原创,引用请注明。
相关文章:
[经验总结]Linux双机双网卡Keepalived高可用配置及验证细节
1. 前言 这种配置需求比较少见,在网上也很少有相关文章,于是记录在此,供有需要的朋友参考。 本篇重点介绍配置的关键点,基础部分简单提及,不赘述。 2. 需求描述 如上图,即给两个主机配置两对高可用主从配…...
Go语言入门到入土——三、处理并返回异常
Go语言入门到入土——三、处理并返回异常 文章目录 Go语言入门到入土——三、处理并返回异常1. 在greetings.go中添加异常处理代码2. 在hello.go中添加日志记录代码3. 运行 1. 在greetings.go中添加异常处理代码 处理空输入的异常,代码如下: package g…...
2025.04.17【Dendrogram】生信数据可视化:Dendrogram图表详解
Dendrogram customization Go further with ggraph: edge style, general layout, node features, adding labels, and more. Customized circular dendrogram Learn how to build a circular dendrogram with proper labels. 文章目录 Dendrogram customizationCustomized c…...
Linux下的网络管理
一、ipv4原理 网络接口是指网络中的计算机或网络设备与其他设备实现通讯的进出口,一般是指计算机的网络接口即网卡设备 从RHEL7开始引入了一种新的“一致网络设备命名”的方式为网络接口命名,该方式可以根据固件、设备拓扑、设备类型和位置信息分配固…...
GPT-4o Image Generation Capabilities: An Empirical Study
GPT-4o 图像生成能力:一项实证研究 目录 介绍研究背景方法论文本到图像生成图像到图像转换图像到 3D 能力主要优势局限性与挑战对比性能影响与未来方向结论介绍 近年来,图像生成领域发生了巨大的变化,从生成对抗网络 (GAN) 发展到扩散模型,再到可以处理多种模态的统一生成架…...
Zookeeper介绍与安装配置
1.综述 1.1.Zookeeper介绍 Zookeeper 是一个分布式协调服务,由 Apache 开发,主要用于管理分布式应用中的配置信息、命名服务、分布式同步和组服务。它通过简单的接口提供高性能、高可用性和严格的顺序访问控制,广泛应用于分布式系统的协调与…...
提示词阶段总结
经过这些天的提示词学习,总结了一下提示词示例,可以直接拿来使用,规范大模型的输出。 CoT(适用于算术题) {问题},让我们一步一步思考。 Auto-CoT(自动思维链,适合回答多个问题一起…...
实验五 内存管理实验
实验五 内存管理实验 一、实验目的 1、了解操作系统动态分区存储管理过程和方法。 2、掌握动态分区存储管理的主要数据结构--空闲表区。 3、加深理解动态分区存储管理中内存的分配和回收。 4、掌握空闲区表中空闲区3种不同放置策略的基本思想和实现过程。 5、通过模拟程…...
用Webpack 基础配置快速搭建项目开发环境
Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具,但是Webpack有大量的配置项,对新手不太友好,但是我们可以根据webpack-cli的init命令根据项目需求快速生成webpack的配置文件,本文将手把手教你如何用 Webpack 和 npm 快…...
Axios 介绍及使用指南
本文将基于 Axios 原理,安装及封装方面展开描述,话不多说,现在发车! 一、原理 Axios 中文文档:起步 | Axios中文文档 | Axios中文网 赛前科普: 下文将涉及到三个关键词:Axios,Ajax…...
接口自动化测试(二)
一、接口测试流程:接口文档、用例编写 拿到接口文档——编写接口用例以及评审——进行接口测试——工具/自动化框架进行自动化用例覆盖(70%)——输出测试报告 自动化的目的一般是为了回归 第一件事情:理解需求,学会看接口文档 只需要找到我…...
Arduino+ESP826601s模块连接阿里云并实现温湿度数据上报
ArduinoESP826601s模块连接阿里云并实现温湿度数据上报 一、前言二、准备工作三、程序代码1. Arduino的程序2. ESP826601的程序3. 上面程序需要注意的地方 四、运行结果五、结束语 一、前言 看完我这三篇文章,相信各位朋友对于阿里云物联网平台的使用都有了一定的认…...
本地生活服务信息分类信息系统
最近在找分类信息系统,看了很多市面上常见的分类信息系统: 1,私集分类信息系统 2,火鸟分类信息系统 3,觅分类信息系统 4,框分类信息系统 5,蚂蚁分类信息系统 发现很多分类信息系统,…...
React Native 0.79 稳定版发布,更快的工具、更多改进
React Native 0.79 已发布。此版本在多个方面进行了性能改进,并修复了一些漏洞。首先,得益于延迟哈希技术,Metro 的启动速度变快了,并且对包导出提供了稳定支持。由于 JS 包压缩方式的改变等原因,Android 的启动时间也…...
【Dify应用】连接数据库生成Echarts图表
这里写自定义目录标题 需求文档内容测试环境实际效果工作流内容工具安装B工作流详解A工作流详解优化建议 需求 甲方要求。根据自然语言生成对应Echarts图表,并且数据来源于私有数据库。 文档内容 本文档内容主要展示使用Dify(本地源码)进行…...
无刷电机槽数相同、转子极数不同的核心区别
一、基础原理差异 无刷电机的核心参数: 槽数(定子槽数,记为 ( Z )):定子铁芯上的绕组槽数量,决定绕组布局。极数(转子磁极数,记为 ( 2p )):转子上的永磁体磁极对数(总极数为 ( 2p ),如 ( p=4 ) 表示 8 极)。核心关系:槽极配合(( Z/2p ))决定电机电磁结构,相同…...
RAG 实战|用 StarRocks + DeepSeek 构建智能问答与企业知识库
文章作者: 石强,镜舟科技解决方案架构师 赵恒,StarRocks TSC Member 👉 加入 StarRocks x AI 技术讨论社区 https://mp.weixin.qq.com/s/61WKxjHiB-pIwdItbRPnPA RAG 和向量索引简介 RAG(Retrieval-Augmented Gen…...
JavaScript 性能优化实战
一、代码执行效率优化 1. 减少全局变量的使用 全局变量在 JavaScript 中会挂载在全局对象(浏览器环境下是window,Node.js 环境下是global)上,频繁访问全局变量会增加作用域链的查找时间。 // 反例:使用全局变量 var globalVar = example; function someFunction() {con…...
ubuntu 22.04 使用ssh-keygen创建ssh互信账户
现有两台ubuntu 22.04服务器,ip分别为192.168.66.88和192.168.88.66。需要将两台服务器创建新用户并将新用户做互信。 创建账户 adduser user1 # 如果此用户不想使用密码,直接一直回车就行,创建的用户是没法使用用户密码进行登陆的 su - …...
【Linux网络】Socket 编程TCP
🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343 🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12891150.html 目录 TCP socket API 详解 socket(): bind(): listen(): accept(): connect V0…...
C++指针与内存管理深度解析
前言: 在C开发的道路上,指针和内存管理就像是两个既强大又危险的朋友。掌握它们就如同学会驾驭一辆高性能跑车,稍有不慎可能导致灾难,但一旦熟练掌握,便能发挥出惊人的性能和灵活性。今天就让我们一起深入探讨C中的指…...
ESP32-idf学习(二)esp32C3作服务端与电脑蓝牙数据交互
一、当前需求 目前是想利用蓝牙来传输命令,或者一些数据,包括电脑、手机与板子的数据传输,板子与板子之间的数据传输。构思是一个板子是数据接收终端,在电脑或手机下发指令后,再给其他板子相应指令,也需要…...
NHANES指标推荐:CMI
文章题目:Association between cardiometabolic index and biological ageing among adults: a population-based study DOI:10.1186/s12889-025-22053-3 中文标题:成年人心脏代谢指数与生物衰老之间的关系:一项基于人群的研究 发…...
前端单元测试实战:如何开始?
实战:如何开始单元测试 1.安装依赖 npm install --save-dev jest2.简单的例子 首先,创建一个 sum.js 文件 ./sum.js function sum(a, b) {return a b; }module.exports sum;创建一个名为 sum.test.js 的文件,这个文件包含了实际测试内…...
react-native搭建开发环境过程记录
主要参考:官网的教程 https://reactnative.cn/docs/environment-setup 环境介绍:macos ios npm - 已装node18 - 已装,通过nvm进行版本控制Homebrew- 已装yarn - 已装ruby - macos系统自带的2.2版本。watchman - 正常安装Xcode - 正常安装和…...
【数据库系统概论】第3章 SQL(四)视图(超详细)
视图(View)是数据库中的虚拟表 通过执行查询定义并存储在数据库中,可以像普通表一样被查询和使用。 视图本身并不存储数据,而是基于一个或多个表的查询结果动态生成。 视图的概念 视图( View )是由其它表或视图上的查询所定义…...
观察者模式详解与C++实现
1. 模式定义 观察者模式(Observer Pattern)是一种行为型设计模式,定义了对象间的一对多依赖关系。当一个对象(被观察者/主题)状态改变时,所有依赖它的对象(观察者)都会自动收到通知…...
空调制冷量和功率有什么关系?
空调的制冷量和功率是衡量空调性能的两个核心参数,二者既有区别又紧密相关,以下是具体解析: 1. 基本定义 制冷量(Cooling Capacity)指空调在单位时间内从室内环境中移除的热量,单位为 瓦特(W) 或 千卡/小时(kcal/h)。它直接反映空调的制冷能力,数值越大,制冷效果越…...
【python报错解决训练】
在编程开发中,正确解读报错信息是解决问题的关键技能。以下是系统学习解读报错信息的方法指南: 一、理解报错信息的核心结构 典型的报错信息包含以下要素(以Python为例): Traceback (most recent call last):File &q…...
UE5 关卡序列
文章目录 介绍创建一个关卡序列编辑动画添加一个物体编辑动画时间轴显示秒而不是帧时间轴跳转到一个确定的时间时间轴的显示范围更改关键帧的动画插值方式操作多个关键帧 播放动画 介绍 类似于Unity的Animation动画,可以用来录制场景中物体的动画 创建一个关卡序列…...
