Nginx反向代理实现负载均衡+Keepalive实现高可用

目录

实现负载均衡

实现高可用


实现负载均衡

Nginx的几种负载均衡算法:

  • 1.轮询(默认) 每个请求按照时间顺序逐一分配到下游的服务节点,如果其中某一节点故障,nginx 会自动剔除故障系统使用户使用不受影响。

  • 2.权重(weight) 在配置文件中对下游的服务节点指定权重值 weight, weight 值越大则被分配的评率越高,一般这种负载均衡,用于节点的配置情况不一样,有的可能配置高,有的配置低。

  • 3.ip_hash 对每个请求,针对 ip 进行 hash, 然后分配到后台节点,这样一来,同一 ip 会被固定分配到下游固定服务上。它能够暂时的解决集群环境中容器之间 session 共享的问题(因为session每次只能和一个人,一对一的记录,但是如果现在需要负载均衡就出现了一种一对多的情况,可以使用ip_hash实现一对一),但是不是解决的根本之道,只是权宜之策,我们试想,如果访问的好好的,家里的路由器被重启了,或者运营商分配给你的 ip 地址改变了,那么你再次访问的时候,新的 ip 就可能被分配到新的服务上,之前的 session 也就失效了。

  • 4.least_conn (最少连接调度算法) 最少连接调度算法,对下游服务中连接情况,优先选择连接数最少的服务分配。

  • 5.least_time (最小响应时间) 最小响应时间, 计算节点平均响应时间,然后取响应最快的那个,分配更高权重。

(1)首先我们一共需要三个主机

后端的两个主机用于apache服务:

window10:192.168.159.165

kail:192.168.159.151

负载均衡设备nginx:

centos1:192.168.159.200

(2)配置window10

开启apache服务

新建一个网页并且编辑内容:

新建的网页:www/index.html
内容:
Hello My Ip add 192.168.159.165

访问结果

(2)配置kail

开启apache服务

新建一个网页并且编辑内容:

网页地址:/var/html/index.html
网页内容:
Hello My Ip add 192.168.159.165

访问结果

(3)nginx设备配置

进入 /etc/nginx/nginx.conf

vim /etc/nginx/nginx.conf

配置负载均衡:

upstream nginx_boot{
# 30s内检查心跳发送两次包,未回复就代表该机器宕机,请求分发权重比为1:2   
server 192.168.159.151 weight=100 max_fails=2 fail_timeout=30s;
server 192.168.159.165 weight=100 max_fails=2 fail_timeout=30s;
# 这里的IP请配置成你WEB服务所在的机器IP
}
server {
        location / {
                root   html;        # 配置一下index的地址,最后加上index.ftl。        
                index  index.html index.htm index.jsp index.ftl;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 请求交给名为nginx_boot的upstream上        
                proxy_pass http://nginx_boot;

}
        location ~ .*.(gif|jpg|jpeg|bmp|png|ico|txt|js|css){
        root   /usr/local/nginx/html/static;
        expires 7d;}
}

现在可以尝试访问:

第一次:

第二次:

不断地尝试可以发现:始终是访问一次165然后再一次151,成功的实现了负载均衡!!!,并且权重和我们设置的也是一样的,当然也可以手动的修改权重

也可以将负载均衡的方式修改为轮询或者上面介绍的其他方式。

实现高可用

线上如果采用单个节点的方式部署Nginx,难免会出现天灾人祸,比如系统异常、程序宕机、服务器断电、机房爆炸、地球毁灭….哈哈哈,夸张了。但实际生产环境中确实存在隐患问题,由于Nginx作为整个系统的网关层接入外部流量,所以一旦Nginx宕机,最终就会导致整个系统不可用,这无疑对于用户的体验感是极差的,因此也得保障Nginx高可用的特性。

接下来则会通过keepalived的VIP机制,实现Nginx的高可用。 VIP并不是只会员的意思,而是指Virtual IP,即虚拟IP。

keepalived在之前单体架构开发时,是一个用的较为频繁的高可用技术,比如MySQL、Redis、MQ、Proxy、Tomcat等各处都会通过keepalived提供的VIP机制,实现单节点应用的高可用。

上面那个实验完成了,但是现在实现了负载均衡但是并没有实现高可用问题

需要实现高可用,那就需要增加一台nginx服务器

这里使用192.168.159.201当做另外一台nginx服务器

实现原理:(类似于VRRP)

  1. 需要在200和201这两台设备上都安装keepalive+nginx的环境

  2. keepLive虚拟出一个VIP

  3. 浏览器通过访问这个VIP来实现高可用

这里以192.168.159.200这台设备为了,下面是具体的过程:

(1)首先配置keepalive

