利用keepalived达成服务高可用
官方网站Keepalived for Linux
1.keepalived简介
健康检查和失败切换是keepalived的两大核心功能
- 健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活
- 而失败切换主要是应用于配置了主备模式的服务器,利用VRRP协议维持主备服务器的心跳,当主服务器出现问题时,由备服务器承载对应的业务,从而在最大限度上减少损失,并提供服务的稳定性
2.选举机制
既然有主备就会有选举机制,那么我们keepalived的选举机制如下
非抢占模式(默认),只要Master不挂掉,优先级高的路由器只能等待
vrrp_instance VI_1 {state MASTER #主服务器 BACKUP 对应是从服务器interface eth0 #对应网卡virtual_router_id 51 #每个虚拟路由器惟一标识,范围:0-255,每个虚拟路由器此值必须唯一priority 100 #当前物理节点在此虚拟路由器的优先级,范围:1-254#值越大优先级越高,每个keepalived主机节点此值不同advert_int 1 #vrrp通告的时间间隔,默认1sauthentication {auth_type PASS #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)auth_pass 1111 #预共享密钥,仅前8位有效#同一个虚拟路由器的多个keepalived节点必须一样}virtual_ipaddress {#虚拟IP,生产环境可能指定上百个IP地址192.168.200.16192.168.200.17192.168.200.18}
} 抢占模式,一旦有优先级高的路由器加入,立即成为Master,
priority 100 #优先级高
nopreempt #非抢占模式 加入
3.配置解析
3.1全局配置
#全局配置
global_defs {notification_email { #keepalived 发生故障切换时邮件发送的目标邮箱acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.loc #发邮件地址smtp_server 192.168.200.1#邮件服务器地址smtp_connect_timeout 30 #邮件服务器连接timeoutrouter_id LVS_DEVEL #每个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地址范围:
} 3.2 虚拟路由配置
vrrp_instance VI_1 {
state MASTER
interface eth0 #绑定为当前虚拟路由器使用的物理接口,如:eth0,可以和VIP不在一
个网卡
virtual_router_id 51 #每个虚拟路由器惟一标识,范围:0-255,每个虚拟路由器此值必须唯一#否则服务无法启动#同属一个虚拟路由器的多个keepalived节点必须相同#务必要确认在同一网络中此值必须唯一
priority 100 #当前物理节点在此虚拟路由器的优先级,范围:1-254#值越大优先级越高,每个keepalived主机节点此值不同
advert_int 1 #vrrp通告的时间间隔,默认1s
authentication { #认证机制
auth_type AH|PASS #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)
auth_pass 1111 #预共享密钥,仅前8位有效#同一个虚拟路由器的多个keepalived节点必须一样}
virtual_ipaddress { #虚拟IP,生产环境可能指定上百个IP地址<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>172.25.254.100 #指定VIP,不指定网卡,默认为eth0,注意:不指定/prefix,默认32172.25.254.101/24 dev eth1172.25.254.102/24 dev eth2 label eth2:1}
} 4.keepalived 单主架构
4.1 配置环境
后面环境通用
| 主机 | ip | 服务 |
| client | 172.25.254.10 | 客户端 |
| keepalived1 | 172.25.254.20 | |
| keepalived2 | 172.25.254.30 | |
| web1 rs1 | 172.25.254.40 | |
| web2 rs2 | 172.25.254.50 |
4.2 keepalived1 配置
为了美观性和方便理解我们采用子配置书写

cd /etc/keepalived/conf.d
vim router.conf
添加虚拟路由并作为我们的VIP虚拟访问IP

systemctl restart keepalived
重启服务后查看虚拟IP是否添加成功

同理对keepalived2做相同操作

由于是单骨架我们的BACKUP服务器不会启动也就不会有虚拟路由,当我们关闭keepalived1上的服务时我们的服务才会转移到keepalived2上去
5.keepalived 双主架构
cp -p router.conf router1.conf 为了方便我们直接复制即可
也就是配置两个虚拟路由IP一人当一个虚拟IP的master


6.组播传输和单波传输
vrrp_mcast_group4 IP#指定组播IP地址范围
测试:tcpdump -i ens33 -nn host 224.0.0.18
# 启用 vrrp_strict 时,不能启用单播 , 否则服务无法启动 , 并在 messages 文件中记录下面信息unicast_src_ip 172.25.254.20 # 本机 IPunicast_peer {172.25.254.30 # 指向对方主机 IP# 如果有多个 keepalived, 再加其它节点的 IP}
组播如下配置

测试 tcpdump -i ens33 vrrp -n

测试:
单波


测试

7.实现双主架构下的LVS-DR
7.1 虚拟服务器配置
virtual_server IP port { #VIP 和 PORTdelay_loop <INT> # 检查后端服务器的时间间隔lb_algo rr|wrr|lc|wlc|lblc|sh|dh # 定义调度方法lb_kind NAT|DR|TUN # 集群的类型 , 注意要大写persistence_timeout <INT> # 持久连接时长protocol TCP|UDP|SCTP # 指定服务协议 , 一般为 TCPsorry_server <IPADDR> <PORT> # 所有 RS 故障时,备用服务器地址real_server <IPADDR> <PORT> { #RS 的 IP 和 PORTweight <INT> #RS 权重notify_up <STRING>|<QUOTED-STRING> #RS 上线通知脚本notify_down <STRING>|<QUOTED-STRING> #RS 下线通知脚本HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... } # 定义当前主机健康状态检测方法}}# 注意 : 括号必须分行写 , 两个括号写在同一行 , 如 : }} 会出错
7.2 检测服务存活方法
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_GET|SSL_GET {url {path <URL_PATH> #定义要监控的URLstatus_code <INT> #判断上述检测机制为健康状态的响应码,一般为 200}connect_timeout <INTEGER> #客户端请求的超时时长 , 相当于haproxy的timeout servernb_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 发出健康状态检测请求时使用的源端口}
virtual_server 172.25.254.100 80 {delay_loop 6lb_algo wrrlb_kind DRprotocol TCP#sorry_server 172.25.254.30real_server 172.25.254.40 80 {weight 1TCP_CHECK {connect_timeout 5nb_get_retry 3delay_before_retry 3connect_port 80}
}
real_server 172.25.254.50 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 1nb_get_retry 3delay_before_retry 1}}
}
virtual_server 172.25.254.200 80 {delay_loop 6lb_algo wrrlb_kind DRprotocol TCP#sorry_server 172.25.254.30real_server 172.25.254.40 80 {weight 1TCP_CHECK {connect_timeout 5nb_get_retry 3delay_before_retry 3connect_port 80}
}
real_server 172.25.254.50 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 1nb_get_retry 3delay_before_retry 1}}
} 写入子配置文件 vim /etc/keepalived/lvs.conf
7.3 配置web服务器
ip addr add 172.25.254.100/32 dev lo

