负载均衡

概述

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

posted @   半条咸鱼  阅读(177)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示