//获取软件包
wget https://www.keepalived.org/software/keepalived-2.2.4.tar.gz
//解压
tar -zxvf keepalived-2.2.4.tar.gz
//进入该目录中后进行预编译
./configure
//编译
make/make install

(2)添加配置文件

vi keepalived.conf

bal_defs {  
    # 自带的邮件提醒服务,建议用独立的监控或第三方SMTP,也可选择配置邮件发送。
    notification_email {  
        root@localhost  
    }  
    notification_email_from root@localhost  
    smtp_server localhost  
    smtp_connect_timeout 30  
    # 高可用集群主机身份标识(集群中主机身份标识名称不能重复,建议配置成本机IP)  
 router_id 192.168.159.200
}  
  
# 定时运行的脚本文件配置  
vrrp_script check_nginx_pid_restart {  
    # 之前编写的nginx重启脚本的所在位置  
    script "/soft/scripts/keepalived/check_nginx_pid_restart.sh"   
    # 每间隔3秒执行一次  
    interval 3  
    # 如果脚本中的条件成立,重启一次则权重-20  
    weight -20  
}  
  
# 定义虚拟路由,VI_1为虚拟路由的标示符(可自定义名称)  
vrrp_instance VI_1 {  
    # 当前节点的身份标识:用来决定主从(MASTER为主机,BACKUP为从机)  
 state MASTER  
    # 绑定虚拟IP的网络接口,根据自己的机器的网卡配置  
 interface ens33   
    # 虚拟路由的ID号,主从两个节点设置必须一样  
 virtual_router_id 250 
    # 填写本机IP  
 mcast_src_ip 192.168.159.200  
    # 节点权重优先级,主节点要比从节点优先级高  
 priority 100  
    # 优先级高的设置nopreempt,解决异常恢复后再次抢占造成的脑裂问题  
 nopreempt  
    # 组播信息发送间隔,两个节点设置必须一样,默认1s(类似于心跳检测)  
 advert_int 1  
    authentication {  
        auth_type PASS  
        auth_pass 1111  
    }  
    # 将track_script块加入instance配置块  
    track_script {  
        # 执行Nginx监控的脚本  
  check_nginx_pid_restart  
    }  
  
    virtual_ipaddress {  
        # 虚拟IP(VIP),也可扩展,可配置多个。
  192.168.159.250  
    }  
}

(7)编写脚本

vim check_nginx_pid_restart.sh

//脚本内容:
#!/bin/sh  
# 通过ps指令查询后台的nginx进程数,并将其保存在变量nginx_number中  
nginx_number=`ps -C nginx --no-header | wc -l`  
# 判断后台是否还有Nginx进程在运行  
if [ $nginx_number -eq 0 ];then  
    # 如果后台查询不到`Nginx`进程存在,则执行重启指令  
    /soft/nginx/sbin/nginx -c /soft/nginx/conf/nginx.conf  
    # 重启后等待1s后,再次查询后台进程数  
    sleep 1  
    # 如果重启后依旧无法查询到nginx进程  
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then  
        # 将keepalived主机下线,将虚拟IP漂移给从机,从机上线接管Nginx服务  
        systemctl stop keepalived.service  
    fi  
fi

(8)为该脚本授权

chmod +x check_nginx_pid_restart.sh

(9)将一些文件拷贝到/etc下

mkdir /etc/keepalived
cp keepalived.conf /etc/keepalived/
cd /root/keepalived/keepalived/etc/init.d
cp keepalived /etc/init.d/
cd ../sysconfig
cp keepalived /etc/sysconfig/

(10)修改配置文件

vim /etc/keepalived/keeplive.conf
//修改后:
bal_defs {  
    # 自带的邮件提醒服务,建议用独立的监控或第三方SMTP,也可选择配置邮件发送。
    notification_email {  
        root@localhost  
    }  
    notification_email_from root@localhost  
    smtp_server localhost  
    smtp_connect_timeout 30  
    # 高可用集群主机身份标识(集群中主机身份标识名称不能重复,建议配置成本机IP)  
 router_id 192.168.159.200
}  
  
# 定时运行的脚本文件配置  
vrrp_script check_nginx_pid_restart {  
    # 之前编写的nginx重启脚本的所在位置  
    script "/root//keepalived/keepalived/etc/keepalived/check_nginx_pid_restart.sh"   
    # 每间隔3秒执行一次  
    interval 3  
    # 如果脚本中的条件成立,重启一次则权重-20  
    weight -20  
}  
  