systemctl restart ipvsadm.service
systemctl restart keepalived

测试

8.实现HAProxy高可用
8.1 配置环境
RS1和RS2
vim /etc/sysctl.d/arp.conf

keepalive1和keepalive2
将lvs里面的虚拟主机配置文件删掉或者替换

将 由于我们haproxy需要监控vip但本机没有需要开启一个内核参数,让其能监控不在本机的Ip
8.2 配置基础haproxy
listen webserverbind 172.25.254.100:80server web1 172.25.254.101:80 checkserver web2 172.25.254.102:80 check 8.3 keepalived启用脚本
为了保证我们haproxy的高可用我们需要写一个脚本去检测haproxy服务的存活

我们采用killall -0 haproxy 来检查haproxy服务是否运行,当然也可采用其他方法
mkdir /etc/keepalived/conf.d/scripts
vim /etc/keepalived/conf.d/scripts/haproxy.sh
#haproxy 内容
#!/bin/bash
/usr/bin/killall -0 haproxy 赋予脚本可执行权限

keepalived 调用脚本
track_script {SCRIPT_NAME_1SCRIPT_NAME_2
} 定义脚本
vrrp_script <SCRIPT_NAME> {script <STRING>|<QUOTED-STRING> #此脚本返回值为非0时,会触发下面OPTIONS执行OPTIONS
} 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 # 设置默认标记为失败状态,监测成功之后再转换为成功状态}
操作实例
vim /etc/keepalived/conf.d/haproxy.conf
vrrp_script check_haproxy {script "/etc/keepalived/conf.d/scripts/haproxy.sh"interval 1weight -30fall 2rise 2timeout 2
}
vim /etc/keepalived/conf.d/router.conf
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 20priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev ens33 label ens33:0}unicast_src_ip 172.25.254.20unicast_peer {172.25.254.30}track_script{ #新加入的作用是调用check_haproxy}
}
测试

