当前位置: 首页 > news >正文

Keepalived 深度技术解析与高可用实践指南

简介:

基本概念

Keepalived 是一款基于 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议 )协议实现的高可用(HA)解决方案,常用于保障服务器集群中关键服务的持续运行,避免单点故障。它能自动检测服务器状态,当主服务器出现故障时,快速将虚拟 IP(VIP)切换到备用服务器,确保业务不中断。

核心功能

(一)健康检查

通过配置的检测脚本或机制,持续监控服务器上运行的服务(如 Nginx、Apache、MySQL 等 )状态。例如,定期检查 Web 服务端口是否可访问、服务进程是否存活,一旦发现服务异常,触发故障转移。

(二)高可用性

基于 VRRP 协议,Keepalived 集群中的服务器分为主(Master)、备(Backup)角色。主服务器正常时,对外提供虚拟 IP 服务;当主服务器故障,备服务器通过 VRRP 协商,抢占虚拟 IP,接管服务,保证业务连续性。这个过程实现了自动故障转移。当主服务器宕机时,备份服务器几乎可以瞬间(毫秒级)接管 VIP 和服务,对客户端来说服务几乎是连续的(短暂中断或 TCP 重连)。

(三)负载均衡(结合 LVS )

Keepalived 可与 Linux 虚拟服务器(LVS)集成,实现负载均衡功能。它能根据预设的调度算法(如轮询、加权轮询、最少连接等 ),将客户端请求合理分配到后端多台真实服务器,提升服务整体响应能力和吞吐量。

一、高可用集群

1.1.集群类型

  1. LB:Load Balance 负载均衡
  2. LVS/HAProxy/nginx(http/upstream, stream/upstream)
  3. HA:High Availability 高可用集群
  4. 数据库、Redis
  5. SPoF: Single Point of Failure,解决单点故障
  6. HPC:High Performance Computing 高性能集群

1.2.系统可用性 

SLA:Service-Level Agreement 服务等级协议(提供服务的企业与客户之间就服务的品质、水准、性能 等方面所达成的双方共同认可的协议或契约) A = MTBF / (MTBF+MTTR)

99.95%:(60*24*30)*(1-0.9995)=21.6分钟 #一般按一个月停机时间统计

指标 :99.9%, 99.99%, 99.999%,99.9999%

1.3 系统故障 

硬件故障:设计缺陷、wear out(损耗)、非人为不可抗拒因素 软件故障:设计缺陷 bug

1.4 实现高可用 

提升系统高用性的解决方案:降低MTTR- Mean Time To Repair(平均故障时间) 解决方案:建立冗余机制

  1. active/passive 主/备
  2. active/active 双主
  3. active --> HEARTBEAT --> passive
  4. active HEARTBEAT active

1.5.VRRP:Virtual Router Redundancy Protocol 

VRRP 协议栈工作流程

sequenceDiagramparticipant Masterparticipant BackupMaster->>Backup: 周期性发送Advertisement报文(组播224.0.0.18)Backup->>Master: 监听Master状态alt Master正常Backup->>Backup: 保持BACKUP状态else Master超时(3*adv_int)Backup->>Backup: 切换为MASTERBackup->>Network: 发送GARP宣告VIP接管end

 虚拟路由冗余协议,解决静态网关单点风险

物理层:路由器、三层交换机

软件层:keepalived

 通告:心跳,优先级等;周期性

工作方式:

  1. 抢占式
  2. 非抢占式

安全认证:

  1. 无认证
  2. 简单字符认证:预共享密钥
  3. MD5

工作模式:

  1. 主/备:单虚拟路由器
  2. 主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)

 二、Keepalived 部署和实验

实验环境要求

  1. 各节点时间必须同步:ntp, chrony
  2. 关闭防火墙及SELinux
  3. 各节点之间可通过主机名互相通信;非必须
  4. 建议使用/etc/hosts文件实现;非必须
  5. 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信;非必须

KeepAlived 配置说明

配置文件组成部分

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

配置文件组成
GLOBAL CONFIGURATION
Global definitions: 定义邮件配置,route_id,vrrp配置,多播地址等
VRRP CONFIGURATION
VRRP instance(s): 定义每个vrrp虚拟路由器
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s): LVS集群的VS和RS
全局配置

 配置虚拟路由器

 实验环境搭建如下

主机IP需安装的软件
KA1172.25.254.50/24keepalived
KA2172.25.254.60/24keepalived
RS1172.25.254.10/24nginx、mysql-server
RS2172.25.254.20/24nginx、mysql-server

 准备四台主机,两keepalived两后端服务器RS,全部关闭火墙和selinux,时间同步 

 关闭火墙:
systemctl disable firewalld
时间同步:

 

 KA1和KA2

 安装keepalived:

修改配置文件:

vim /etc/sysconfig/keepalived

 测试:

 RS1和RS2

ip a a 172.25.254.100/32 dev lovim /etc/sysctl.conf

 启用keepalived日志功能

将 Keepalived 日志从系统日志(如 /var/log/messages)中分离出来,是生产环境运维的关键实践。

