5_企业架构LNMP高可用负载均衡服务器

news2025/2/28 2:52:44

企业架构LNMP高可用负载均衡服务器之Nginx

学习目标和内容

1、能够描述负载均衡的作用

2、能够了解负载均衡常见实现方式

3、能够使用Nginx实现负载均衡

4、能够描述Nginx的常见负载均衡算法

一、背景描述及其方案设计

1、业务背景描述

时间:2011.6.-2013.9

发布产品类型:互联网动态站点 商城

⽤户数量: 4000-8000(用户量猛增)

PV : 16000-100000(24⼩时访问次数总和)

QPS: 50-100*(每秒访问次数)

DAU: 400-800(每日活跃用户数)

随着业务量骤增,之前单点服务器,已经不能够满足业务使用需要。如果主服务器宕机,备服务器提供服务,因为流量太大,备也宕机。需要多台服务器,同时提供服务。

2、模拟运维设计方案

以上架构服务器,已经不能够满足以上提到的业务需求。架构发生如下变化

二、服务器基本环境部署

1、克隆复制虚拟机

server01 web1 192.168.17.102

server02 mysql 192.168.17.100

server03 web2 192.168.17.101

server04 lb load balance 192.168.17.103

2、基础环境配置

网卡IP、主机名称、hosts解析

三、负载均衡服务器搭建

1、引入负载均衡技术

负载均衡技术 (load blance) 是一种概念 把资源的使用进行平均分配。

负载均衡:分发流量、请求到不同的服务器。使流量平均分配(理想的状态的)

作用:

服务器容灾 流量分发

主要作用:

①流量分发 请求平均 降低单例压力

其他作用:

②安全 隐藏后端真实服务

③屏蔽非法请求(七层负载均衡)

2、负载均衡分类

1)二层负载均衡(mac)

根据OSI模型分的二层进行负载,一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后,再分配后端实际的MAC地址响应

2)三层负载均衡(ip)

一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后,再分配后端实际的IP地址响应

3)四层负载均衡(tcp) 网络运输层面的负载均衡

在三层负载均衡的基础上,用ip+port接收请求,再转发到对应的机器

4)七层负载均衡(http) 智能型负载均衡

根据虚拟的url或IP,主机接收请求,再转向(反向代理)相应的处理服务器

3、常见实现方式

实现方式分类:

①软件级别 性价比高 可控性强

②硬件级别 性能好 价格高 几万到几十万不等

硬件是实现方式:

F5 BIG-IP 四层和七层

软件实现方式:

OSI分层实现方式
七层Nginx、HAProxy
四层LVS、HAProxy、Nginx(1.9版本后)

四层和七层对比:

4、Nginx负载均衡配置

官方文档:Module ngx_http_upstream_module

架构分析:

①用户访问请求Nginx负载均衡服务器

②Nginx负载均衡服务器再分发请求到web服务器

实际配置负载均衡,只需修改作为负载均衡服务器的Nginx即可。当前架构中的server04

①在客户端解析域名到负载均衡服务器

②在负载均衡的Nginx配置

#注意本次架构中  server04的Nginx服务器是负载均衡服务器
shell > cd /usr/local/nginx/conf/nginx.conf

配置文件示例

#在http段进行配置
#分发请求到后端服务器
upstream shop {
    #web1 server01
    server 192.168.17.102;
    #web2 server02
    server 192.168.17.101;
}
#修改之前的shop的server段配置
server {
    listen 80;
    server_name www.shop.com;
    location / {
        #代理转发到shop段  匹配到上面的upstream
        proxy_pass http://shop;
        #以下两条配置,实质是设置了传输的header头信息  
        #传输域名给后端服务器  进行识别  方便匹配对应server虚拟主机
        proxy_set_header Host $host;
        #发送客户端IP  给后端服务器  用来方便后端服务器识别用户真实IP
        proxy_set_header X-Real-IP $remote_addr;
    }
}

③重载负载均衡服务器Nginx配置测试查看效果

可以停掉其中一台web服务器进行测试

5、查看确认负载均衡

如何确认服务器是否实现了负载均衡?

①在不同的web服务器同路由访问的文件中,写入不同的信息,以示区别。

②通过查看后端web服务器的访问日志进行确定

==方法一:在不同服务器写入不同信息==

①分别修改web服务器的信息

shell > vim /usr/local/nginx/html/tp5shop/application/home/controller/Base.php

写入一个动态参数,根据php语法自动调用当前主机名称

②访问查看负载均衡效果

方法二:查看后端web服务器的访问日志

shell > cat /usr/local/nginx/logs/access.log

##6、负载均衡后获取客户端IP

负载均衡之后,在后端的web服务器获取到的是负载均衡服务器的IP,而不能够获取到客户端的真实IP。

需要进行以下特殊配置:

①首先在负载均衡服务器中配置,转发客户端IP给后端web服务器

②后端web服务器需要配置,识别从负载均衡服务器传输过来的客户端真实IP

