走进 keepalived:解析高可用架构背后的关键技术

news2024/11/13 10:54:42

一、什么是keepalived

Keepalived 是一个用于实现服务器高可用性(High Availability,简称 HA)的软件

简单来说,它的主要作用是检测服务器的状态,并在主服务器出现故障时,自动将服务切换到备份服务器上,以确保服务的持续可用。

Keepalived 基于虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称 VRRP)来工作。VRRP 协议可以在一组路由器中选举出一个主路由器,其他的作为备份路由器。当主路由器出现故障时,备份路由器能够迅速接替其工作,保证网络的连通性。

在实际应用中,Keepalived 通常用于以下场景:

  1. 负载均衡器的高可用:例如在使用 LVS(Linux Virtual Server)作为负载均衡器时,通过 Keepalived 确保负载均衡器的持续运行。

    • 比如,一个网站使用 LVS 进行负载均衡,如果主 LVS 服务器宕机,Keepalived 会立即将流量切换到备份的 LVS 服务器上,保证用户的访问不受影响。
  2. 应用服务器的高可用:对于关键的应用服务器,Keepalived 可以监控服务器的健康状态,实现故障自动切换。

    • 假设一个在线支付系统的服务器,通过 Keepalived 配置,当主服务器因硬件故障或软件崩溃无法响应时,备份服务器能够立即接管服务,确保支付流程不中断。

二、什么是VRRP 

VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议) 是一种容错协议,用于在局域网中提供网关的冗余性。

VRRP 允许一组路由器共同构成一个虚拟路由器。在这个虚拟路由器中,会选举出一台主路由器(Master Router),其他的则为备份路由器(Backup Router)。

主路由器负责处理发往虚拟路由器的数据包转发工作。备份路由器则处于监听状态,实时监测主路由器的状态。

当主路由器出现故障时,备份路由器中优先级最高的那台会迅速切换成为新的主路由器,接管数据包的转发工作,从而保证网络的连续性和稳定性。

例如,在一个企业网络中,有多台路由器连接到同一个局域网。通过配置 VRRP,将这些路由器组成一个虚拟路由器。用户的设备只需要将网关设置为这个虚拟路由器的 IP 地址,而无需关心实际哪台路由器在工作。

假设最初主路由器为 Router A,当它发生故障时,Router B(优先级较高的备份路由器)会在短时间内接替成为新的主路由器,用户的网络访问不会受到明显影响。

VRRP 为网络提供了一种高可用性的解决方案,避免了单点故障对网络通信造成的影响,确保了网络服务的持续可靠运行。

 三、VRRP相关技术

通告:

  • 心跳:VRRP 中通过发送心跳消息来告知其他路由器自身的状态。
  • 优先级:决定了路由器在虚拟路由器中的角色,优先级高的更有可能成为主路由器。

周期性:
VRRP 协议的各种消息通常是周期性发送的,以确保各路由器之间的状态同步和及时感知变化。

工作方式:

  • 抢占式:当备份路由器的优先级高于当前主路由器时,会抢占成为主路由器。
  • 非抢占式:即使备份路由器优先级更高,也不会主动抢占主路由器的角色,除非当前主路由器故障。

安全认证:

  • 无认证:在一些对安全性要求不高的场景中使用,存在一定风险。
  • 简单字符认证:通过预共享密钥进行认证,相对简单但能提供一定的安全性。
  • MD5:使用 MD5 算法进行认证,安全性更高。

工作模式:

  • 主/备(单虚拟路由器):一个主路由器负责转发数据包,备份路由器处于待命状态。
    • 例如,在一个小型网络中,只有一台主路由器正常工作,备份路由器等待主路由器出现故障时进行切换。
  • 主/主(主/备(虚拟路由器 1),备/主(虚拟路由器 2)):实现了负载分担和冗余备份的双重功能。
    • 比如在一个较大规模的网络中,一部分流量通过虚拟路由器 1 的主路由器转发,另一部分流量通过虚拟路由器 2 的主路由器转发,同时各自有对应的备份路由器保障可靠性。

 四、keepalived部署

1、Keepalived 相关文件

软件包名: keepalived
主程序文件: /usr/sbin/keepalived
主配置文件: /etc/keepalived/keepalived.conf
配置文件示例: /usr/share/doc/keepalived/
Unit File /lib/systemd/system/keepalived.service
Unit File 的环境配置文件: /etc/sysconfig/keepalived