默认情况下,Keepalived 的日志会混在系统日志中(如 /var/log/messages 或 /var/log/syslog),单独配置 Keepalived 日志可以:

  1. 更方便地监控和排查 Keepalived 相关问题

  2. 避免与其他系统日志混杂

  3. 便于日志轮转和管理

配置:
vim /etc/sysconfig/keepalived

vim /etc/rsyslog.conf

 

重启服务 

systemctl restart keepalived.servicesystemctl restart rsyslog.service

 测试:

 

 独立子配置文件

PS:接下来的实验不需要用到,可以不配置,配置了的为了不影响接下来的实验,也尽量去还原实验环境。

在复杂的生产环境中,Keepalived 主配置文件(/etc/keepalived/keepalived.conf)可能变得非常庞大和难以管理。使用子配置文件可以:

  1. 模块化管理:将不同功能的配置分离到不同文件

  2. 便于维护:单独修改某个服务配置而不影响其他部分

  3. 降低风险:减少因修改配置导致的整体服务中断

  4. 团队协作:不同管理员可以负责不同部分的配置

配置:

创建子配置文件目录
mkdir -p /etc/keepalived/conf.d修改主配置文件
vim /etc/keepalived/keepalived.conf重启服务
systemctl restart keepalived.service

vim /etc/keepalived/conf.d/webvip.conf

 

 延迟抢占

 抢占模式(preempt) 与 非抢占模式(nopreempt)

  • 抢占模式:当高优先级节点恢复后,立即夺回MASTER角色

  • 非抢占模式:节点保持当前状态,即使高优先级节点恢复

延迟抢占(preempt_delay)

折中方案:高优先级节点恢复后,等待指定时间再抢占MASTER角色

抢占延迟模式,即优先级高的主机恢复后,不会立即抢回VIP,而是延迟一段时间(默认300s)再抢回VIP

优势

  • 避免网络抖动导致的频繁切换

  • 给原MASTER节点完成现有连接的时间

  • 减少服务中断时间

配置: 

KA1和KA2

vim /etc/keepalived/keepalived.confsystemctl restart keepalived.service

 测试:

 先关闭KA1的keepalived服务,在KA2上开监视器,方便查看变化

KA1
systemctl stop keepalived.serviceKA2
watch -n1 ifconfig ——监视
tcpdump -i ens160 -nn host 224.0.0.44 ——测试

 再开启KA1的keepalived服务

 约10秒以后(即刚刚设定的延迟抢占时间)由60变成50了,即KA2变成KA1

 组播和单播

默认keepalived主机之间利用组播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量

Keepalived 组播 vs 单播对比表

对比项组播 (Multicast)单播 (Unicast)
通信机制使用组播地址 224.0.0.18 广播通告点对点定向通信,需手动指定对端 IP
配置复杂度简单(自动发现节点,无需配置对端)较复杂(需显式配置每个对端节点的 IP)
网络流量广播流量,可能占用较多带宽定向传输,仅限对端节点,流量更可控
云环境兼容性多数云平台(如 AWS、Azure)默认禁用组播普遍支持,无限制
安全性较低(任何主机可监听组播流量)较高(仅允许指定对端通信)
适用规模中小规模集群(≤10 节点)大规模集群(节点数多或跨地域部署)
故障检测速度依赖组播网络可靠性,延迟可能较高直接检测对端,响应更快
典型场景本地局域网、测试环境公有云、安全要求高的网络、跨机房部署
配置示例vrrp_mcast_group4 224.0.0.18unicast_peer { 192.168.1.11 }
与 vrrp_strict 兼容性兼容不兼容(需注释 vrrp_strict 选项)

 配置

设置单播
vim /etc/keepalived/keepalived.conf

KA1

 KA2:

测试 

Keepalived 通知脚本配置

Keepalived 可以通过邮件通知管理员关于 VRRP 状态变化、故障切换等重要事件。

当keepalived的状态变化时,可以自动触发脚本的执行

接下来模拟当出现状态变化时,通过邮箱来通知管理员

配置

dnf -y install s-nail sendmailsystemctl enable --now sendmailvim /etc/mail.rc

解释:

set smtp=smtp.163.com —— 这里的163是因为邮箱是网易的,如果你的是别的,如qq,那就写smtp.qq.com,其他邮箱类似
set smtp-auth=login —— 登录
set smtp-auth-user=XXX@163.com —— 这里输入自己的邮箱
set smtp-auth-password=ABCDEFG1234567 —— 这里的码是邮箱stmp认证得到的码
set from=XXX@163.com —— 这里输入自己的邮箱
set ssl-verify=ignore —— 忽略认证

 测试:

echo hello world | mailx -s test +自己的邮箱地址

 

注:如果是QQ邮箱的话,可能会在垃圾箱里

实现keepalived状态切换的通知邮箱脚本

