利用keepalived达成服务高可用

官方网站Keepalived for Linux

1.keepalived简介

vrrp 协议的软件实现,原生设计目的为了 高可用 ipvs 服务
功能:
基于 vrrp 协议完成地址流动
vip 地址所在的节点生成 ipvs 规则 ( 在配置文件中预先定义 )
ipvs 集群的各 RS 做健康状态检测
基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持 nginx haproxy 等服务

健康检查失败切换是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服务
client172.25.254.10客户端
keepalived1172.25.254.20
keepalived2172.25.254.30
web1 rs1172.25.254.40
web2 rs2172.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 # 本机 IP
unicast_peer {
172.25.254.30 # 指向对方主机 IP
# 如果有多个 keepalived, 再加其它节点的 IP
}

组播如下配置

测试 tcpdump -i ens33 vrrp -n

tcpdump -i eth0 -nn host 224.0.0.18

测试:

单波

默认 keepalived 主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量
unicast_src_ip <IPADDR> # 指定发送单播的源 IP
unicast_peer {
<IPADDR> # 指定接收单播的对方目标主机 IP
......
}

测试

7.实现双主架构下的LVS-DR

7.1 虚拟服务器配置

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 { ... } # 定义当前主机健康状
态检测方法
}
}
# 注意 : 括号必须分行写 , 两个括号写在同一行 , : }} 会出错

7.2 检测服务存活方法

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_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 发出健康状态检测请求时使用的源端口
}
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

在两个 ka1 ka2 两个节点启用内核参数
vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1

8.2 配置基础haproxy

在keepalived上下载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}
}

测试

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始学cv-5: 图像的仿射变换

文章目录 一&#xff0c;简介&#xff1a;二&#xff0c;图像仿射变换详解2.1&#xff0c;图像平移&#xff1a;2.2 &#xff0c;图像旋转&#xff1a;2.3&#xff0c;仿射变换&#xff1a; 一&#xff0c;简介&#xff1a; 仿射变换&#xff08;Affine Transformation 或 Aff…

校园综合服务小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;卖家管理&#xff0c;发布信息管理&#xff0c;订单信息管理&#xff0c;类型管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;发布信息&#xff0…

webm格式怎么转换成mp4?7个有效方法将webm转mp4

在数字媒体的浩瀚宇宙中&#xff0c;视频格式的多样性犹如繁星点点&#xff0c;既点亮了创意的火花&#xff0c;也铺设了内容分享的广阔道路。每一种视频格式都承载着其独特的技术优势与设计初衷&#xff0c;WebM便是其中一颗璀璨的新星&#xff0c;专为优化网络传输而生。它凭…

【C++从练气到飞升】14---深入浅出继承

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书&#x1f389; 目录 ⛳️推荐 一、继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1 定义格式 1.2.2 继承方式和访问限定符…

C语言—指针(2)

目录 一、数组名的理解 二、使用指针访问数组 三、一维数组传参的本质 四、冒泡排序 五、二级指针 六、指针数组 七、字符指针变量 八、数组指针变量 &#xff08;8.1&#xff09;什么是数组指针变量 &#xff08;8.2&#xff09;数组指针变量的初始化 九、二维数组传…

【工业机器人】工业异常检测大模型AnomalyGPT

AnomalyGPT 工业异常检测视觉大模型AnomalyGPT AnomalyGPT: Detecting Industrial Anomalies using Large Vision-Language Models AnomalyGPT是一种基于大视觉语言模型&#xff08;LVLM&#xff09;的新型工业异常检测&#xff08;IAD&#xff09;方法。它利用LVLM的能力来理…

企业级WEB应用服务器TOMCAT

目录 一、WEB技术 1.1 HTTP协议和B/S 结构 1.2 前端三大核心技术 1.2.1 HTML 1.2.2 CSS&#xff08;Cascading Style Sheets&#xff09;层叠样式表 二、WEB框架 2.1 web资源和访问 2.2 后台应用架构 2.2.1 单体架构 2.2.2 微服务 2.2.3 单体架构和微服务比较 三、t…

springboot社区疫情返乡管控系统--论文源码调试讲解

第2章 开发环境与技术 本章节对开发社区疫情返乡管控系统管理系统需要搭建的开发环境&#xff0c;还有社区疫情返乡管控系统管理系统开发中使用的编程技术等进行阐述。 2.1 MySQL数据库 MySQL是一种具有安全系数、安全系数、混合开发性、高效化等特征的轻量关联数据库智能管…

最新动态鲨鱼导航网引导页html源码

源码介绍 最新动态鲨鱼导航网引导页html源码 源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 https://download.csdn.net/download/h…