# 定义虚拟路由,VI_1为虚拟路由的标示符(可自定义名称)  
vrrp_instance VI_1 {  
    # 当前节点的身份标识:用来决定主从(MASTER为主机,BACKUP为从机)  
 state MASTER  
    # 绑定虚拟IP的网络接口,根据自己的机器的网卡配置  
 interface ens33   
    # 虚拟路由的ID号,主从两个节点设置必须一样  
 virtual_router_id 250 
    # 填写本机IP  
 mcast_src_ip 192.168.159.200  
    # 节点权重优先级,主节点要比从节点优先级高  
 priority 100  
    # 优先级高的设置nopreempt,解决异常恢复后再次抢占造成的脑裂问题  
 nopreempt  
    # 组播信息发送间隔,两个节点设置必须一样,默认1s(类似于心跳检测)  
 advert_int 1  
    authentication {  
        auth_type PASS  
        auth_pass 1111  
    }  
    # 将track_script块加入instance配置块  
    track_script {  
        # 执行Nginx监控的脚本  
  check_nginx_pid_restart  
    }  
  
    virtual_ipaddress {  
        # 虚拟IP(VIP),也可扩展,可配置多个。
  192.168.159.250  
    }  
}

(11)设置开机自启

[root@centos111 keepalived]# chkconfig keepalived on
[root@centos111 keepalived]# systemctl daemon-reload
[root@centos111 keepalived]# systemctl start keepalived.service 
[root@centos111 keepalived]# systemctl enable keepalived.service 

(12)备服务器配置(201)--大致流程与200相同

这里就不详细演示了

注:从上图中可以明显看见虚拟IP已经成功挂载,但另外一台机器192.168.12.250并不会挂载这个虚拟IP,只有当主机下线后,作为从机的192.168.12.130才会上线,接替VIP。

(13)测试

使用kail (192.168.159.151) ping 虚拟ip(192.168.159.250)、

可以看到成功的ping通了

现在尝试关闭192.168.159.200服务器

nmcli con down ens33

然后再打开该服务器

nmcli con up ens33

查看192.168.159.201服务器

可以发现192.168.159.250这个虚拟ip已经转到备服务器(192.168.159.201)这里了!

到此Nginx的负载均衡和高可用实验都全部完成!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络层协议-IP协议

目录 基本概念IP协议格式分片与组装分片组装 网段划分特殊的IP地址IP地址的数量限制私有IP地址和公网IP地址路由 基本概念 TCP作为传输层控制协议,其保证的是数据传输的可靠性和传输效率,但TCP提供的仅仅是数据传输的策略,而真正负责数据在网…

Docker可视化管理界面工具Portainer安装

Portainer是Docker容器管理界面工具,可以直观的管理Docker。 部署也很简单: 官方安装文档地址 1、创建数据卷 docker volume create portainer_data2、下载允许容器 docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restartalways -v /v…

UE5 UI教程学习笔记

参考资料:https://item.taobao.com/item.htm?spma21n57.1.0.0.2b4f523cAV5i43&id716635137219&ns1&abbucket15#detail 基础工程:https://download.csdn.net/download/qq_17523181/88559312 1. 介绍 工程素材 2. 创建Widget UE5 UI系统的…

141.【Git版本控制】