官方网址:Module ngx_http_realip_module

使用ngx_http_realip_module模块提供的set_real_ip_from语法,默认此模块没有安装,需要编译时添加编译参数

web服务器上配置set_real_ip_from 代表从哪儿来源的IP,需要识别真实客户端IP

示例配置:

#此配置在web服务器上的nginx
#可配置到http、server、location中,推荐配置到server中
#配置需要识别的IP来源   负载均衡的IP
set_real_ip_from  192.168.17.103

##7、upstream中server的关键字

upstream中的分发之后的几个关键字:

backup 备 其他的没有backup标识的都无响应,才分发到backup

down 此条配置,不会被分发到

upstream shop {
    server 192.168.17.102 down;
    server 192.168.17.101 backup;
}

##8、session一致性问题

访问管理后端页面,登录发现验证码不通过

分析原因:

①比如分发到web1服务器,生成验证码,存储到session中,默认在服务器本地

②再次校验的时候,请求分发到web2服务器了,所有验证码一直校验不通过

解决方案思路:

①生成和验证session都请求同一台服务器

②共享session nfs mysql ==内存缓存软件(memcached、redis)==

9、Nginx的负载均衡算法

Nginx 官方默认3种负载均衡的算法

①==Round-Robin RR轮询(默认)== 一次一个的来(理论上的,实际实验可能会有间隔)

②==weight 权重== 权重高多分发一些 服务器硬件更好的设置权重更高一些

③==ip_hash== 同一个IP,所有的访问都分发到同一个web服务器

Tip:

第三方模块实现的调度算法 需要编译安装第三方模块

④fair 根据后端服务器的繁忙程度 将请求发到非繁忙的后端服务器

⑤url_hash 如果客户端访问的url是同一个,将转发到同一台后端服务器

验证一:验证加权轮询算法

示例配置:

upstream shop {
    #web1 server01
    server 192.168.17.102 weight=5;
    #web2 server02
    server 192.168.17.101 weight=3;
}

server01 web 1 1 1 1 1 1

server03 web 2 1 1 1

8次中,server01分发5次,server03分发3次

验证二:ip一致性算法

示例配置:

upstream shop {
    #ip hash 一致性算法配置  设置此项  weight就失效了
    ip_hash;
    #web1 server01
    server 192.168.17.102 weight=5;
    #web2 server02
    server 192.168.17.101 weight=3;
}

10、实现负载均衡高可用

所有的请求流量,都要经过负载均衡服务器,负载均衡服务器压力很大,防止它宕机,导致后端服务所有都不可用,需要对负载均衡服务器,做高可用

给负载均衡服务器server04做一台备用服务器server05,通过keepalived实现高可用。

通过keepalived实现VIP在负载均衡服务器组的切换。

server04 master LB 192.168.17.103

server05 backup LB 192.168.17.50

主负载均衡的keepalived配置

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    #虚拟路由ID 新ID 不要之前的冲突
    virtual_router_id 52
    priority 100
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        #添加新VIP
        192.168.17.201
    }
    track_script {
        check_nginx
    }
}

备负载均衡的keepalived配置

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    #修改route_id
    virtual_router_id 52
    priority 99
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #unicast_src_ip 192.168.17.101
    #unicast_peer {
    #    192.168.17.102
    #}
    virtual_ipaddress {
        #新VIP
        192.168.17.201
    }
    track_script {
        check_nginx
    }
}
​

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

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

相关文章

谈一谈内存对齐

文章目录 一,什么是内存对齐?二,为什么要有内存对齐?三,内存对齐规则? 一,什么是内存对齐? 现代计算机中的内存空间都是按字节划分的,理论上似乎我们对任何类型变量的访…

【iOS控件】—— UIPickerView的使用

【iOS控件】—— UIPickerView的使用 一. 简述UIPickerView1. 什么是UIPickerView2. UIPickerView遵守的协议 二. 测试Demo三. 总结 一. 简述UIPickerView 先看一下UIPickerView的效果图: 1. 什么是UIPickerView UIPickerView是iOS平台上的一个用户界面元素&am…

力扣 --- 最长公共前缀

题目描述: 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入:strs ["flower","flow","flight"] 输出:"fl"…

Windows安装MySQL8.2

Windows安装MySQL8.2 三种安装模式 默认自定义完整 本案例选择自定义 选择安装目录 勾选 Run MySQL Configurator 配置MYSQL 默认为开发者模式 在 Config Type 下拉列表中选择数据中心 设置 root 账号密码

【算法】前后缀分解题单⭐

文章目录 题单来源题目列表42. 接雨水238. 除自身以外数组的乘积2256. 最小平均差2483. 商店的最少代价代码1——前后缀数组代码2—— O ( 1 ) O(1) O(1)空间🐂 2420. 找到所有好下标2167. 移除所有载有违禁货物车厢所需的最少时间代码1——前后缀分解代码2——简洁…

题目:神奇的进制