mkdir -p /etc/keepalived/scriptsvim /etc/keepalived/scripts/mail.sh#!/bin/bash
mail_dest='自己的邮箱'mail_send()
{mail_subj="$HOSTNAME to be $1 vip 转移"mail_mess="`date +%F\ %T`: vrrp 转移,$HOSTNAME 变为 $1"echo "$mail_mess" | mail -s "$mail_subj" $mail_dest
}
case $1 inmaster)mail_send master;;backup)mail_send backup;;fault)mail_send fault;;*)exit 1;;
esac:wq添加可执行权限
chmod +x /etc/keepalived/scripts/mail.shvim /etc/keepalived/keepalived.conf

 

 

 

 双主架构

master/slave的单主架构,同一时间只有一个Keepalived对外提供服务,此主机繁忙,而另一台主机却很空闲,利用率低下,可以使用master/master的双主架构,解决此问题。

双主架构是指两个或多个Keepalived节点同时作为不同VIP的主节点,相互备份,实现:

  • 负载均衡:不同VIP的服务流量分散到不同节点

  • 资源利用:避免单主架构下备用节点闲置

  • 高可用性:单个节点故障不影响所有服务

配置

KA1和KA2上 

dnf -y install ipvsadm vim /etc/keepalived/keepalived.confvirtual_server 172.25.254.100 80 {delay_loop 6lb_algo rrlb_kind DRprotocol TCPreal_server 172.25.254.10 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 2retry 3delay_before_retry 3}}real_server 172.25.254.20 80 {weight 1TCP_CHECK {connect_timeout 2retry 3delay_before_retry 3connect_port 80}}
}:wqsystemctl restart keepalived.serviceipvsadm -Ln

可以看到KA1是100ip的主,KA2是备

停掉KA1的keepalived,他会自动转到KA2这个备上:

关掉单播

让KA1做DBVIP的BACKUP 

KA2是DBVIP的master: 

测试: 

在KA2上看,就能发现另一个组播,这就是双主

关掉KA2的keepalived之后KA1变为MASTER: 

 数据库mariadb的双主实验

两台RS配置新的ip与启动mariadb服务

ip a a 172.25.254.200/32 dev losystemctl start mariadb.servicesystemctl enable --now mariadb

两台KA配置数据库双主 

vim /etc/keepalived/keepalived.confsystemctl restart keepalived.service

查看策略 

测试:

mysql -ulee -plee -h 172.25.254.200 -e 'select @@server_id'

关掉RS2的mariadb服务再测试 

 KA2查看一下,就能看到200ip的主是KA2

关闭KA2的keepalived服务再测试

 

 实现HAProxy高可用

配置:

两KA安装haproxy:

dnf -y install haproxyvim /etc/haproxy/haproxy.cfgsystemctl start haproxy.servicesystemctl enable --now haproxy.service

在两个ka1和ka2两个节点启用内核参数:

 

在两KA中编写检测脚本来检测自己的haproxy程序有没有挂,如果挂了的话就要降低keepalived优先级把MASTER转移 

mkdir -p /etc/keepalived/scripts/vim /etc/keepalived/scripts/haproxy.shchmod +x /etc/keepalived/scripts/haproxy.sh

 配置keepalived配置文件:

测试

 

运行脚本
sh /etc/keepalived/scripts/haproxy.sh

关闭KA1的haproxy服务

http://www.lryc.cn/news/599768.html

相关文章:

  • 三种深度学习模型(GRU、CNN-GRU、贝叶斯优化的CNN-GRU/BO-CNN-GRU)对北半球光伏数据进行时间序列预测
  • Python 爬虫(五):PyQuery 框架
  • Gin 框架的中间件机制
  • 【世纪龙科技】新能源汽车电驱动总成装调与检修仿真教学软件
  • PHP:从入门到实践——构建现代Web应用的利器
  • 【STM32项目】有毒气体监测
  • VUE懒加载(4种方式)
  • 【Android】桌面小组件开发
  • Java设计模式-建造者模式
  • Tomcat线程池深度优化指南:高并发场景下的maxConnections计算与监控体系
  • iOS 加固工具实战解析,主流平台审核机制与工具应对策略
  • iOS WebView 调试实战,文件上传与权限弹窗异常的排查路径
  • Win11批量部署神器winget
  • 【通识】算法案例
  • Python--文件操作
  • MYSQL高可用集群搭建--docker
  • Kingbasepostgis 安装实践
  • 电子电气架构 --- 车载软件与样件产品交付的方法
  • 华为昇腾NPU卡 文生音频[T2A]大模型suno/bark模型推理使用
  • 线性代数 上
  • 旧物回收系统开发:搭建资源再生与环保共赢的桥梁
  • AMD官网下载失败,不让账户登录下载
  • STM32-中断配置教程(寄存器版)
  • 设计模式十:单件模式 (Singleton Pattern)
  • 《设计模式之禅》笔记摘录 - 10.装饰模式
  • 一道检验编码能力的字符串的题目
  • C# WPF 实现读取文件夹中的PDF并显示其页数
  • 《Angular+Spring Boot:ERP前端采购销售库存协同架构解析》
  • Qt 数据库事务处理与数据安全
  • Orbbec开发---数据流与数据流操作