2、环境说明

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

 

 2、两台需要安装keepalived的虚拟机:172.25.254.128、172.25.254.152

      两台http服务器:172.25.254.153、172.25.254.154

3、keepalived实验环境配置

两台http服务器安装http服务

测试一下

五、keepalived虚拟路由的配置

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

 全局配置

! Configuration File for keepalived
global_defs {
notification_email {
594233887@qq.com #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区
分写多个
timiniglee-zln@163.com
}
notification_email_from keepalived@KA1.timinglee.org # 发邮件的地址
smtp_server 127.0.0.1 # 邮件服务器地址
smtp_connect_timeout 30 # 邮件服务器连接 timeout
router_id KA1.timinglee.org # 每个 keepalived 主机唯一标识
# 建议使用当前主机名,但多节点
重名不影响
vrrp_skip_check_adv_addr # 对所有通告报文都检查,会比较消耗性能
# 启用此配置后,如果收到的通告报文和上一
个报文是同一 # 个路由器,则跳过检查,默认
值为全检查
vrrp_strict # 严格遵循 vrrp 协议
# 启用此项后以下状况将无法启动服务 :
#1. VIP 地址
#2. 配置了单播邻居
#3. VRRP 版本 2 中有 IPv6 地址
# 建议不加此项配置
vrrp_garp_interval 0 # 报文发送延迟, 0 表示不延迟
vrrp_gna_interval 0 # 消息发送延迟
vrrp_mcast_group4 224.0.0.18 # 指定组播 IP 地址范围:
}

 

测试一下

默认为抢占模式

 六、keepalived虚拟路由通讯设定

注意vrrp_strict和vrrp_iptables这两行,要么同时开启,要么同时关闭

七、keepalived日志分离

[root@ka1 ~]# vim /etc/sysconfig/keepalived 

[root@ka1 ~]# vim /etc/rsyslog.conf

八、keepalived独立子配置文件

[root@ka1 ~]# systemctl restart keepalived.service

九、keepalived非强制和延迟抢占

非抢占模式 nopreempt

默认为抢占模式 preempt ,即当高优先级的主机恢复在线后,会抢占低先级的主机的 master 角色,
这样会使 vip KA 主机中来回漂移,造成网络抖动,
建议设置为非抢占模式 nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的 master 角色
非抢占模块下 , 如果原主机 down , VIP 迁移至的新主机 , 后续也发生 down , 仍会将 VIP 迁移回原主机
两台都需要设置
现在VIP在ka1上
把服务停掉
VIP在ka2上
现在我们把ka1的服务重启,看VIP是否会回到ka1上
没回来证明是正确的

抢占延迟模式 preempt_delay

抢占延迟模式,即优先级高的主机恢复后,不会立即抢回 VIP ,而是延迟一段时间(默认 300s )再抢回 VIP
两台都需要设置
现在VIP在ka1上,我们把ka1上的服务停掉,VIP会调到ka2上,再等10s,VIP就会再跳回到ka1
10s之后


十、keepalived单播模式设定

默认 keepalived 主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量
ka1
ka2
测试一下
ka2没有VIP


十一、keepalived邮件通知

keepalived 的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户
默认以用户 keepalived_script 身份执行脚本
如果此用户不存在,以 root 执行脚本可以用下面指令指定脚本执行用户的身份
安装邮件发送工具
QQ邮箱配置
[root@ka1 ~]# vim /etc/mail.rc
smpt-auth-password如何获得
登录QQ邮箱,找到账号与安全
点击安全设置
点击生成授权码即可(两台都需设置)
创建通知脚本
[root@ka1 ~]# vim /etc/keepalived/mail.sh
[root@ka1 ~]# chmod +x /etc/keepalived/mail.sh 
两台都需要设置
测试一下

十二、keepalived双主模式

master/slave 的单主架构,同一时间只有一个 Keepalived 对外提供服务,此主机繁忙,而另一台主机却很空闲,利用率低下,可以使用master/master 的双主架构,解决此问题。
master/master 的双主架构:
即将两个或以上 VIP 分别运行在不同的 keepalived 服务器,以实现服务器并行提供 web 访问的目的,提高 服务器资源利用率

ka1

ka2

测试一下

十二、keepalived-ipvs设定

IPVS相关配置

虚拟服务器配置结构

virtual_server IP port {
...
real_server {
...
}
real_server {
...
}
}

