nginx+keepalived实现nginx高可用集群以及nginx实现Gateway网关服务集群

news2024/11/20 1:54:23

一、前言

1、简介

Nginx作为一款高性能的Web服务器和反向代理服务器,被广泛使用。且现如今很多高并发场景需要后端服务集群部署,因此nginx也需要支持集群部署从而避免单点故障的问题。
本文将详细介绍使用 Keepalived+Nginx 来实现Nginx的高可用集群和Nginx实现Gateway网关服务集群。

2、什么是Keepalived?

Keepalived是基于VRRP协议,作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
简单来讲Keepalived可以在master和slave子网卡建立一个相同的VIP(virtual IP),然后通过同一个虚拟出来的IP地址就可以访问两台服务器的Nginx。

二、实现步骤

实现 Keepalived+Nginx 高可用集群共有两种常用方案,即主从模式和双主模式。服务安装很简单所以本文不介绍如何安装Keepalived和Nginx服务,将从配置方面分别介绍如何实现。

1、主从模式

这种方案由两台服务器均部署一个Keepalived和一个Nginx服务,然后虚拟出一个VIP地址,两台服务器一台做主一台做备,但同时只有一台机器工作,主节点宕机后由从节点自动成为主节点。当主节点不出现故障的时候,从节点永远处于空闲状态。当主节点宕机重新上线后自动再次成为主节点。

1.1 服务器规划

角色ipvip地址部署服务
主节点10.50.7.5110.50.7.100Keepalived+Nginx
从节点10.50.7.7610.50.7.100Keepalived+Nginx

1.2 服务配置

1.2.1 keepalived配置

1、主节点keepalived.conf 配置如下(我的目录是在 /etc/keepalived/keepalived.conf如下图):
在这里插入图片描述
keepalived.conf :

! Configuration File for keepalived

global_defs {
    #路由id:当前安装keepalived节点主机的标识符,全局唯一
    router_id keep_51
}

# 定义chk_nginx脚本,脚本执行间隔10秒,权重-10,检测nginx服务是否在运行。
vrrp_script chk_nginx {  
 
    #这里通过脚本监测    
    script "/etc/keepalived/chk_nginx.sh"   
	
	  #脚本执行间隔,每2s检测一次
    interval 2    
	
    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5	
    weight -10     
	
    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)	
    fall 2     
	
    #检测1次成功就算成功。但不修改优先级	
    rise 1                    
}

vrrp_instance VI_1 {
    # 表示的状态,当前服务器为nginx的主节点,MASTER/BACKUP
    state MASTER
    # 当前实例绑定的网卡 可通过ip addr查询
    interface ens18
    # 保证主备节点一致
    virtual_router_id 100
    # 优先级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MASTER
    priority 100
    # 主备之间同步检查的时间间隔,默认1s
    advert_int 1
    # 认证授权的密码,防止非法节点的进入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟出来的VIP地址
    virtual_ipaddress {
        10.50.7.100
    }
   	#执行nginx检测脚本。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!
    track_script {   
       #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。	
       chk_nginx                    
    }
}

2、从节点keepalived.conf配置:

! Configuration File for keepalived

global_defs {
    #路由id:当前安装keepalived节点主机的标识符,全局唯一
    router_id keep_76
}

# 定义chk_nginx脚本,脚本执行间隔10秒,权重-10,检测nginx服务是否在运行。
vrrp_script chk_nginx {  
 
    #这里通过脚本监测    
    script "/etc/keepalived/chk_nginx.sh"   
	
	  #脚本执行间隔,每2s检测一次
    interval 2    
	
    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5	
    weight -10     
	
    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)	
    fall 2     
	
    #检测1次成功就算成功。但不修改优先级	
    rise 1                    
}

vrrp_instance VI_1 {
    # 表示的状态,当前服务器为nginx的从节点,MASTER/BACKUP
    state BACKUP
    # 当前实例绑定的网卡 可通过ip addr查询
    interface ens18
    # 保证主备节点一致
    virtual_router_id 100
    # 优先级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MASTER
    priority 99
    # 主备之间同步检查的时间间隔,默认1s
    advert_int 1
    # 认证授权的密码,防止非法节点的进入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟出来的VIP地址
    virtual_ipaddress {
        10.50.7.100
    }
   	#执行nginx检测脚本。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!
    track_script {   
       #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。	
       chk_nginx                    
    }
}

3、chk_nginx.sh
vim /etc/keepalived/chk_nginx.sh,
编辑完内容之后需要赋权限,命令:chmod +x /etc/keepalived/chk_nginx.sh

#!/bin/bash
A=`ps -C nginx --no-header |wc -l` 
if [ $A -eq 0 ];then 
    /home/chnsys/ecms/nginx/sbin/nginx
    sleep 3 
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ] 
    then
        systemctl stop keepalived 
    fi 