Git-深入挖掘 (一)、Git分布式版本控制工具1.目标2.概述(1).开发中的实际常见(2).版本控制器的方式(3).SVN (集中版本控制器)(4).Git (分布版本控制器)(5).Git工作流程图 (二)、Git安装与常用命令1.Git环境配置(1).安装Git的操作(2).Git的配置操作(3).为常用的指令配置别名 (可…

为什么vue中数组和对象的props默认值要写成函数形式?

多个组件数据不相互干涉 假如在一个地方引用了同一个组件,并给他们都绑定了单独的值。如果只声明为一个对象或数组,可能会导致在某一个实例中修改数据,影响到其他实例中的数据,因为数组和对象是引用类型的数据。为了在多次引用组件…

智慧海岛/海域方案:助力海洋空间智慧化、可视化管理

随着我国海洋经济的快速发展,海域海岛的安防技术也获得了进步。传统的安防监控模式已经满足不了海域海岛的远程监管需求。伴随着人工智能、边缘计算、大数据、通信传输技术、视频技术、物联网等信息化技术的发展,海岛海域在监管手段上,也迎来…

linux删除oracle数据库:如何在Linux系统中删除Oracle数据库

停止Oracle数据库服务:# su - oracle 1. 停止Oracle数据库服务: # su - oracle $ sqlplus / as sysdba SQL> SHUTDOWN IMMEDIATE; 2. 删除oracle安装目录: # rm -rf /u01/app/oracle 3. 删除oracle用户和组: # userdel…

AcWing第130周周赛

给定一个长度为 n 的整数数组 a0,a1,…,an−1。 函数 sum(l,r)定义如下&#xff1a; 如果 lr&#xff0c;则 sum(l,r)0。如果 l<r&#xff0c;则 sum(l,r)。 请你找到一个整数三元组 (x,y,z)&#xff0c;要求&#xff1a; 0≤x≤y≤z≤nsum(0,x)−sum(x,y)sum(y,z)−sum…

「Verilog学习笔记」 输入序列不连续的序列检测

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 题目要求检测a的序列&#xff0c;a为单bit输入&#xff0c;每个时刻可能具有不同的值&#xff0c;且并不是每一个数据都是有效的&#xff0c;需要根据data_valid信号进行判…

VM CentOS7安装ffmpeg

项目中涉及给视频添加水印&#xff0c;使用到了ffmpeg&#xff0c;windows系统可直接使用&#xff0c;Linux需要手动编译完成ffmpeg后才可正常使用。 配置yum源: 备份原repo文件 cd /etc/yum.repos.d/mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.r…

视频网关简介

在数字化时代&#xff0c;视频通信已经成为了人们日常生活和工作中的重要部分。为了满足不同设备和平台之间的视频通信需求&#xff0c;各种视频协议应运而生。然而&#xff0c;这些协议之间的差异使得相互通信变得复杂。因此&#xff0c;视频网关作为一种重要的网络设备&#…

什么是软件需求?以及需求的最佳实践?

什么是软件需求 业务需求是反应企业组织对软件系统的高层次目标要求&#xff0c;换句话说就是软件系统的建设目标&#xff0c;常常体现在这两个方面&#xff1a;问题和机会。 要记住&#xff1a;出发点不同&#xff0c;精神面貌就完全不一样&#xff0c;当然如果目标过于夸大也…

嵌入式开发从入门到入土

写在前面的话 嵌入式开发涉及的层面很广&#xff0c;它既有底层硬件的开发&#xff0c;又涉及上层应用的开发&#xff0c;也就是所谓的系统集成的硬件和软件。而C语言不仅具有汇编语言操作底层的优势&#xff0c;又具有高级开发语言的功能性强的特点&#xff0c;当之无愧地成为…

cefsharp119.4.30(cef119.4.3Chromium119.0.6045.159)版本升级体验支持x86_h264及其他多个h264版本

Cefsharp119.4.30,cef119.4.3,Chromium119.0.6045.159 此更新包括一个高优先级安全更新 This update includes a high priority security update. 说明:此版本119.4.3支持x86_H264视频播放(需要联系我),其他版本。.NETFramework 4.6.2 NuGet Gallery | CefSharp.WinForms …

接口自动化测试难点:数据库验证解决方案!

接口自动化中的数据库验证&#xff1a;确保数据的一致性和准确性 接口自动化测试是现代软件开发中不可或缺的一环&#xff0c;而数据库验证则是确保接口返回数据与数据库中的数据一致性的重要步骤。本文将介绍接口自动化中的数据库验证的原理、步骤以及示例代码&#xff0c;帮…

数据结构与算法编程题16

已知长度为n的线性表A&#xff0c;请写一时间复杂度为O(n)、空间复杂度为O(1)的算法&#xff0c;该算法删除线性表中所有值为item的数据元素。 item 3 数组下标 i 0 1 2 3 4 5 6 7 8 顺序表&#xff1a; 1 2 3 4 3 3 5 3 7 #include <iostream> using namespace std;typ…

hive return code 40000 from org.apache.hadoop.hive.ql.exec.MoveTask解决思路

参考学习 https://github.com/apache/hive/blob/2b57dd27ad61e552f93817ac69313066af6562d9/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java#L47 为啥学习error code 开发过程中遇到以下错误&#xff0c;大家觉得应该怎么办&#xff1f;从哪方面入手呢&#xff1f; 1.百…

在Linux上搭建JavaWeb项目运行环境

文章目录 安装JDK安装Tomcat安装数据库 安装JDK 安装Oracle官方的JDK比较麻烦&#xff0c;我们在此处选择安装开源社区维护的openjdk。他们俩的差别不大且兼容。 安装Tomcat 我们把本地下载好的 tomcat.zip 包拖到Linux页面上&#xff0c;让Linux也有一个zip包&#xff0c;再…

建设数字工厂管理系统对企业来说有哪些优势

随着科技的飞速发展&#xff0c;数字化转型已成为企业持续发展的必由之路。在这一背景下&#xff0c;建设数字工厂管理系统显得尤为重要。本文将详细分析数字工厂管理系统给企业带来的优势&#xff0c;以及企业如何选择合适的管理系统和成功实施数字化转型。 一、数字工厂管理系…