鸿蒙HarmonyOS开发:用户通知服务Noification的详细使用指南

文章目录 一、Notification Kit简介二、能力范围三、业务流程四、通知样式&#xff1a;五、约束限制六、开发步骤6.1、导入模块。6.2、构造NotificationRequest对象&#xff0c;并发布通知。6.2.1、普通文本类型。6.2.2、长文本类型。6.2.3、多行文本类型。 6.3、为通知添加行为…

反射异常捕获 | InvocationTargetException 要用e.getCause()打印才能看到具体异常

背景&#xff1a;线上某段和反射相关的代码报错了&#xff0c;但是异常信息打印只看到了 InvocationTargetException&#xff0c;没打印具体的异常。就像这样&#xff1a;java.lang.reflect.InvocationTargetException: null 查阅资料后发现要用e.getCause()才能打印具体异常&a…

赚大钱和赚小钱,哪个更累?

最近一直在质疑我在做的项目&#xff0c;虽然有同行做到了很好的成绩&#xff0c;但是我还是质疑。 因为一直在赚小钱&#xff0c;接触到的也是新手、底层客户、墨迹客户。 越是钱少的生意&#xff0c;越不好做&#xff0c;客户越挑剔。 而且赚小钱会消磨人的心智。 前几年…

实现 FastCGI

CGI的由来&#xff1a; 最早的 Web 服务器只能简单地响应浏览器发来的 HTTP 请求&#xff0c;并将存储在服务器上的 HTML 文件返回给浏 览器&#xff0c;也就是静态 html 文件&#xff0c;但是后期随着网站功能增多网站开发也越来越复杂&#xff0c;以至于出现动态技 术&…

【ACM出版,高录用EI快检索】第七届计算机信息科学与人工智能国际学术会议(CISAI 2024,9月6-8)

第七届计算机信息科学与人工智能国际学术会议(CISAI 2024) 将于2024年09月6-8日在中国浙江-绍兴举行。 计算机信息科学与人工智能国际学术会议的主题主要围绕“信息科学”与“人工智能”的最新研究展开&#xff0c;旨在荟聚世界各地该领域的专家、学者、研究人员及相关从业人员…

图的应用

一、最小生成树 1&#xff09;Prim算法&#xff08;加点&#xff09; 2&#xff09;Kruskal算法&#xff08;加边&#xff09; 二、最短路径 1&#xff09;Dijkstra算法 2&#xff09;Floyd算法 三、拓扑排序 1&#xff09;AOV 拓扑序列不唯一 2)AOE&#xff08;关键路径&#…

CMOS 逆变器的功耗

CMOS 反相器的发展为集成电路提供了基本功能&#xff0c;是技术史上的一个转折点。该逻辑电路突出了使 CMOS 非常适合高密度、高性能数字系统的电气特性。 CMOS 的优势之一是其效率。CMOS 逻辑仅在改变状态时才需要电流——仅维持逻辑高或逻辑低电压的 CMOS 电路消耗的功率非常…

校园一卡通_q7e7o

TOC springboot576校园一卡通_q7e7o--论文 第一章 概述 1.1 研究背景 近些年&#xff0c;随着中国经济发展&#xff0c;人民的生活质量逐渐提高&#xff0c;对网络的依赖性越来越高&#xff0c;通过网络处理的事务越来越多。随着校园一卡通的常态化&#xff0c;如果依然采用…

IO进程(6)

目录 1.进程间通信 1.1无名管道 1.1.1读写特性 1.1.2函数 1.2有名管道 1.2.1函数接口 ​​​​​​​​​​​​​​1.2.2读写特性 2.信号 2.1信号的概念 ​​​​​​​​​​​​​​2.2信号的分类 ​​​​​​​​​​​​​​2.3信号的处理方式 ​​​​​​​2.4信号产生…

Tensorflow 2.16.0+在PyCharm中找不到keras的报错解决

在PyCharm(2024.2版本)中&#xff0c;直接使用from tensorflow import keras会提示“Cannot find reference ‘keras’ in ‘init.py’ ”&#xff0c;找不到keras&#xff0c;如下图所示。 查阅相关资料&#xff0c;可以发现在tf2.16之后&#xff0c;默认的keras后端升级为了…

【Git】常见命令的使用

Git 介绍流程安装常见命令本地仓与远程仓关联 介绍 Git、Svn&#xff1a;版本控制器&#xff08;用于多人团队协作&#xff09; Svn&#xff1a;集中式版本控制器&#xff1b;版本库集中放在中央服务器&#xff0c;操作非常简单&#xff0c;鼠标右键提交、新增、下载 Git&…