相关文章:
利用keepalived达成服务高可用
官方网站Keepalived for Linux 1.keepalived简介 vrrp 协议的软件实现,原生设计目的为了 高可用 ipvs 服务 功能: 基于 vrrp 协议完成地址流动 为 vip 地址所在的节点生成 ipvs 规则 ( 在配置文件中预先定义 ) 为 ipvs 集群的各 RS 做健康状态检测 …...
Dumpy:一款针对LSASS数据的动态内存取证工具
关于Dumpy Dumpy是一款针对LSASS数据的动态内存取证工具,该工具专为红队和蓝队研究人员设计,支持重新使用打开的句柄来动态转储 LSASS。 运行机制 Dumpy可以动态调用 MiniDumpWriteDump 来转储 lsass 内存内容。此过程无需打开 lsass 的新进程句柄&…...
TinyEngine是什么?
TinyEngine 是 OpenTiny 项目下的一个开源低代码引擎,旨在帮助开发者快速构建应用程序。它提供了可视化搭建页面的能力,支持在线实时构建和二次开发或集成,适用于多种场景的低代码平台开发,例如资源编排、服务端渲染、模型驱动、移…...
FPGA跨时钟域处理
文章目录 一、为什么要做跨时钟域处理二、单bit信号从慢时钟到快时钟处理2.1 使用同步寄存器链(打两拍)2.2 仿真代码编写2.3 仿真结果观察 三、单bit信号从快时钟域到慢时钟域处理3.1 使用脉冲展宽3.2 仿真代码编写3.3 仿真结果观察 四、在任意时钟域跨单bit信号4.1 使用握手协…...
【Docker深入浅出】Docker镜像
文章目录 一. Docker镜像简介二. Docker镜像详解1. 镜像和容器的关系2. 镜像通常比较小3. 拉取镜像4. 镜像命名4.1. 镜像仓库服务4.2. 官方和非官方镜像仓库4.3. 镜像的命名和标签 5. 为镜像打多个标签6. 过滤镜像内容6.1. 虚空镜像6.2. 删除虚空镜像6.3. 过滤器与格式化输出 7…...
“LOCAL_LISTENER”参数导致业务无法连接数据库,文末附Oracle连接故障检查监听的排查流程
1. 背景及问题 今天在Oracle BCV技术[1]做数据同步,建立生产库的测试库,需要DBA配合同步前后的停库和起库。在同步完起库后,有部门反应同步好的测试库连接不上去。 2. 问题排查 以我当前的知识储备,能想到的可能就是以下几点进…...
Vmware虚拟机接入物理机路由器网络
网络适配器增加至两个,一个选NAT, 另一个选host-only,再加一个桥接,不勾选使用物理网卡,然后重启即可!...
yolov8旋转框+关键点检测
一、Yolov8obb_kpt -----------------------------------现已在v8官方库上更新旋转框分割算法和旋转框关键点检测算法-------------------------- ------------------------------------------- https://github.com/yzqxy/ultralytics-obb_segment---------------------------…...
Qt-QWidget的windowTitle属性(13)
目录 描述 相关API 使用观察 描述 这个我们之前用过很多次了,就不再赘述了,简单说就是可以给那个边框设置标题,但是这里有一个小细节需要我们注意,就是谁的窗口谁设置 相关API 使用观察 我们这样写的话会发现一个问题&#x…...
RCE编码绕过--php://filter妙用
目录 代码 如何绕过 payload构造 代码 <?php $content <?php exit; ?>; $content . $_POST[txt]; file_put_contents($_POST[filename],$content); 当你想要输入代码的时候前面会有<?php exit;?>;,代码没有办法执行下去,所以…...
FactoryBean 与 BeanFactory
首先从字面理解: FactoryBean -->工厂Bean; BeanFactory -->Bean工厂。 即: FacttoryBean 是一个bean, BeanFactory 是bean的工厂。 使用: 1、BeanFactory: 提供获取bean的API。 2、FactoryBean: p…...
【迅为RK3568开发板】OpenHarmony学习开发系列教程(第2期 南向基础篇一)
P1P1_搭建Ubuntu开发环境-8:23 P2P2_获取OpenHarmony源码-10:21 P3P3_初次编译OpenHarmony源码-7:11 P4P4_OpenHarmony镜像简介以及烧写工具配置-9:18 P5P5_优化开发流程-搭建windows开发环境-5:34 P6P6_优化开发流程-搭建ubuntu开发环境-2:09 P7P7_优化开发流程-配置远程访问环…...
编程修炼之Hibernate--- springboot启动初始化ddl过程与如何自定义修改 table 字段长度
文章目录 springboot启动初始化ddl过程如何自定义修改 table springboot启动初始化ddl过程 跟踪Springboot整合hibernate的启动代码: SessionFactoryImpl 的初始化里做了非常多的事情,初始化各种资源,并调用 SchemaManagementToolCoordinat…...
TOMCAT入门到精通
目录 一 WEB技术 1.1 HTTP协议和B/S 结构 1.2 前端三大核心技术 1.2.1 HTML 1.2.2 CSS(Cascading Style Sheets)层叠样式表 1.2.3 JavaScript 二 WEB框架 2.2后台应用架构 2.2.1单体架构 2.2.2微服务 2.2.3单体架构和微服务比较 三 tomcat的…...
Android笔试面试题AI答之Kotlin(18)
文章目录 86. 阐述Kotlin中性能优化之局部函数 ?局部函数的优点间接的性能优化注意事项 87. 简述Kotlin中性能优化之数组使用 ?1. 选择合适的数组类型2. 避免不必要的数组创建3. 优化数组访问4. 合理使用数组遍历方式5. 利用Kotlin的集合操作API6. 注意数…...
Linux基础知识学习(五)
1. 用户组管理 每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理(开发、测试、运维、root)。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户…...
股票买卖的思路与代码
题目 1302:股票买卖 时间限制: 1000 ms 内存限制: 65536 KB 提交数:8660 通过数: 4290 【题目描述】 最近越来越多的人都投身股市,阿福也有点心动了。谨记着“股市有风险,入市需谨慎”,阿福决定先来研究一下简化版的股…...
Eureka Server与Eureka Client详解:服务注册与发现的交互机制
Eureka Server与Eureka Client详解:服务注册与发现的交互机制 Eureka 是 Netflix 开源的一个服务发现框架,它是 Spring Cloud 微服务架构中的核心组件之一。Eureka 主要由两个关键组件构成:Eureka Server 和 Eureka Client。它们之间通过一定…...
php-fpm 如何查看哪个正在执行死循环 并终止
php-fpm 如何查看哪个正在执行死循环 并终止 1. 检查 PHP-FPM 进程的 CPU 使用情况 首先,使用 top 或 htop 命令检查哪个 PHP-FPM 进程占用了大量的 CPU 资源。这个进程很可能是在死循环中。 top -c在 top 命令输出中,按 P 键可以按 CPU 使用率排序。…...
电脑硬盘坏了怎么恢复数据?
在数字化时代,电脑硬盘作为存储核心,承载着我们的工作文档、学习资料、家庭照片以及无数珍贵的回忆。然而,硬盘作为机械设备,也有其寿命和脆弱性,一旦出现故障,数据恢复便成为了一个紧迫而棘手的问题。本文…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
