keepalived双机热备方案实现Nginx高可用

server/2024/11/26 9:19:09/

问题描述

只用一台Nginx做反向代理,如果这台Nginx出现故障(比如宕机),则服务不可用。

以下给出keepalived双机热备方案实现Nginx高可用的方法。先介绍几个概念:

高可用

高可用(High Availability)是指系统或服务能够在面对硬件故障、软件崩溃、网络问题等各种故障情况下,仍然保持正常运行或快速恢复的能力,以减少服务中断时间,确保业务连续性和数据完整性。

双机热备

指一台服务器提供服务,另一台作为备用。当一台服务器不可用时另一台就自动顶上去。

keepalived_11">keepalived

一个开源的高可用解决方案,通过VRRP协议实现故障转移,避免单点故障导致的服务中断。

keepalivedNginx_14">keepalived双机热备方案实现Nginx高可用的步骤

准备两台Nginx环境

安装两台Linux虚拟机,每台虚拟机安装Nginx(如何安装Nginx)

  • 192.168.52.200 (Nginx1)
  • 192.168.52.201 (Nginx2)

修改Nginx.conf, 给Nginx1,Nginx2分别添加一个简单的主页

Nginx1

    server {listen 80;server_name localhost;location / {default_type text/html;return 200 '<h1>welcome to Nginx1</h1>';}# ...}

Nginx2

    server {listen 80;server_name localhost;location / {default_type text/html;return 200 '<h1>welcome to Nginx2</h1>';}# ...}

启动Nginx

systemctl start nginx

安装并配置Keepalived

Nginx1,Nginx2都安装keepalived, 如下:

yum -y install keepalived

修改Nginx1的keepalived主配置文件/etc/keepalived/keepalived.conf

vrrp_script chk_http_port {script "/usr/local/bin/keepalived_check_nginx.sh" #心跳检测脚本interval 2 #检测脚本执行的间隔,单位是秒)weight 2   #权重
}vrrp_instance VI_1 {state BACKUP            # 指定keepalived的角色,MASTER为主,BACKUP为备interface ens33         # 指定vrrp通讯的网卡, ifconfig查下你的网卡名virtual_router_id 66    # 虚拟路由编号,主从要一致priority 100            # 优先级,数值越大,获取处理请求的优先级越高advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)nopreempt               # 设置为不抢占。这个配置只能在BACKUP主机上面设置#授权访问authentication {auth_type PASS      #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码auth_pass peter}track_script {chk_http_port       # 调用检测脚本}virtual_ipaddress {192.168.52.199      # 设置VIP}
}

Nginx2直接复用Nginx1的keepalived.conf即可

说明:

  • virtual_router_id指虚拟路由编号,主从要一致。
  • 如果需要主节点恢复后,VIP再转移到主节点,需要设置为state MASTER;
  • 如不需要抢占,可以设置为state BACKUP, 同时设置nopreempt; 对于多个从节点场景,发生故障转移后,根据priority选取MASTER节点。

编写检测脚本

编写keepalived_check_nginx.sh,判断Nginx是否启动。如果Nginx没有启动并且重启也失败,就停止keepalived服务,进行VIP转移

cmd=`ps -C nginx --no-header |wc -l`
if [ $cmd -eq 0 ];thensystemctl start nginxif [ `ps -C nginx --no-header |wc -l` -eq 0 ];thenkillall keepalivedfi
fi

把脚本分别传到Nginx1和Nginx2的/usr/local/bin路径

配置防火墙

VRRP使用组播地址, 必须配置相应firewall规则或关闭firewall,否则会出现脑裂。
添加规则

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload

或者直接关闭firewall

systemctl disable firewalld --now

keepalived_118">启动keepalived,开始测试

测试Nginx1, Nginx2可以正常访问
curl 192.168.52.200
Welcome to Nginx1
curl 192.168.52.201
Welcome to Nginx2
keepalived_128">启动Nginx1和Nginx2的keepalived
systemctl start keepalived

比如,我先启动Nginx1的keepalived,再启动Nginx2,那么在Nginx1上可以看到VIP(192.168.52.199), Nginx2查不到VIP

ip a
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:36:d4:a9 brd ff:ff:ff:ff:ff:ffinet 192.168.52.200/24 brd 192.168.52.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.52.199/32 scope global ens33valid_lft forever preferred_lft forever
通过VIP访问, 可以返回Nginx1的主页
curl 192.168.52.199
welcome to Nginx1
在Nginx1构造故障, 再通过VIP可以访问Nginx2的主页
# 先构造Nginx1故障
curl 192.168.52.199
welcome to Nginx2

构造故障方法,可以是先stop nginx,再mv Nginx主程序

keepalivedVIPNginx2_157">再恢复Nginx1(重启Nginx和keepalived),访问VIP,仍返回Nginx2
curl 192.168.52.199
welcome to Nginx2

这是符合预期的,因为我们在配置文件里设置了BACKUP和nopreempt

最后构造Nginx2故障,访问VIP,可以返回Nginx1的主页
curl 192.168.52.199
welcome to Nginx1

keepalived_170">keepalived故障转移原理概述

  • 基于VRRP(Virtual Router Redundancy Protocol)协议,通过在多个服务器之间共享一个虚拟IP地址来实现。
  • 监控到主服务器(Master)出现故障时,备份服务器(Backup)会检测到并自动接管虚拟IP,继续提供服务。
  • 这个过程对客户端是透明的,确保了服务的连续性和高可用性。

参考

【1】nginx+keepalived高可用配置笔记
【2】https://docs.nginx.com/nginx/admin-guide/high-availability/ha-keepalived/


http://www.ppmy.cn/server/145017.html

相关文章

初识Linux—— 基本指令(下)

前言&#xff1a; 本篇继续来学习Linux的基础指令&#xff0c;继续加油&#xff01;&#xff01;&#xff01; 本篇文章对于图片即内容详解&#xff0c;已同步到本人gitee&#xff1a;Linux学习: Linux学习与知识讲解 Linux指令 1、查看文件内容的指令 cat ​ cat 查看文件…

招商蛇口|在低密园林里,开启生活的“任意门”

“最好的建筑是这样的&#xff0c;我们深处在其中,却不知道自然在哪里终了&#xff0c;艺术在哪里开始。” 凭借深耕西安10载的城市远见&#xff0c;以及建立在成功人居经验之上的敏锐洞察&#xff0c;招商蛇口将林语堂名言里的生活&#xff0c;变成了现实。 都市化越是加速&…

RabbitMQ 之 死信队列

一、死信的概念 先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;字面意思可以这样理 解&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或者直接到 queue 里了&#xff0c;consumer 从 queue 取出消息进行…

2024算法基础公选课练习四(综合2)

一、前言 最后几个题确实有难度&#xff0c;这次有两题没整出来 二、题目总览 三、具体题目 3.1 问题 A: 水题系列1-B(班级排位) 思路 最暴力的思路是写线段树&#xff0c;然后暴力枚举两个端点&#xff0c;总体时间复杂度为O(n^2*logn)最坏会到1e9的数量级&#xff0c;可能…

【Java 学习】详细讲解---包和导包、Scanner类、输入源

1. 包 1.1 什么是包&#xff1f; 举个例子&#xff0c;你和你的同学有不同的家庭&#xff0c;你们都有自己的爸爸妈妈&#xff0c;都有自己的家。在自己的家中你们可以按照自己爱好摆放东西&#xff0c;都互不干扰。但是&#xff0c;假如你们的家都在一起&#xff0c;你们就不…

未来可期:保研后的人工智能研究生活

哈喽&#xff0c;大家好&#xff01;好久没有更新博客了&#xff0c;今天想和大家分享一个好消息&#xff5e; 我已经成功保研至 南昌大学数学与计算机学院&#xff0c;研究方向是 人工智能 -- 人体行为识别。 回顾大学三年的时光&#xff0c;虽然谈不上轰轰烈烈&#xff0c;但…

鸿蒙HarmonyOS学习笔记(4)

自定义构建函数&#xff1a;Builder装饰器 ArkUI提供了一种轻量的UI元素复用机制Builder&#xff0c;该自定义组件内部UI结构固定&#xff0c;仅与使用方进行数据传递&#xff0c;开发者可以将重复使用的UI元素抽象成一个方法&#xff0c;在build方法里调用。 为了简化语言&a…

理解clickhouse 里的分区和分片键区别

文章目录 分片分区两分片&#xff0c;0副本的cluster 分片 CREATE TABLE logs_distributed AS logs_local ENGINE Distributed(cluster_name, -- 集群名称database_name, -- 数据库名称logs_local, -- 本地表名cityHash64(user_id) -- 分片键&#xf…