virtual server (虚拟服务器)的定义格式  

virtual_server IP port # 定义虚拟主机 IP 地址及其端口
virtual_server fwmark int #ipvs 的防火墙打标,实现基于防火墙的负载均衡集群
virtual_server group string # 使用虚拟服务器组

虚拟服务器配置

virtual_server IP port { #VIP PORT
delay_loop <INT> # 检查后端服务器的时间间隔
lb_algo rr|wrr|lc|wlc|lblc|sh|dh # 定义调度方法
lb_kind NAT|DR|TUN # 集群的类型 , 注意要大写
persistence_timeout <INT> # 持久连接时长
protocol TCP|UDP|SCTP # 指定服务协议 , 一般为 TCP
sorry_server <IPADDR> <PORT> # 所有 RS 故障时,备用服务器地址
real_server <IPADDR> <PORT> { #RS IP PORT
weight <INT> #RS 权重
notify_up <STRING>|<QUOTED-STRING> #RS 上线通知脚本
notify_down <STRING>|<QUOTED-STRING> #RS 下线通知脚本
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... } # 定义当前主机健康状
态检测方法
}
}
# 注意 : 括号必须分行写 , 两个括号写在同一行 , : }} 会出错

 

应用层监测  

应用层检测: HTTP_GET|SSL_GET
HTTP_GET|SSL_GET {
url {
path <URL_PATH> # 定义要监控的 URL
status_code <INT> # 判断上述检测机制为健康状态的响应码,一般为 200
}
connect_timeout <INTEGER> # 客户端请求的超时时长 , 相当于 haproxy timeout server
nb_get_retry <INT> # 重试次数
delay_before_retry <INT> # 重试之前的延迟时长
connect_ip <IP ADDRESS> # 向当前 RS 哪个 IP 地址发起健康状态检测请求
connect_port <PORT> # 向当前 RS 的哪个 PORT 发起健康状态检测请求
bindto <IP ADDRESS> # 向当前 RS 发出健康状态检测请求时使用的源地址
bind_port <PORT> # 向当前 RS 发出健康状态检测请求时使用的源端口
}

TCP监测

传输层检测: TCP_CHECK
TCP_CHECK {
connect_ip <IP ADDRESS> # 向当前 RS 的哪个 IP 地址发起健康状态检测请求
connect_port <PORT> # 向当前 RS 的哪个 PORT 发起健康状态检测请求
bindto <IP ADDRESS> # 发出健康状态检测请求时使用的源地址
bind_port <PORT> # 发出健康状态检测请求时使用的源端口
connect_timeout <INTEGER> # 客户端请求的超时时长
# 等于 haproxy timeout server
}

 两台http服务器配置VIP和设定ARP广播

keepalived安装ipvsadm

轮询正常

测试一下

随便停掉一个http服务

再启动

随便停掉一个keepalived服务

正常访问

再启动

正常访问

十三、keepalived-vrrp脚本控制VIP

keepalived 利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能

VRRP Script 配置

分两步实现:

定义脚本

vrrp_script :自定义资源监控脚本, vrrp 实例根据脚本返回值,公共定义,可被多个实例调用,定
义在 vrrp 实例之外的独立配置块,一般放在 global_defs 设置块之后。
通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对 MASTER 节点的权重减至低于SLAVE 节点,从而实现 VIP 切换到 SLAVE 节点
vrrp_script <SCRIPT_NAME> {
script <STRING>|<QUOTED-STRING> # 此脚本返回值为非 0 时,会触发下面 OPTIONS 执行
OPTIONS
}

调用脚本

track_script :调用 vrrp_script 定义的脚本去监控资源,定义在 VRRP 实例之内,调用事先定义的
vrrp_script
track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2
}

 定义 VRRP script

vrrp_script <SCRIPT_NAME> { # 定义一个检测脚本,在 global_defs 之外配置
script <STRING>|<QUOTED-STRING> #shell 命令或脚本路径
interval <INTEGER> # 间隔时间,单位为秒,默认 1
timeout <INTEGER> # 超时时间
weight <INTEGER:-254..254> # 默认为 0, 如果设置此值为负数,
# 当上面脚本返回值为非 0
# 会将此值与本节点权重相加可以降低本节点权重,
# 即表示 fall.
# 如果是正数,当脚本返回值为 0
# 会将此值与本节点权重相加可以提高本节点权重
# 即表示 rise. 通常使用负值
fall <INTEGER> # 执行脚本连续几次都失败 , 则转换为失败,建议设为 2 以上
rise <INTEGER> # 执行脚本连续几次都成功,把服务器从失败标记为成功
user USERNAME [GROUPNAME] # 执行监测脚本的用户或组
init_fail # 设置默认标记为失败状态,监测成功之后再转换为成功状态
}

 调用 VRRP script