fi

或者

	#!/bin/bash
	counter=$(ps -ef|grep nginx | grep -v 'grep'|wc -l)
	if [ "${counter}" = "0" ]; then
	     /home/chnsys/ecms/nginx/sbin/nginx || true
	    sleep 3
	    counter=$(ps -ef|grep nginx | grep -v 'grep'|wc -l)
	    if [ "${counter}" = "0" ]; then
	        systemctl stop keepalived
	    fi
	fi

上述脚本需要按实际修改nginx的启动命令,两个脚本均可推荐第二个,这两个 Bash 脚本的主要目的是检查 Nginx 是否正在运行,并在其未运行时启动 Nginx。如果启动后 Nginx 仍然未运行,那么它将停止 keepalived 服务,keepalived 停止之后,将由从节点代替为主节点,防止主节点keepalived服务运行但是nginx服务挂掉导致后续服务无法访问的问题。

1.3 启动服务

分别启动两个服务器的nginx服务和keepalived服务,命令如下:
/home/chnsys/ecms/nginx/sbin/nginx(看具体的安装位置)
systemctl start keepalived (全局生效)

1.4 验证效果

分别访问主服务器和从服务器以及虚拟vip的nginx服务的默认页面地址:

在这里插入图片描述

可以看到,访问虚拟的VIP地址也可以访问到主服务器的nginx的默认页面。

1.5 主从切换

1、nginx

关闭主节点上的nginx服务,观察主节点的nginx是否会被自动重启。如果重启则说明chk_nginx脚本执行成功,如果nginx未能重启,则应当执行脚本中的命令关闭keepalived服务。

2、keepalived

关闭主节点的keepalived服务,观察vip是否会绑定到从服务器上。

重启主节点的keepalived服务,观察vip是否会绑定到主服务器上。

2、互为主从模式

这种方案,使用两个VIP地址,互为主备,轮询请求两个VIP地址,同时有两台机器工作,当其中一台机器出现故障,两台机器的请求转移到一台机器负担,非常适合于生产架构环境。

2.1 服务器规划

角色ipvip地址部署服务
主、从节点10.50.7.5110.50.7.100Keepalived+Nginx
从、主节点10.50.7.7610.50.7.101Keepalived+Nginx

2.2 服务配置

2.2.1 keepalived配置

​ 在双主模式中,大致内容与主从模式一样,需要额外添加以下内容,新增一个新的vrrp_instance配置,state 为主从配置相反的角色,如下:
注:chk_nginx.sh脚本在1.2.1 keepalived配置的第三个

1、主节点keepalived.conf 配置如下:

! Configuration File for keepalived

	global_defs {
	    #路由id:当前安装keepalived节点主机的标识符,全局唯一
	    router_id keep_51
	}
	
	# 定义chk_nginx脚本,脚本执行间隔10秒,权重-10,检测nginx服务是否在运行。
	vrrp_script chk_nginx {  
	 
	    #这里通过脚本监测    
	    script "/etc/keepalived/chk_nginx.sh"   
		
		  #脚本执行间隔,每2s检测一次
	    interval 2    
		
	    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5	
	    weight -10     
		
	    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)	
	    fall 2     
		
	    #检测1次成功就算成功。但不修改优先级	
	    rise 1                    
	}
	
	vrrp_instance VI_1 {
	    # 表示的状态,当前服务器为nginx的主节点,MASTER/BACKUP
	    state MASTER
	    # 当前实例绑定的网卡 可通过ip addr查询
	    interface ens18
	    # 保证主备节点一致
	    virtual_router_id 100
	    # 优先级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MASTER
	    priority 100
	    # 主备之间同步检查的时间间隔,默认1s
	    advert_int 1
	    # 认证授权的密码,防止非法节点的进入
	    authentication {
	        auth_type PASS
	        auth_pass 1111
	    }
	    # 虚拟出来的VIP地址
	    virtual_ipaddress {
	        10.50.7.100
	    }
	   	#执行nginx检测脚本。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!
	    track_script {   
	       #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。	
	       chk_nginx                    
	    }
	}
	
	vrrp_instance VI_2 {
	    # 表示的状态,当前服务器为nginx的主节点,MASTER/BACKUP
	    state BACKUP
	    # 当前实例绑定的网卡 可通过ip addr查询
	    interface ens18
	    # 保证主备节点一致
	    virtual_router_id 101
	    # 优先级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MASTER
	    priority 99
	    # 主备之间同步检查的时间间隔,默认1s
	    advert_int 1
	    # 认证授权的密码,防止非法节点的进入
	    authentication {
	        auth_type PASS
	        auth_pass 1111
	    }
	    # 虚拟出来的VIP地址
	    virtual_ipaddress {
	        10.50.7.101
	    }
	   	#执行nginx检测脚本。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!
	    track_script {   
	       #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。	
	       chk_nginx                    
	    }
	}

