nginx+keepalived负载均衡及高可用

1 项目背景

keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。采用nginx+keepalived,它是一个高性能的服务器高可用或者热备解决方案,Keepalived主要来防止服务器单点故障的发生问题,可以通过其与Nginx的配合实现Web服务器端的高可用。使用keepalived可以保证nginx的高可用,他能监控nginx的健康状态,当nginx出现宕机时自动主备切换。

项目架构

Nginx+Keepalived实现高可用

2 项目环境

服务器角色(主机名)IP用途
Nginx_Master(open-Euler1)192.168.121.150提供负载均衡
Nginx_Backup(open-Euler2)192.168.121.151提供负载均衡
Client(Rocky8)192.168.121.160测试客户端
Web1服务器(open-Euler3)192.168.121.152提供Web服务
Web2服务器(open-Euler4)192.168.121.153提供Web服务

3 项目部署

节点服务器 生产环境中对于节点服务器需要利用共享存储(比如NFS存储)服务器提供的空间来提供服务,此处测试后端存储服务器略。

3.1 web01和web02配置:

提供web服务
#yum install nginx -y   //安装nginx服务
[root@open-Euler3 ~]# echo `hostname -I` > /usr/share/nginx/html/index.html  #html测试界面
[root@web1 ~]# systemctl start nginx

3.2 nginx负载均衡配置

两台nginx做同样配置

1、安装nginx

yum install nginx

2、配置nginx反向代理

[root@open-Euler1 keepalived]# cd /etc/nginx/conf.d/
[root@open-Euler1 conf.d]# cat lb.conf 
upstream webs {server 192.168.121.152:80;server 192.168.121.153:80;
}server {location / {proxy_pass http://webs;
}
}

3.3 调度服务器

3.3.1 主调度服务器

1、安装keepalived

[root@open-Euler1 conf.d]# yum install keepalived -y

2、开发检测nginx存活的shell脚本

[root@open-Euler1 conf.d]# vim /etc/keepalived/check_nginx.sh 
#!/bin/bash
#代码一定注意空格,逻辑就是:如果nginx进程不存在则启动nginx,如果nginx无法启动则kill掉keepalived所有进程
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];thensystemctl start nginxsleep 2if [ `ps -C nginx --no-header | wc -l` -eq 0 ] thensystemctl stop keepalivedfi
fi

3、配置keepalived

[root@open-Euler1 conf.d]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id LVS_1
}vrrp_script check_nginx {script "/etc/keepalived/check_nginx.sh"  #你的监控脚本位置,路径不能出错
}vrrp_instance VI_1 {state MASTERinterface ens160lvs_sync_daemon_interface ens192virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.121.180}track_script {check_nginx
}
}

VRRP script(补充)

通过vrrp_script实现对集群资源的监控

1)在keepalived学习总结中已经说过,keepalived只是提供一个VIP,但高可用的是服务,因此keepalived一般会与lvs、nginx、haproxy、mysql…等服务器联合使用,以实现服务的高可用,但是若keepalived与之联合使用的服务异常时,此处keepalived提供的VIP也就没有任何意义了,因此此时的VIP我们希望它可以自动检测与keepalived连用的服务是否正常,若服务不正常,VIP实现自动飘移至backup节点,此时可以使用VRRP scripts实现。

2)keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整。

3)vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值进行下一步操作,脚本可被多个实例调用。track_script:调用vrrp_script定义的脚本去监控资源,定义在实例之内,调用事先定义的vrrp_script。

4)VRRP scripts的实现:

1>通过killall命令探测服务运行状态:

这种监控集群服务的方式主要是通过killall命令实现的。killall会发送一个信号到正在运行的指定命令的进程。如果没指定信号名,则发送SIGTERM。SIGTERM也是信号名的一种,代号为15,它表示以正常的方式结束程序的运行。其实killall可用的信号名有很多,可通过“killall -l ”命令显示所有信号名列表,其中每个信号名代表对进程的不同执行方式,例如,代号为9的信号表示将强制中断一个程序的运行。这里要用到的信号为0,代号为0的信号并不表示要关闭某个程序,而表示对程序(进程)的运行状态进行监控,如果发现进程关闭或其他异常,将返回状态码1,反之,如果发现进程运行正常,将返回状态码0.vrrp_script模块正是利用了killall命令的这个特性,变相实现了对服务运行状态的监控。

例:

vrrp_script check_mysqld {
script "killall -0 mysqld"
interval 2
}track_script {
check_mysqld
}

这个例子定义了一个服务监控模块check_mysqld,其采用的监控的方式是通过“killall -0 mysqld”的方式,其中“interval”选项检查的时间间隔,即2s执行一次检测。