vrrp_instance test {
... ...
track_script {
check_down
}
}

 编写脚本

现在VIP在ka1上

VIP跳到了ka2上

然后我们把/mnt/tc这个文件删掉

VIP又回到了ka1

十四、keepalived+haproxy的高可用集群

在ka1和ka2上安装haproxy

配置haproxy

ka1和ka2开启内核参数

两台http服务删除VIP和设定ARP广播
编写脚本
编辑keepalived和haproxy配置文件
测试一下
然后我们停掉ka1上的haproxy服务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2044011.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SVN权限控制解析

一、基础数据说明 1. 代码目录存在多级 2. 角色存在多级 二、规则说明 结合例子讲规则 1、多级文件夹 a. 继承与覆盖 【文件夹层级】&#xff1a; Repositories/BS_Projects/科顺 BS_Projects包含了多个项目&#xff0c;每个项目是一个文件夹&#xff0c;比如“科顺”是其…

分布式事务Seata保证审批状态一致性

文章目录 下载安装Seata创建对应数据库修改application.yml相应配置启动SeataPmHub 实战——添加任务事务管理业务库添加undo_log 表对应服务加上对应的seata依赖Nacos 配置文件 pmhub-project-dev.yml 添加 seata 配置&#xff1a;接口添加 GlobalTransactional 注解涉及数据表…

Centos7升级gitlab(17)

在 CentOS 7 中将 GitLab 从版本 17.1.1 升级到 17.2.2&#xff0c;涉及以下步骤。请务必在升级前备份数据&#xff0c;以防止升级过程中出现问题导致数据丢失。 升级步骤 1. 备份 GitLab 数据 在升级之前&#xff0c;确保已经备份了 GitLab 的数据&#xff0c;包括数据库、…

【windows安装gradle】

1.去官网下载自己需要的版本。 2.直接解压到指定目录 3.配置环境变量 3.1.新建 GRADLE_HOME 环境变量值指向你的 Gradle 的解压路径 3.2.将 %GRADLE_HOME%\bin 添加到 Path 环境变量中 4.打开cmd命令行输入gradle -v查看是否安装成功以及当前版本 下面显示说明已经安装完成了…

软件测试用例的编写(六)

软件测试用例 定义 测试用例&#xff08;TestCase&#xff09;是为项目需求而编制的一组测试输入&#xff0c;执行步骤&#xff0c;以及预期结果&#xff0c;以便测试某个程序是否满足客户需求 可以总结为&#xff1a;每一个测试点的数据设计和步骤设计 – 对测试点的细化 作…

CentOS 7虚拟机安装部署MongoDB

1.添加MongoDB的YUM仓库 打开终端&#xff0c;执行以下命令来添加MongoDB的YUM仓库&#xff1a; sudo vi /etc/yum.repos.d/mongodb-org-4.4.repo 在打开的文件中&#xff0c;输入以下内容&#xff1a; [mongodb-org-4.4] nameMongoDB Repository baseurlhttps://repo.mon…

城V4系列版本开源前后端uniapp代码

本文来自&#xff1a;智慧同城V4系列版本开源前后端uniapp代码 - 源码1688 应用介绍 演示地址&#xff1a;https://tongchengsaas.88881111.icu/ 账号&#xff1a;ceshi 密码&#xff1a;12345678 前端演示&#xff1a; 测试环境 php7.2mysql5.6ningx 安装拓展 ioncube&#x…

AppScan——Web 应用安全扫描的得力工具

一、引言 在当今数字化时代&#xff0c;Web 应用成为企业业务的重要支撑&#xff0c;但同时也面临着各种安全威胁。AppScan 作为一款专业的 Web 应用安全扫描工具&#xff0c;为保障 Web 应用的安全性提供了有力的支持。本文将对 AppScan 进行详细介绍&#xff0c;包括其功能、…

CogVideoX环境搭建推理测试

