Keepalived+Nginx实现高可用(下)

一、背景

        上篇文章介绍了基本的Keepalived的简单入门,但是针对预留的问题还有优化的空间。分别是下面3个问题:

         1、如果仅仅只提供一个VIP的方式,会存在只有1台服务器处于实际工作,另外1台处于闲置状态。 势必存在成本资源浪费问题,这个问题如何解决?

         2、如果服务进程例如Nginx已经挂掉了,那么此时Keepalived进程也就没存在的必要了。为什么这么说呢?  试想如果服务进程已经挂了,由于Keepalived进程还正常运行,那就是还掌握着VIP的资源,但是此时拿到VIP节点不能提供正常的服务,造成站在茅坑不拉屎的局面。  所以我们迫切需要一种针对服务的健康检查机制,将服务的生命周期捆绑Keeplaived的生命周期,这样才能避免前面说的这种问题。

         3、如何针对Keepalived做监控?  针对排查和时刻了解Keeplaived VIP漂移情况还是很重要的, 那么我们要排查问题以及掌握Keepalived运行情况,那就离不开监控。 监控这块又该怎么做呢? 

        带着着这3个问题思考,我们展开一下3个主题的分享, 针对问题一一解决。

二、资源浪费问题-解决方案

1、整体架构

        我们为了消除资源浪费的这种情况,我们可以从本来提供1个VIP变成提供2个VIP来设计让A、B两台服务器互为主备。 那这2个VIP客户端怎么访问呢? 我们可以让客户端依赖一个定义好的域名, 这个域名在DNS服务器进行A记录轮询解析,这样可以解决客户端依赖问题。 我们通过整体架构图的方式更简单明了的展示如下:

          第1个VIP(172.0.20.110):   设置MASTER节点为172.20.0.2、BACKUP节点为172.20.0.3

          第 2个VIP(172.0.20.111):  设置MASTER节点为172.20.0.3、BACKUP节点为172.20.0.2

          此时172.20.0.2和172.20.0.3互为主备节点。

  2、针对假设VIP1组的MASTER异常详细分析

          假设VIP1组中,MASTER节点挂了,也就是172.20.0.2挂了。  我们分析一下, 172.20.0.2在VIP2中的角色是BACKUP节点,所以本身就拿不到VIP2, 只拿到了VIP1。  那么此时172.20.0.2再挂掉, 从VIP1组的角度看,会发生故障迁移, 此时VIP1(172.0.20.110)会漂移到172.20.0.3中, 所以此时172.20.0.3会绑定2个VIP地址。  

        由于客户端依赖的是域名,发生问题的时候这个故障转移是无感知的。  此时DNS轮询VIP1和VIP2, 无论是走哪个VIP最后都会落到实际访问172.20.0.3, 此时172.20.0.3处于健康状态,所以能正常提供服务。 反过来从VIP2组的MASTER异常角度看也是类似。 数据流量走向图会变成如下:        

        设置2个VIP,让2个节点互为Keepalived主备关系既可以保证服务的高可用,同时也提高了资源的利用率, 两台服务器都能提供正常服务,相对早期的方案只有1个VIP的方式,提高了服务器的资源利用率!

         除非这2台服务器同时出现问题,才会导致服务的异常。否则如果只存在其中一台服务器宕机,那整个服务还是能由另外的节点提供正常服务。

        那如果出现2台都同时出现问题,这时候又该怎么办呢?  例如这2台服务器所处的同一个机房全挂了、断电了等等。 那么此时跳出这个维度, 可以做异地多活、异地高可用架构了。 例如北京的机房挂了,流量直接全部切到上海机房,  原理其实类似。

三、Keepalived与服务同生共死-保证拿到VIP的节点能正常提供服务

1、实现原理与基本配置

        为了避免由于例如Nginx服务已经挂了,但是所处节点的Keepalived还掌握着VIP资源,导致访问VIP不能正常提供服务的问题。 Keepalived本身提供了一种针对可以对服务进行健康检查机制, 就是通过定时执行自定义好的健康检查脚本, 这个脚本可以通过shell编写、python编写、go甚至任何一种编程语言实现,只要是最后可以执行的程序脚本即可,通过执行返回值进行判定服务是否正常。 服务正常则无需处理任何逻辑,但是一旦服务不正常,先把自己的Keepaloved的优先级priority降低权重, 最后可以直接把Keepalived进程kill掉, 这样的话,由于Keeplaived被kill了,VIP会漂移到健康节点上提供正常的服务。 

       nginx_check.sh脚本如下:

#!/bin/bash
num=`ps -C nginx --no-header | wc -l`
if [ $num -eq 0 ];thensystemctl start nginx  #尝试重启nginxsleep 1if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then  #再次查看是否正常启动, 如果还是无法启动,则停止keepalived进程, 触发VIP漂移到健康节点上systemctl stop keepalivedfi
fi

        keepalived.conf配置文件内容:


global_defs {#keepalived节点唯一ID标识名称router_id keep_02       
}# ****定义检测脚本 chk_nginx****
vrrp_script chk_nginx {script "/etc/keepalived/nginx_check.sh" #脚本绝对路径interval 1  #设置执行间隔
}vrrp_instance VI_1 {#节点角色: MASTER、BACKUPstate MASTER            #绑定VIP的网卡名称interface eth0          #虚拟路由ID组, 备用节点和主节点必须属于同一个组virtual_router_id  172  #节点优先级, 取值范围 0-255, 主节点的优先级要大于备用节点priority  100          #主备同步检查时间间隔advert_int  1           #认证信息,主备一致authentication {        auth_type PASSauth_pass 1234}#VIP地址virtual_ipaddress {172.20.0.110     }# ****引用检测脚本chk_nginx****track_script{chk_nginx}
}

        通过上面的配置定时执行检测服务是否健康的脚本,从而来判定是否需要将Keepalived程序杀死进行VIP故障切换, 让其他节点拿到VIP尝试提供正常的服务。

  

四、Keepalived对接Prometheus监控

1、Keepalived的监控原理

        实际上Keepalived提供了2个Linux信号:

        1、可以查看当前Keepalived实例的配置参数信息(其中包括当前优先级priority的值、VIP地址信息、以及加载的配置信息), 这类数据存储在keepalived.data文件

 kill  -USR1  $keepalived_pid  #执行完后,生成/tmp/keepalived.data

        2、另外的一种监控数据就是可以查看切换主备统计次数、上次切换时间等等这类数据存储在keepalived.stats  

 kill  -USR2  $keepalived_pid  #执行完后,生成/tmp/keepalived.stats

        这个2个信号十分有用! 十分有用! 十分有用 !   重要的事情说三遍!

        因为我们排查某些情况下为什么VIP漂移了?  为什么某些情况VIP不进行漂移?   我们要看到当时Keepalived节点的priority优先级的值, 再结合存在的配置信息排查原因更加得心应手。 要不然你是看不到keepalived节点当时的优先级priority值[这个值可能在运行过程中经历了动态增加或者减少],从而很难排查故障问题。

2、Keepalived_exporter

        对接Prometheus监控系统,存在开源的keepalived_exporter可以暴露keepalived的相关运行参数指标:

        项目地址: https://github.com/mehdy/keepalived-exporter

        实现原理分析: 

        通过源码可以知道,这个keepalived_exporter的实现原理也是通过执行USR1、USR2指令生成keepalived.data、keepalived.stats文件,对生成的文件进行解析,提取出指标数据,最后暴露出来即可。

        如果这个项目有些指标参数不满足我们的需求, 可以fork后自己修改自定义功能。  例如这个项目就没把Keepalived的vrrp_instance 对应的 优先级priority暴露出来

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

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

相关文章

LLM之RAG实战(四):Self-RAG如何革命工业LLM

论文地址:https://arxiv.org/pdf/2310.11511.pdf Github地址:https://github.com/AkariAsai/self-rag 尽管LLM(大型语言模型)的模型和数据规模不断增加,但它们仍然面临事实错误的问题。现有的Retrieval-Augmented Gen…

一文讲清 QWidget 大小位置

一文讲清 QWidget 大小位置 前言 ​ QWidget 的位置基于桌面坐标系,以左上角为原点,向右x轴增加,向下y轴增加。 一、图解 ​ ​ 如上图所示,当窗口为顶层窗口时(即没有任何父窗口),系统会自…

JVM的五大分区

1.方法区 方法区主要用来存储已在虚拟机加载的类的信息、常量、静态变量以及即时编译器编译后的代码信息。该区域是被线程共享的。 2.虚拟机栈 虚拟机栈也就是我们平时说的栈内存,它是为java方法服务的。每个方法在执行的 时候都会创建一个栈帧,用于存…

数据结构学习 12字母迷宫

