负载均衡
概述
1、纵向扩展:单机,通过增加系统的硬件处理能力,提升服务器的处理能力
2、横向扩展:集群,通过添加机器,满足大型网站服务的处理能力
(1)应用集群:将同一应用部署到多台机器上,组成处理集群,接收负载均衡设备分发的请求,进行处理并返回响应的数据
(2)负载均衡器:将用户访问的请求,根据对应的负载均衡算法,分发到集群中的一台服务器进行处理
3、作用
(1)解决服务器的高并发压力,提高应用程序的处理性能
(2)提供故障转移,实现高可用
(3)通过添加或减少服务器数量,增强网站的可扩展性
(4)在负载均衡器上进行过滤,可以提高系统的安全性
4、常用处理方式
(1)用户手动选择
(2)DNS 轮询
(3)四 / 七层负载均衡
DNS 轮询
1、域名系统(服务)协议(DNS)是一种分布式网络目录服务,主要用于域名与 IP 地址的相互转换
2、大多域名注册商都支持对同一个主机名添加多条记录,DNS 服务器将解析请求按照记录的顺序,随机分配到不同 IP 上
3、可靠性低
(1)一个域名 DNS 轮询多台服务器,如果其中一台服务器发生故障,那么所有的访问该服务器的请求,将不会有所回应
(2)即使将该服务器的 IP 从 DNS 中去掉,但因为各大宽带接入商将众多 DNS 存放在缓存中,以节省访问时间,导致 DNS 不会实时更新
4、负载均衡不均衡
(1)采用简单轮询负载算法
(2)不能区分服务器差异,不能反映服务器的当前运行状态,不能为性能好的服务器多分配请求
(3)本地计算机也会缓存已经解析的域名到 IP 地址的映射,也会导致使用该 DNS 服务器的用户,在一定时间内,访问的是同一台 Web 服务器,从而引发 Web 服务器减的负载不均衡
OSI
1、Open System Interconnection:开放式系统互联模型
2、国际标准化组织 ISO 指定的一个网络体系结构,该模型将网络通信的工作分为七层
(1)应用层:为应用程序提供网络服务
(2)表示层:对数据进行格式化、编码、加密、压缩等操作
(3)会话层:建立、维护、管理会话连接
(4)传输层:建立、维护、管理端到端的连接,常见 TCP / UDP
(5)网络层:IP 寻址、路由选择
(6)数据链路层:控制网络层与物理层之间的通信
(7)物理层:比特流传输
3、四层负载均衡
(1)传输层
(2)基于 IP + PORT 负载均衡
(3)硬件实现:F5 BIG-IP、Radware 等
(4)软件实现:LVS、Nginx、Hayproxy 等
4、七层负载均衡
(1)应用层
(2)基于虚拟 URL 或主机 IP 负载均衡
(3)软件实现:Nginx、Hayproxy 等
5、区别
(1)四层负载均衡数据包,在底层就进行分发;七层负载均衡数据包,在最顶端进行分发;四层负载均衡的效率比七层负载均衡高
(2)四层负载均衡不识别域名;七层负载均衡识别域名
6、二层负载均衡
(1)数据链路层
(2)基于 mac 地址
7、三层负载均衡
(1)网络层
(2)基于虚拟 IP 地址
8、实际环境采用模式:四层负载(LVS)+ 七层负载(Nginx)
LVS
1、Linux Virtual Server
2、名词概念
(1)loadbalance:Load Balancer,负载均衡器,运行 LVS 负责负载均衡的服务器
(2)DS:Director Server,前端负载均衡器节点,即运行 LVS 的服务器
(3)RS:Real Server,后端真实的工作服务器
(4)VIP:Virtual Server IP,向外部直接面向用户请求,作为用户请求的目标的IP地址,一般是 DS 的外部 IP 地址
(5)DIP:Director Server IP,主要用于和内部主机通讯的 IP 地址,一般是 DS 的内部 IP 地址
(6)RIP:Real Server IP,后端服务器的 IP 地址
(7)CIP:Client IP,访问客户端的 IP 地址
3、NAT 模式(网络地址转换模式)
(1)原理:把客户端所发送的数据包的 IP 头的目的地址,在 DS 上换成其中一个 RIP,发送到此 RS 并处理,RS 处理完成后,把数据交给经过 DS,DS 再把数据包的原 IP 地址改为 VIP,将目的地址改为 CIP 即可
(2)优点:集群中的物理服务器可以使用任何支持 TCP/IP 操作系统,它只需要一个 IP 地址配置在调度器上,服务器组可以用私有的 IP 地址
(3)缺点:扩展性有限,当服务器节点(普通 PC 服务器)增长过多时,DS 将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器,当服务器节点过多时,大量的数据包都交汇在 DS,速度就会变慢
4、IP 隧道模式(IP Tunneling)
(1)原理:各集群节点可以跨越不同的网络,不用在同一个 VLAN,DS 根据各个 RS 负载情况,动态地选择一台 RS,将请求报文封装在另一个 IP 报文中,再将封装后的 IP 报文转发给选出的 RS,RS 收到报文后,先将报文解封,获得原来目标地址为 VIP 的报文,RS发现 VIP 被配置在本地的 IP 隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给客户
(2)注意,由于 RS 需要对 DS 发过来的数据包进行还原,所以,在 RS 内核中,必须编译支持 IPTUNNEL
(3)优点:DS 只负责将请求包分发给 RS,而 RS 将应答包直接发给用户,减少 DS 大量数据流动,DS 不再是系统的瓶颈,能处理巨大的请求量,一台 DS 能够为很多 RS 进行分发,而且跑在公网上就能进行不同地域的分发
(4)缺点:RS 节点需要合法 IP,需要所有的服务器支持 IP Tunneling(IP Encapsulation)协议,服务器可能只局限在部分 Linux 系统上
5、直接路由模式(Direct Routing)
(1)原理:DS 和 RS 都使用同一个 IP 对外服务,但只有 DR 对 ARP 请求进行响应,所有 RS 对本身这个 IP 的 ARP 请求保持静默,,即网关会把对这个服务 IP 的请求全部定向给 DR,而 DR 收到数据包后,根据调度算法,找出对应 RS,把目的 MAC 地址改为 RS 的 MAC(因为 IP 一致),并将请求分发给这台 RS,这时 RS 收到这个数据包,处理完成之后,由于 IP 一致,可以直接将数据返给客户,则等价于直接从客户端收到这个数据包,处理后直接返回给客户端,由于 DS 要对二层包头进行改换,所以 DS 和 RS 之间必须在一个广播域,简单理解为在同一台交换机上
(2)优点:VS/DR 跟 VS/TUN 方法相同,负载调度器中只负责调度请求,而服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量
(3)缺点:要求 DS 的网卡必须与物理网卡在一个物理段上
七层负载均衡
1、Nginx 实现七层负载均衡,需要使用 proxy_pass 代理模块配置
(1)默认安装 ngx_http_proxy_module、ngx_http_upstream_module 模块
(2)负载均衡器(代理服务器)使用 proxy_pass,转发请求到被代理服务器地址(即 upstream 名称)
2、Nginx 负载均衡是在 Nginx 反向代理基础上,把用户的请求,根据指定的算法,分发到一组 upstream 虚拟服务池
3、upstream
(1)定义一组被代理服务器,服务器可以在不同的端口上监听,服务器可以同时监听 TCP 和 UNIX-domain sockets
(2)服务器可以指定不同的权重,默认为 1
(3)语法
upstream name { ... }
(4)位置:http
(5)name:upstream 虚拟服务池的名称
4、server
(1)定义一个被代理服务器的地址、其他参数,如:被代理服务器的状态、分配算法
(2)地址可以指定为域名或 IP 地址,可以选择端口,可以在 unix: 前缀后,指定 UNIX 域名套接字路径
(3)如果没有指定端口,则使用端口 80
(4)一个域名如果解析到几个 IP 地址,就可以同时定义多个服务器
(5)语法
server name [paramerters]
(6)位置:upstream
5、实现流程
被代理服务器在负责均衡调度中的状态
1、在 upstream 块 server 中的 parameter 设置
状态 | 概述 |
down | 当前 server 暂时不参与负载均衡 |
backup | 预留的备份服务器 |
max_fails | 允许请求失败的次数 |
fail_timeout | 经过 max_fails 失败后, 服务暂停时间 |
max_conns | 限制最大的接收连接数 |
1、down
(1)将该服务器标记为永久不可用,那么该代理服务器将不参与负载均衡
(2)一般会对需要停机维护的服务器设置该标志
2、backup
(1)标志着该服务器是一个备份服务器
(2)当主服务器不可用时,它将被传递请求。
(3)该参数不能与 hash、ip_hash、random 平衡方法一起使用
3、max_conns=number
(1)限制与代理服务器同时进行的最大连接数
(2)默认值为 0,表示没有限制
(3)如果服务器组不在共享内存中,则限制在每个工作进程中发挥作用
(4)如果空闲的 keepalive 连接、多个工作进程、共享内存被启用,那么到代理服务器的活动和空闲连接总数,可能超过 max_conns 值
4、max_fails=number
(1)允许请求失败的次数
(2)需要设置 fail_timeout
(3)默认情况下,不成功的尝试次数被设置为 1,零值禁止对尝试进行统计
5、fail_timeout=time
(1)指定的与服务器通信的不成功尝试的暂停时间,在此时间内,服务器被认为不可用
(2)默认情况下,该参数被设置为 10 秒
负载均衡策略
1、Nginx 的 upstream 支持六种分配算法
算法 | 说明 |
轮询 | 默认 |
weight | 依据权重分配 |
ip_hash | 依据 IP 分配 |
least_conn | 依据最少连接 |
url_hash | 依据 URL 分配 |
fair | 依据响应时间分配 |
2、轮询
(1)upstream 模块负载均衡默认策略
(2)每个请求会按时间顺序,逐个分配到不同的后端服务器
(3)轮询不需要额外的配置
(4)无法保持 Session
3、weight
(1)语法
weight=number
(2)位置:server 中的 parameter
(3)设置服务器的权重,默认为 1
(4)权重数据越大,被分配到请求的几率越大
(5)该权重值主要针对实际工作环境中,不同的后端服务器硬件配置进行调整
(6)应用场景:服务器的硬件配置差别比较大
4、ip_hash
(1)语法
ip_hash;
(2)位置:upstream
(2)根据客户 IP 地址在服务器之间分配请求,定向用户转发
(3)客户端 IPv4 地址的前 3 个字节,或者整个 IPv6 地址,被用作散列密钥
(4)当来自某一个 IP 的用户在后端 Web 服务器上登录后,在访问该站点的其他 URL,能保证其访问的为同一后端 Web 服务器
(5)无法保证后端服务器的负载均衡,而且设置后端服务器权重等方法将失效
5、least_conn
(1)语法
least_conn;
(2)位置:upstream
(3)将连接传递给活动连接数最少的服务器,同时考虑到服务器的权重。如果有几个连接数、权重相同的服务器,则使用加权轮询方法依次传递
(4)应用场景:请求处理时间长短不一造成服务器过载
6、url_hash
(1)按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,需要配合缓存命中使用,定向流量转发
(2)同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费
(3)使用 url_hash,使得同一个 url(即同一个资源请求)到达同一台服务器,一旦缓存资源,再此收到请求,就可以从缓存中读取
fair
1、第三方模块:nginx-upstream-fair
2、根据页面大小、加载时间长短,智能地负载均衡
3、安装
(1)备份 nginx 目录下的 nginx 二进制文件
cd /usr/local/nginx/sbin
mv nginx nginxold
(2)进入 Nginx 安装文件目录,使用 configure 配置参数
./configure --add-module=/{path}/nginx-upstream-fair
(3)编译
make
(4)编译可能会出现错误:ngx_http_upstream_srv_conf_t 结构中缺少 default_port
(5)编译前
sed -i 's/default_port/no_port/g' ngx_http_upstream_fair_module.c
(6)将安装目录下 objs 中的 nginx 二进制执行文件,移动到 nginx 目录下的 sbin 目录中
(7)执行更新命令
make upgrade
生产环境不使用 ip_hash、least_conn、url_hash、fair
1、ip_hash 无法保持 Session
2、流量倾斜
3、不支持服务动态上下线
4、只能在配置文件设置,不灵活
七层负载均衡(例)
1、对特定资源实现负载均衡
upstream videobackend{
server 192.168.200.146:9001;
server 192.168.200.146:9002;
}
upstream filebackend{
server 192.168.200.146:9003;
server 192.168.200.146:9004;
}
server {
listen 8084;
server_name localhost;
location /video/ {
proxy_pass http://videobackend;
}
location /file/ {
proxy_pass http://filebackend;
}
}
2、对不同域名实现负载均衡
upstream itcastbackend{
server 192.168.200.146:9001;
server 192.168.200.146:9002;
}
upstream itheimabackend{
server 192.168.200.146:9003;
server 192.168.200.146:9004;
}
server {
listen 8085;
server_name www.itcast.cn;
location / {
proxy_pass http://itcastbackend;
}
}
server {
listen 8086;
server_name www.itheima.cn;
location / {
proxy_pass http://itheimabackend;
}
}
3、实现带有URL重写的负载均衡
upstream backend{
server 192.168.200.146:9001;
server 192.168.200.146:9002;
server 192.168.200.146:9003;
}
server {
listen 80;
server_name localhost;
location /file/ {
rewrite ^(/file/.*) /server/$1 last;
}
location / {
proxy_pass http://backend;
}
}
四层负载均衡
1、ngx_stream_core_module
(1)Nginx 在 1.9 之后新增
(2)实现四层协议的转发、代理、负载均衡等
2、用法与 ngx_http_upstream_module 类似
(1)允许配置一组 TCP 或 UDP 等协议的监听
(2)通过 proxy_pass 转发请求
(3)通过 upstream 添加多个后端服务,实现负载均衡
3、stream
(1)提供配置文件的上下文,在该文件中指定流服务器指令
(2)语法
stream { ... }
(3)位置:全局,和 http 块同级
4、upstream
(1)定义一组被代理服务器,服务器可以在不同的端口上监听,服务器可以同时监听 TCP 和 UNIX-domain sockets
(2)服务器可以指定不同的权重,默认为 1
(3)语法
upstream name { ... }
(4)位置:http
(5)name:upstream 虚拟服务池的名称
(6)类似 http 块中的 upstream
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战