引子 智谱AI版Sora开源&#xff0c;首个可商用&#xff0c;18G显存即可运行。前文写了Open-Sora1.2的博文&#xff0c;感兴趣的童鞋请移步&#xff08;Open-Sora1.2环境搭建&推理测试_open sora 1.2-CSDN博客&#xff09;。对于这种占用资源少&#xff0c;且效果不错的多模…

ThreeJs学习笔记--坐标系,光源,相机控件

坐标系 一、创建添加坐标系 给场景添加坐标系THREE.AxesHelper()的参数表示坐标系坐标轴线段尺寸大小&#xff0c;你可以根据需要改变尺寸 const axesHelper new THREE.AxesHelper(200)//数值是坐标的尺寸 scene.add(axesHelper)//添加到场景里 坐标系包含三个坐标轴&…

HarmonyOS NEXT - Toast和Loading使用

demo 地址: https://github.com/iotjin/JhHarmonyDemo 代码不定时更新&#xff0c;请前往github查看最新代码 HarmonyOS NEXT - Toast和Loading使用 效果图调用方式JhProgressHud.ets 完整代码 官方有个toast但是比较单一&#xff08;官方toast promptAction&#xff09;&#…

【TiDB】10-对 TiDB 进行 TPC-C 测试

目录 1、安装bench工具 2、插入数据 3、运行测试 4、测试结果分析 4.1、总体性能概览 4.2、事务类型详细性能 4.3、错误事务分析 4.4、结论与建议 5、清理测试数据 TPC-C 是一个对 OLTP&#xff08;联机交易处理&#xff09;系统进行测试的规范&#xff0c;使用一个商…

C语言学习笔记 Day13(复合类型/自定义类型)

Day13 内容梳理&#xff1a; 目录 Chapter 9 复合类型&#xff08;自定义类型&#xff09; 9.1 结构体 &#xff08;1&#xff09;结构体变量定义、初始化 &#xff08;2&#xff09;嵌套结构体 &#xff08;3&#xff09;结构体赋值 &#xff08;4&#xff09;结构体和…

C Primer Plus 第4章习题

你该逆袭了 红色标注的是&#xff1a;错误的答案 蓝色标注的是&#xff1a;正确的答案 绿色标注的是&#xff1a;做题时有疑问的地方 练习题 一、复习题1、我的答案&#xff1a;正确答案&#xff1a; 2、3、4、5、6、7、8、9、10、11、12、 二、编程练习1、2、第4问我不会a、b、…

基于轨迹的汽车跟随系统横向控制方法

A Trajectory-Based Approach for the Lateral Control of Vehicle Following Systems 基于轨迹的汽车跟随系统横向控制方法 Abstract Abstract| A crucial task for steering an autonomous vehicle along a safe path in a vehicle following scenario is the lateral cont…

ubuntu查看CPU、内存、硬盘

1、查看CPU cat /proc/cpuinfo 我这台机器CPU是2核&#xff0c;所以这里是2核 或者使用如下命令也可以查看 lscpu 查看CPU使用率 top 2、查看内存 查看内存信息&#xff1a; free -h 查看内存使用情况&#xff1a; vmstat 3、硬盘 查看硬盘使用情况&#xff1a; df -…

用视频文件模拟摄像头进行抖音、视频号直播的无人直播机(虚拟摄像头)推流器使用说明详细介绍

无人直播机是嵌入式软硬件一体化设计&#xff0c;支持远程修改设备参数&#xff0c;远程回放设备录像&#xff0c;还支持3.5mm音频实时互动&#xff0c;以及多个视频随机轮播或者顺序轮播。无人直播机不仅稳定还节能&#xff0c;支持7*24小时运行&#xff0c;不死机不卡顿。 一…

求职利器:高频面试题与算法详解

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…

vue3父子组件双向数据绑定v-model;父组件调用子组件事件

效果&#xff1a; 父far.vue <template><div><div>父组件内容<pre>value1:{{ value1 }}</pre><el-button type"primary">flag1:{{ flag1 }}</el-button><pre>obj1:{{ obj1 }}</pre><el-input v-model&q…

Java 入门指南:接口(Interface)

引言 在Java编程中&#xff0c;接口&#xff08;Interface&#xff09;是一种非常重要的概念&#xff0c;它不仅是面向对象编程&#xff08;OOP&#xff09;的基石之一&#xff0c;也是实现高内聚、低耦合设计原则的关键工具。接口定义了一组方法&#xff0c;但不提供这些方法…