2、从节点keepalived.conf 配置如下:

	! Configuration File for keepalived

global_defs {
    
   router_id 76
}

# 定义chk_nginx脚本,脚本执行间隔10秒,权重-10,检测nginx服务是否在运行。
vrrp_script chk_nginx {  
 
    #这里通过脚本监测    
    script "/etc/keepalived/chk_nginx.sh"   
	
	#脚本执行间隔,每2s检测一次
    interval 2    
	
    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5	
    weight -10     
	
    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)	
    fall 2     
	
    #检测1次成功就算成功。但不修改优先级	
    rise 1                    
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens18
    virtual_router_id 100
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.50.7.100
    }
   	#执行nginx检测脚本。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!
    track_script {   
    
         #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。	
       chk_nginx                    
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface ens18
    virtual_router_id 101
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.50.7.101
    }
   	#执行nginx检测脚本。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!
    track_script {   
    
         #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。	
       chk_nginx                    
    }
}

2.3 启动或重启服务

分别启动两个服务器的nginx服务和keepalived服务,命令如下:
/home/chnsys/ecms/nginx/sbin/nginx(看具体的安装位置)
systemctl restart keepalived (全局生效)

2.4 验证效果

分别访问主服务器和从服务器的虚拟vip的nginx服务的默认页面地址:
在这里插入图片描述
可以看到两个服务器互为主从的效果

2.5 主从切换

同上述1.5中效果验证即可

三、实现网关集群

本文通过两种方案实现 Keepalived+Nginx 的高可用集群。还有一些其他的特性功能,例如主备节点切换后邮件通知等也只需修改相关配置即可,本文主要实现主备切换的功能就不在此赘述。
一般来讲会再通过nginx来路由请求后台网关服务,网关服务同样需要集群来解决单点故障问题,可以利用nginx的特性来反向代理网关集群:

1、nginx.conf配置

upstream niginx-http-cluster{
	server 10.50.7.51:8080;
	server 10.50.7.76:8080;
}

server {
	listen       8080;
	server_name  localhost;
    location / {
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header Origin '';
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://niginx-http-cluster/hello/;
	}
}

按照上述配置之后,nginx会轮询访问两个网关服务的地址,当其中一个服务挂掉之后,就会自动切换到正常的服务,从而实现网关服务集群。

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

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

相关文章

Leetcode2583. 二叉树中的第 K 大层和

Every day a Leetcode 题目来源:2583. 二叉树中的第 K 大层和 解法1:层序遍历 排序 先使用层序遍历计算出树的每一层的节点值的和,保存在数组 levelSum 中。然后将数组进行排序,返回第 k 大的值。需要考虑数组长度小于 k 的边…

mysql group by分组后查询无数据补0

mysql经常会用到Group By来进行分组查询,但也经常会遇到一个问题,就是不满足条件的数据就不会显示,如图总共有五个业务,业务状态为3的就不会显示: 因此,想要实现,即使没有数据,也想让count显示出0而不是空的效果&…

day40打卡

day40打卡 343. 整数拆分 状态表示 ​ dp[i] 表示将正整数i拆分成至少两个正整数的和之后,这些正整数的最大乘积 状态转移方程 ​ i > 2 时,对正整数i拆出的第一个正整数是j,则有: 将i拆分为 j 和 i-j,且 i-j…

CUDA编程 - Nsight system Nsight compute 的安装和使用 - (1) 学习记录

Nsight system & Nsight compute 安装和下载地址一、Nsight Systems1.1、主要应用1.2、比较常用的分析1.2.1、情况一1.2.2、情况二 二、Nsight Compute2.1、主要应用2.2、比较常用的分析2.2.1、情况一2.2.2、情况二 三、两者的比较3.1、Nsight systems3.2、Nsight compute …

Runaway Queries 管理:提升 TiDB 稳定性的智能引擎

在数字化系统扮演重要角色的今天,数据库稳定性成为企业关注的核心问题。对于重要计算机系统而言,突发的性能下降可能对业务造成不可估量的损失。为了稳定数据库性能,用户可以从管理流程入手规范变更的测试,或者利用产品手段减少预…

su模型在3d里渲染效果如何---模大狮模型网

SketchUp模型在其他3D应用程序中进行渲染可以获得非常好的效果,取决于您所选择的渲染引擎和技术水平。下面是一些常见的渲染效果和技巧: 一:光照和阴影 通过添加适当的光源和调整阴影设置,可以使SketchUp模型在渲染中呈现出更加真…

python递归算法