2>通过脚本进行服务状态监控:

vrrp_script <SCRIPT_NAME> {             #定义一个检测脚本,在global_defs 之外配置script <STRING>|<QUOTED-STRING>     # shell命令或脚本路径interval <INTEGER>                  # 间隔时间,单位为秒,默认1秒timeout <INTEGER>                   # 超时时间weight <INTEGER:-254..254>          # 权重,当脚本成功或失败对当前节点的优先级是增加还是减少,这个值会与定义的优先级做加法例:-80时则为priority+(-80)。weight为正数:1、当 Master 节点的“ vrrp_script” 脚本检测失败时, 如果 Master 节点的 “priority ” 值小于 Backup 节点的 “ weight” 值与 “ priority ” 值之和, 将发生主、 备切换。2、当 Master 节点的“ vrrp_script” 脚本检测成功时, 如果 Master 节点的 “ weight ” 值与 “ priority ” 值之和大于 Backup 节点的 “ weight” 值与 “ priority” 值之和, 主节点依然为主节点, 不发生切换。weight为负数:1、当 Master 节点的 “ vrrp script” 脚本检测失败时, 如果 Master 传点的 “ priority” 值与 “weight” 值之差小于 Backup 竹点的 “ priority ” 值, 将发生主、 备切换。2、当 Master 节点的“ vrrp_script” 脚本检测成功时, 如果 Master 诗点的 “ priority ” 值大于 Backup 节点的 “priority ” 值, 主节点依然为主节点, 不发生切换。fall <INTEGER>                      #脚本几次失败转换为失败rise <INTEGER>                      # 脚本连续监测成果后,把服务器从失败标记为成功的次数user USERNAME [GROUPNAME]           # 执行监测的用户或组init_fail                           # 设置默认标记为失败状态,监测成功之后再转换为成功状态
}

这是最常见的监控方式,其监控过程类似于nagios的执行方式,不同的是,这里只有0、1两种返回状态,例如:

vrrp_script chk_mysqld {
script "/etc/keepalived/check_mysqld.sh"
interval 2
}track_script {
chk_mysqld
}

其中,check_mysqld.sh的内容为:

#!/bin/bash
/usr/bin/mysql -e "show status;" > /dev/null 2>&1
if [ $? -eq 0 ];then
MYSQL_STATUS=0
else
MYSQL_STATUS=1
fiexit $MYSQL_STATUS

这是一个最简单的实现MySQL服务状态检测的shell脚本,它通过登录MySQL数据库后执行查询操作来检测MySQL运行是否正常,如果检测正常,将返回状态码0,否则返回状态码1。

3.3.2 从调度服务器

1、安装keepalived

[root@open-Euler2 conf.d]# yum install keepalived -y

2、开发检测nginx存活的shell脚本

[root@open-Euler2 conf.d]# vim /etc/keepalived/check_nginx.sh 
#!/bin/bash
#代码一定注意空格,逻辑就是:如果nginx进程不存在则启动nginx,如果nginx无法启动则kill掉keepalived所有进程
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];thensystemctl start nginxsleep 2if [ `ps -C nginx --no-header | wc -l` -eq 0 ] thensystemctl stop keepalivedfi
fi

3、配置keepalived

[root@open-Euler2 keepalived]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id LVS_2  #改
}vrrp_script check_nginx {script "/etc/keepalived/check_nginx.sh"
}vrrp_instance VI_1 {state BACKUP #改interface ens160lvs_sync_daemon_interface ens192virtual_router_id 51priority 80 #改advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.121.180}track_script {check_nginx
}
}

注意:keepalived配置文件里面注意空格问题。

比如:script "/etc/keepalived/check_nginx.sh"后面不能空格。

4 项目测试

启动主从调度的nginx和keepalived

[root@open-Euler1 ~]# systemctl restart nginx keepalived
[root@open-Euler2 ~]# systemctl restart nginx keepalived

Master,Backup都正常,只有Master对外提供服务

[root@open-Euler1 conf.d]# ip a | grep "192.168.121.180"inet 192.168.121.180/32 scope global ens160

Master宕机,Backup接替Master对外提供服务

模拟Master的keepalived服务器停止
[root@open-Euler1 ~]# systemctl stop keepalived.service 
此时VIP在open-Euler2上
[root@open-Euler2 conf.d]# ip a | grep "192.168.121.180"inet 192.168.121.180/32 scope global ens160

Master恢复正常,Master继续提供服务,Backup停止服务

模拟Master的keepalived服务恢复正常
[root@open-Euler1 ~]# systemctl start keepalived.service 
此时VIP在Master上
[root@open-Euler1 conf.d]# ip a | grep "192.168.121.180"inet 192.168.121.180/32 scope global ens160