解题思路: 用电脑自带的计算器,切换到程序员模式。里面有进制转换功能。 由题目,要求严格递增且都为字母,还要大于2023,则数字16进制为ABC。

wvp gb28181 pro 平台国标级连功能说明

国标28181不同平台之间支持两种连接方式,平级和上下级,WVP目前支持向上级级联。 测试环境 测试平台上级:192.168.10.209(Alam centos8) 测试平台下级:192.168.10.206(ky10_x86) 下级…

安装错误_ImportError: cannot import name ‘XXX‘循环引用 绕晕TT(deepsolo)

这里写目录标题 error: Couldnt find a setup script in /tmp/easy_install-lfpvj6p4/scikit_image-0.22.0.tar.gzpip install -v -e . 和 python setup.py develop功能一样吗AttributeError: module ‘PIL.Image’ has no attribute ‘LINEAR’ImportError: cannot import nam…

计算机网络 | 物理层下 传输媒介、信道复用技术,带宽接入技术

文章目录 3. 物理层下面的传输媒介3.1 导引型传输媒介3.2 非导引型传输媒介 4 信道复用技术5 数字传输系统5.1 旧的数字系统5.2 新数字系统 6 带宽接入技术6.1 DSL(数字用户线)6.2HFC 光纤同轴混合网6.2.1 接入 6.3 FTTx技术 3. 物理层下面的传输媒介 传…

Pandas进阶:拼接 concat 使用方法

1.处理索引和轴 假设我们有2个关于考试成绩的数据集。 df1 pd.DataFrame({ name:[A,B,C,D],math:[60,89,82,70],physics:[66, 95,83,66],chemi…

探究两个互联网时代的差异,Web 2.0 与 Web 3.0 区别

Web 2.0 的特征 首先我们来了解一下 Web 2.0 的特征都有哪些。 用户生成内容:Web 2.0 时代以用户生成内容为特征,用户可以轻松地在网络上分享、创建和编辑信息。社交媒体平台、博客等网站的兴起使得用户成为信息的创造者,网络逐渐从被动浏览…

04-数据库操作对象Statement对象和PreparedStatement对象的区别,SQL注入的优缺点

Statement对象和查询结果集 Statement对象相关的方法 Connection接口中获取数据库操作对象Statement对象的方法 方法名功能Statement createStatement()创建Statement对象 Statement对象执行增删改查的SQL语句(不含占位符"?")的方法,JDBC中的SQL语句不需要提供分…

【开源】基于JAVA的医院门诊预约挂号系统

项目编号: S 033 ,文末获取源码。 \color{red}{项目编号:S033,文末获取源码。} 项目编号:S033,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2…

【RotorS仿真系列】Ardrone模型介绍

ardrone是rotors仿真框架提供的一款机型,因为该机型与我们实际使用的机型参数相近,所以这里对它的参数做特别整理和记录。 一、模型参数总结 ardrone的gazebo模型如下图所示: 根据ardrone.yaml,其关键参数如下所示&#xff1a…

Python基础快速过一遍

文章目录 一、变量及基本概念1、变量2、变量类型3、变量格式化输出4、type()函数5、input()函数6、类型转换函数7、注释 二、Python运算/字符1、算数运算2、比较运算3、逻辑运算4、赋值运算符5、转义字符6、成员运算符 三、判断/循环语句1、if判断语句2、while循环语句3、for循…

51单片机应用从零开始(九)·数组

目录 1. 用字符型数组控制 P0 口 8 位 LED 流水点亮 2. 用 P0 口显示字符串常量 1. 用字符型数组控制 P0 口 8 位 LED 流水点亮 C语言中的字符型数组是一种数据类型,它是一个由字符组成的序列,以空字符\0结尾。在声明字符型数组时,需要指…

总结react中css的使用

1、css in js css in js有很多库,这里介绍styled-components styled-components 下载【vscode可以安装vscode-styled-components 插件,有代码提示】 npm i styled-components 1、然后为某个组件新建style.js文件,然后写一些样式。 impo…

SpringAMQP入门案例——发送消息

依赖 <!--SpringAMQP起步依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> yml配置文件 自行修改 spring:rabbitmq:host: 192.168.220.130 # …

【力扣】——可获得的最大点数(滑动窗口)

几张卡牌 排成一行&#xff0c;每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动&#xff0c;你可以从行的开头或者末尾拿一张卡牌&#xff0c;最终你必须正好拿 k 张卡牌。 你的点数就是你拿到手中的所有卡牌的点数之和。 给你一个整数数组 cardPoi…

「C++」C++11新特性

&#x1f4bb;文章目录 &#x1f4c4;前言右值引用概念右值引用的意义 lambada表达式包装器function包装器bind包装器 &#x1f4d3;总结 &#x1f4c4;前言 C标准10年磨一剑&#xff0c;于2011年迎来了它真正意义上的第二个标准&#xff0c;C11能更好地适用与系统开发和库开发…