递归算法 一、嵌套调用的过程二、递归的基本原则1、递归的基本原则2、无限递归调用3、正常递归调用4、阶乘问题5、力扣:231. 2 的幂6、力扣面试题 08.05. 递归乘法7、力扣、326. 3 的幂8、力扣342. 4的幂 一、嵌套调用的过程 def show1():print("show 1 run s…

第2讲:C语言数据类型和变量

第2讲:C语言数据类型和变量 目录1.数据类型介绍1.1字符型1.2整型1.3浮点型1.4 布尔类型1.5 各种数据类型的长度1.5.1 sizeof 操作符1.5.2 数据类型长度1.5.3 sizeof 中表达式不计算 2.signed 和 unsigned3.数据类型的取值范围4. 变量4.1 变量的创建4.2 变量的分类 5…

Leetcode日记 2583. 二叉树中的第 K 大层和

Leetcode日记 2583. 二叉树中的第 K 大层和 题目:解题思路:代码实现制作不易,感谢三连,谢谢啦 题目: 给你一棵二叉树的根节点 root 和一个正整数 k 。 树中的 层和 是指 同一层 上节点值的总和。 返回树中第 k 大的层和…

Jenkins邮件通知配置(7)

1、安装插件: Email Extension,Email Extension Template,这两个插件可以帮助我们进行邮件的编写发送以及格式化 2、配置jenkins中链接腾讯企业邮箱 先配置发送服务,然后在具体工程中设置接收者 基础信息: POP3/S…

thinkphp5.1 phpexcel 批量导入导出

1.批量导入 public function importExcel(){$authority $this->getUserAuthority(order_input, batch_import);if ($authority[code] ! 0) {return json($authority);}$file request()->file(files);if(empty($file)){return printMsg(-1, "请上传文件");}/…

LeetCode刷题日志-200.岛屿数量

思路: 遍历二维数组,每当遇到一个‘1’进行一次dfs,根据规则,将本次dfs到的所有元素标记为‘0’(放置重复dfs,并且能dfs到的元素一定是与当前遍历到的元素属于统一岛屿。)最后,dfs的…

Sora-OpenAI 的 Text-to-Video 模型:制作逼真的 60s 视频片段

OpenAI 推出的人工智能功能曾经只存在于科幻小说中。 2022年,Openai 发布了 ChatGPT,展示了先进的语言模型如何实现自然对话。 随后,DALL-E 问世,它利用文字提示生成令人惊叹的合成图像。 现在,他们又推出了 Text-t…

【初中生讲机器学习】11. 回归算法中常用的模型评价指标有哪些?here!

创建时间:2024-02-19 最后编辑时间:2024-02-23 作者:Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏,很高兴遇见你~ 我是 Geeker_LStar,一名初三学生,热爱计算机和数学,我们一起加…

【关于python变量类型学习笔记】

python的变量类型 在创建变量时会在内存中开辟一个空间,变量是存储在内存中的值。 根据变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。 变量可以指定不同的数据类型,这些变量可以存储整数,…

Codeforces Round 927 (Div. 3) G. Moving Platforms --- 题解 (非常好的题)

目录 Codeforces Round 927 (Div. 3) G. Moving Platforms: 原题链接:Problem - G - Codeforces 题目大意: 思路解析: 代码实现: Codeforces Round 927 (Div. 3) G. Moving Platforms: 原题链接&#…

高刷电竞显示器 - HKC VG253KM

今天给大家分享一款高刷电竞显示器 - HKC VG253KM。 高刷电竞显示器 - HKC VG253KM源于雄鹰展翅翱翔的设计灵感,严格遵循黄金分割比例的蓝色点晴线条,加上雾面工艺及高低起伏错落有致的线条处理,在VG253KM的背部勾勒出宛若大鹏展翅的鹰翼图腾…

app自动化元素定位工具Weditor安装使用

之前用appium自带的appium Desktop inspector老是定位不到元素 如下 用另外工具 Weditor M1电脑 安装 pip3 install weditor 启动-自动打开端口 python3 -m weditor 输入设备名称,点击【connect】出现绿色为连接成功 获取到

vscode中git相应插件的使用(强化工作效率)

git graph 这篇文章写的不错:Git Graph 对于git graph的插件的使用: 1、首先vscode-extension中去下载 2、打开 相应的项目,然后在vscode左边底下去找到git graph标识然后打开就可以看到commit记录的可视化形式了。 能够很清晰的看到你的提…

自定义股票池策略周报告---收益1.8,回撤0.7,提供实盘设置

综合交易模型已经交易了1个月了目前收益10,回测0.8,策略追求稳稳的幸福,细水流长,回测年化20,最大回撤8 链接自定义股票池策略周报告---收益1.8,回撤0.7,提供实盘设置 (qq.com) 实盘稳定运行2…