Master上的nginx服务停止,监控脚本尝试重新启动nginx

[root@open-Euler1 conf.d]# systemctl stop nginx
[root@open-Euler1 conf.d]# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy serverLoaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)Active: active (running) since Fri 2025-02-28 20:05:22 CST; 4s agoProcess: 14207 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)Process: 14211 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)Process: 14214 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)Main PID: 14215 (nginx)Tasks: 3 (limit: 8932)Memory: 4.0MCGroup: /system.slice/nginx.service├─ 14215 "nginx: master process /usr/sbin/nginx"├─ 14216 "nginx: worker process"└─ 14217 "nginx: worker process"Feb 28 20:05:22 open-Euler1 systemd[1]: Starting The nginx HTTP and reverse proxy server...
Feb 28 20:05:22 open-Euler1 nginx[14211]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Feb 28 20:05:22 open-Euler1 nginx[14211]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Feb 28 20:05:22 open-Euler1 systemd[1]: Started The nginx HTTP and reverse proxy server.

可以看到即使我关闭了nginx服务监控脚本也帮我重新开启了服务

模拟修改错误nginx配置文件的话导致无法启动

[root@open-Euler1 conf.d]# vim /etc/nginx/nginx.conf
[root@open-Euler1 conf.d]# systemctl stop nginx

查看日志

[root@open-Euler1 nginx]# tail -f /var/log/messages 

可以看到日志中监控脚本检测失败

这时VIP就飘移到了open-Euler2服务器上

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

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

相关文章

LeapVAD:通过认知感知和 Dual-Process 思维实现自动驾驶的飞跃

25年1月来自浙江大学、上海AI实验室、慕尼黑工大、同济大学和中科大的论文“LeapVAD: A Leap in Autonomous Driving via Cognitive Perception and Dual-Process Thinking”。 尽管自动驾驶技术取得长足进步&#xff0c;但由于推理能力有限&#xff0c;数据驱动方法仍然难以应…

STM32G431RBT6——(2)浅析Cortex-M4内核

本篇博客是一个对Cortex-M4内核了解性的简介&#xff0c;不会涉及到深奥的理论&#xff0c;请大家放心食用。 我们所学习的STM32G431RBT6单片机是基于ARM的Cotex-M4内核&#xff0c;因此我们有必要对此内核做一个大概了解。其实M4内核和M3内核有很大的相似之处&#xff0c;很多…

python-leetcode-删除并获得点数

740. 删除并获得点数 - 力扣&#xff08;LeetCode&#xff09; 解法 1&#xff1a;动态规划&#xff08;O(n) 时间&#xff0c;O(n) 空间&#xff09; class Solution:def deleteAndEarn(self, nums: List[int]) -> int:if not nums:return 0# 统计每个数的贡献points Cou…

【北京迅为】iTOP-RK3568OpenHarmony系统南向驱动开发-第4章 UART基础知识

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

git 强推

1、查看git版本 git --version 如果你已经安装了 Git&#xff0c;可以检查是否安装成功&#xff1a; 打开命令提示符&#xff08;CMD&#xff09;或 PowerShell。输入 git --version&#xff0c;如果安装成功&#xff0c;应该会显示 Git 的版本信息。 2、强推 git push or…

server.servlet.session.timeout: 12h(HTTP 会话的超时时间为 12 小时)

从你提供的配置文件&#xff08;应该是 Spring Boot 的 application.yml 或 application.properties 文件&#xff09;来看&#xff0c;以下部分与会话超时时间相关&#xff1a; server:servlet:session:timeout: 12h # timeout: 30cookie:name: VENDER_SID会话超时时间的…

【论文笔记-ECCV 2024】AnyControl:使用文本到图像生成的多功能控件创建您的艺术作品

AnyControl&#xff1a;使用文本到图像生成的多功能控件创建您的艺术作品 图1 AnyControl的多控制图像合成。该研究的模型支持多个控制信号的自由组合&#xff0c;并生成与每个输入对齐的和谐结果。输入到模型中的输入控制信号以组合图像显示&#xff0c;以实现更好的可视化。 …

x64汇编下过程参数解析

简介 好久没上博客, 突然发现我的粉丝数变2700了, 真是这几个月涨的粉比我之前好几年的都多, 于是心血来潮来写一篇, 记录一下x64下的调用约定(这里的调用约定只针对windows平台) Windows下的x64程序的调用约定有别于x86下的"stdcall调用约定"以及"cdecl调用约…

WSDM24-因果推荐|因果去偏的可解释推荐系统