dfs 回溯 剪枝 这个题和dfs有关,但是我之前没有接触过,我看了这一篇很好的文章,看完之后写的答案。 我觉得很好的总结: dfs模板 int check(参数) {if(满足条件)return 1;return 0; }void dfs(int step) {判断边界{相应操作}尝试…

【JUC】二十九、synchronized锁升级之轻量锁与重量锁

文章目录 1、轻量锁2、轻量锁的作用3、轻量锁的加锁和释放4、轻量级锁的代码演示5、重量级锁6、重量级锁的原理7、锁升级和hashcode的关系8、锁升级和hashcode关系的代码证明9、synchronized锁升级的总结10、JIT编译器对锁的优化:锁消除和锁粗化11、结语 &#x1f4…

基士得耶速印机印件故障解决方法和印刷机使用注意事项

基士得耶和理光两个品牌的一体化速印机同属于理光公司的两个不同品牌。基士得耶速印机的每个机型,都有和它通用的理光速印机的机型相对应。(油墨版纸通用,外观一样,配件全部通用。)速印机在印刷的时候,经常…

USB2.0 Spec 中文篇

体系简介 线缆 USB 是一种支持热拔插的高速串行传输总线,使用一对(两根)差分信号来传输数据,半双工。要求使用屏蔽双绞线。 供电 USB 支持 “总线供电” 和 “自供电” 两种供电模式。在总线供电方式下,设备最多可…

Tofu目标识别跟踪模块

Tofu3 是多波段视频物体识别跟踪模块,支持可见光视频与红外视频的输入,支持激光补光变焦自适应控制,支持视频下的多类型物体检测、识别、跟踪等功能。 产品支持视频编码、设备管理、目标检测、深度学习识别、跟踪等功能,提供多机…

智慧灯杆技术应用分析

智慧灯杆是指在传统灯杆的基础上,通过集成多种先进技术实现城市智能化管理的灯杆。智慧灯杆技术应用的分析如下: 照明功能:智慧灯杆可以实现智能调光、时段控制等功能,根据不同的需求自动调节照明亮度,提高照明效果&am…

利用Pytorch预训练模型进行图像分类

Use Pre-trained models for Image Classification. # This post is rectified on the base of https://learnopencv.com/pytorch-for-beginners-image-classification-using-pre-trained-models/# And we have re-orginaized the code script.预训练模型(Pre-trained models)…

大型科技公司与初创公司:选择哪一个?

你有没有想过,特别是在你职业生涯的开始,选择什么类型的公司?它应该是一家像谷歌、亚马逊、Meta 这样的大型科技公司,还是为一家小型初创公司工作。在本文中,我们将讨论实际差异是什么,并帮助你选择最适合你…

『OPEN3D』1.8.3 多份点云配准

多份点云配准是将多份点云数据在全局空间中对齐的过程。通常,输入是一组数据(例如点云或RGBD图像){Pi}。输出是一组刚性变换{Ti},使得经过变换的点云在全局空间中对齐。 NNNNNathan 本专栏地址: https://blog.csdn.net/qq_41366026/category_12186023.html 此处是…

DHCP—动态主机配置协议

动态主机配置协议DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是RFC 1541(已被RFC 2131取代)定义的标准协议,该协议允许服务器向客户端动态分配IP地址和配置信息。 DHCP协议支持C/S&#x…

RocketMQ 总体概括

目录 概述RocketMQ 领域模型MQ 解决的问题电商平台案例初步设计引入中间件设计 MQ 选型结束 概述 官网地址 RocketMQ 领域模型 官方领域模型概述 下面图,是在自己理解的基础上,对官方的模型图添加了一些。 Topic:主题,可以理解…

Java网络编程——基于UDP的数据报和套接字

java.net.ServerSocket与java.net.Socket建立在TCP的基础上。TCP是网络传输层的一种可靠的数据传输协议。如果数据在传输途中被丢失或损坏,那么TCP会保证再次发送数据;如果数据到达接收方的顺序被打乱,那么TCP会在接收方重新恢复数据的正确顺…

扬声器(喇叭)

扬声器(喇叭) 电子元器件百科 文章目录 扬声器(喇叭)前言一、扬声器(喇叭)是什么二、扬声器(喇叭)的类别三、扬声器(喇叭)的应用场景四、扬声器(喇叭)的作用原理总结前言 扬声器广泛应用于音响系统、公共广播系统、汽车音响、电视、电脑和移动设备等各种电子设备…

Linux基本开发工具

编译器和自动化构建工具 一、编译器——gcc、g1. 安装 gcc/g2. 使用3. 链接库4. 拓展命令:od/file/ldd/readelf 二、自动化构建项目——make、makefile1. 介绍2. 使用例子touch——change file timestampsstat——display file or file system status修改时间 .PHON…

Qt 文字描边(基础篇)

项目中有时需要文字描边的功能 1.基础的绘制文字 使用drawtext处理 void MainWindow::paintEvent(QPaintEvent *event) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);painter.setRenderHint(QPainter::SmoothPixmapTransform, true);painte…

ceph的osd盘删除操作和iscsi扩展

ceph的osd盘删除操作 拓展:osd磁盘的删除(这里以删除node1上的osd.0磁盘为例) 1, 查看osd磁盘状态 [rootnode1 ceph]# ceph osd tree ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF -1 0.00298 root default -3 0.00099 host node10 hdd 0.00…

【Vins轨迹】pose_graph位姿图加载EVO精度评定

1. Vins的位姿图加载功能 如果想要对slam运行后的位姿轨迹进行评定,需要将数据保存到output文件夹中。 其中pose_graph.txt含有的信息:关键帧id、时间戳、vio的xyz、优化后的xyz、vio的四元数、优化后的四元数、回环到的关键帧id、回环信息&#xff08…