1 动机 可解释推荐系统&#xff08;ERS&#xff09;通过提供透明的推荐解释&#xff0c;提高用户信任度和系统的说服力&#xff0c;如下图所示&#xff0c;然而&#xff1a; 1&#xff1a;现有工作主要关注推荐算法的去偏&#xff08;流行度偏差&#xff09;&#xff0c;但未显…

深度解析 ANSI X9.31 TR-31:金融行业密钥管理核心标准20250228

深度解析 ANSI X9.31 TR-31&#xff1a;金融行业密钥管理核心标准 在当今数字化金融时代&#xff0c;信息安全至关重要&#xff0c;而密钥管理则是保障金融数据安全的核心环节。ANSI X9.31 TR-31作为金融行业密钥管理的关键标准&#xff0c;为对称密钥的全生命周期管理提供了坚…

Coredns延迟NodeLocalDNS解决之道

#作者&#xff1a;邓伟 文章目录 问题列表问题分析&#xff1a;问题分析解决方案详情方案验证部署步骤验证结论回滚方案回滚验证注意事项NodeLocalDNS介绍 问题列表 近来发现K8s频繁出现5s超时问题&#xff0c;业务反馈收到一定影响&#xff0c;问题包括&#xff1a; coredn…

Apollo Cyber 学习笔记

目录 0 Introduction What Why Advantage 1 Example 2 Concept 3 Flow Chart 4 Module 4.1 Transport 4.1.1 Share Memory 4.1.1.1 Segment 4.1.1.1.1 State 4.1.1.1.2 Block 4.1.1.1.3 Common 4.1.1.2 Notifier 4.1.1.2.1 ConditionNotifier 4.1.1.2.2 Multi…

正浩创新内推:校招、社招EcoFlow社招内推码: FRQU1CY

EcoFlow社招内推码: FRQU1CY 投递链接: https://ecoflow.jobs.feishu.cn/s/Vo75bmlNr6c

FreeRTOS-中断管理

实验目的 创建一个队列及一个任务&#xff0c;按下按键 KEY1 触发中断&#xff0c;在中断服务函数里向队列里发送数据&#xff0c;任务则阻塞接 收队列数据。 实验代码 实验结果 这样就实现了&#xff0c;使用中断往队列的发送信息&#xff0c;用任务阻塞接收信息

【通俗讲解电子电路】——从零开始理解生活中的科技(一)

导言&#xff1a;电子电路为什么重要&#xff1f; ——看不见的“魔法”&#xff0c;如何驱动你的生活&#xff1f; 清晨&#xff0c;当你的手机闹钟响起时&#xff0c;你可能不会想到&#xff0c;是电子电路在精准控制着时间的跳动&#xff1b;当你用微波炉加热早餐时&#…

无人机与AI!

一、技术革新&#xff1a;AI赋能无人机智能化 自主导航与避障 AI通过深度学习与计算机视觉技术&#xff0c;使无人机能够在复杂环境中实时分析飞行路径、预测障碍物并自主调整路线。例如&#xff0c;微分智飞推出的P300无人机可在无GPS信号的环境下完成自主导航&#xff0c;利…

基因型—环境两向表数据分析——品种生态区划分

参考资料&#xff1a;农作物品种试验数据管理与分析 用于品种生态区划分的GGE双标图有两种功能图&#xff1a;试点向量功能图和“谁赢在哪里”功能图。双标图的具体模型基于SD定标和h加权和试点中心化的数据。本例中籽粒产量的GGE双标图仅解释了G和GE总变异的53.6%&#xff0c;…

【江科大STM32】TIM输出比较(学习笔记)

本章图片文字内容也为重要知识&#xff0c;请马住&#xff01; 输出比较简介 OC&#xff08;Output Compare&#xff09;输出比较输出比较可以通过比较CNT与CCR寄存器值的关系&#xff0c;来对输出电平进行置1、置0或翻转的操作&#xff0c;用于输出一定频率和占空比的PWM波形…

在Linux上安装MySQL

1.下载Linux版MySQL安装包 https://downloads.mysql.com/archives/community/ 2. 上传MySQL安装包 &#xff08;FinalShell示例&#xff09; 3. 创建目录,并解压 mkdir mysqltar -xvf mysql-8.0.26-1.el7.x86_64.rpm-bundle.tar -C mysql4. 安装mysql的安装包 cd mysqlr…

MyBatis的关联映射

前言 在实际开发中&#xff0c;对数据库的操作通常会涉及多张表&#xff0c;MyBatis提供了关联映射&#xff0c;这些关联映射可以很好地处理表与表&#xff0c;对象与对象之间的的关联关系。 一对一查询 步骤&#xff1a; 先确定表的一对一关系确定好实体类&#xff0c;添加关…