1 负载均衡的作用
解决高并发问题
负载均衡:建立在现有网络结构之上,它提供了一种廉价有效透明的方法 扩展网络设备
和 服务器的带宽
、增加吞吐量
、加强网络数据处理能力
、提高网络的灵活性和可用性
。
负载均衡,英文名称为 Load Balance,其意思就是分摊到多个操作单元上进行执行,例如:Web 服务器、FTP 服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
负载均衡就是,将所有请求先到负载均衡器,在由负载均衡器采用负载均衡算法(轮询
、IP绑定
、权重
)分发到不同实际的服务器中,这也就是服务器集群,集群的目的 是为了减轻单台服务器压力。
2 网络模型图
OSI中的层 | 功能 | TCP/IP协议族 |
---|---|---|
应用层 | 文件传输、电子邮件、文件服务、虚拟终端 | TFTP、HTTP、SNMP、FTP、SMTP、DNS、RIP、Telnet |
表示层 | 数据格式化、代码转换、数据加密 | 没有协议 |
会话层 | 解除或建立与别的接点的联系 | 没有协议 |
传输层 |
提供端对端的接口 |
TCP 、UDP |
网络层 | 为数据包选择路由 | IP、ICMP、OSPF、BGP、IGMP、ARP、RARP |
数据链路层 | 传输有地址的帧以及错误检测功能 | SLIP、CSLIP、PPP、MTU、ARP、RARP |
物理层 | 以二进制数据形式再物理媒体上传输数据 | ISO2110、IEEE802、IEEE802.2 |
3 四层和七层负载均衡的区别
四层负载均衡
:在网络模型中的 传输层
中,基于主要是基于 TCP
协议报文实现负载均衡(比如 LVS
、haproxy
就是四层负载均衡器),使用改写报文的源地址和目的地址。
七层负载均衡
:在网络模型中 应用层
中,基于 URL
或者 HTTP
协议实现负载均衡,Web服务器。
Nginx 在 1.9 之后,也支持
四层负载均衡
了
4 负载均衡的缺点
使用负载均衡后,实际用到的服务器是集群,那么这时候就会产生很多分布式相关问题。
比如:
- 分布式
Session
一致性问题 - 分布式定时任务调度
幂等性
问题 - 分布式生成
全局 ID
分布式锁
解决方案- 分布式配置中心
5 Nginx
配置负载均衡
Nginx
负载均衡提供上游服务器(真实业务逻辑访问的服务器),负载均衡
、故障转移
、失败重试
、容错
、健康检查
等。
当上游服务器(真实业务逻辑访问的服务器)发生故障时,可以转移到其他上游服务器(真实业务逻辑访问的服务器)。
最好不要使用 Nginx 的
失败重试
机制,会产生幂等性问题,微服务有重试机制。
5.1 Upstream Server
负载均衡
上游服务器
:使用负载均衡器
转发到真实的业务服务器
Upstream Server
中文翻译 上游服务器
,意思就是负载均衡服务器设置,白话文表示(就是被 nginx 代理最后真实访问的服务器)。
负载均衡算法
:配置多个上游服务器(真实业务逻辑访问的服务器)的负载均衡机制。
失败重试机制
:当上游服务器(真实业务逻辑访问的服务器)出现超时或者服务器不存活,是否考虑重试机制(补偿机制)。
服务器心跳检测
:当上游服务器(真实业务逻辑访问的服务器),监控检测|心跳检测。
5.2 Upstream Server
配置
###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮询机制
upstream test{
server 127.0.0.1:8001;
server 127.0.0.1:8002;
}
server {
listen 80;
server_name www.test.com;
location / {
proxy_pass http://test;
index index.html index.htm;
}
}
刷新 Nginx:
/usr/local/nginx/sbin/nginx -s reload
测试:
6 负载均衡算法
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。
2、weight(轮询权值)
weight
的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。
3、
ip_hash
每个请求按访问 IP 的哈希结果分配,使来自同一个 IP 的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的 session
共享问题。俗称 IP 绑定。
4、
fair
(第三方)
比 weight
、ip_hash
更加智能的负载均衡算法,fair
算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。Nginx
本身不支持 fair
,如果需要这种调度算法,则必须安装 upstream_fair
模块。
5、
url_hash
(第三方)
按访问的 URL
的哈希结果来分配请求,使每个 URL
定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx
本身不支持 url_hash
,如果需要这种调度算法,则必须安装 Nginx
的 hash
软件包。
6.1 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。
6.2 权重 Weight
可以根据服务器的实际情况调整服务器权重。权重越高分配的请求越多,权重越低,请求越少。默认是都是1。
###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮询机制
upstream test{
server 127.0.0.1:8001 weight=1;
server 127.0.0.1:8002 weight=2;
}
server {
listen 80;
server_name www.test.com;
location / {
proxy_pass http://test;
index index.html index.htm;
}
}
6.3 IP 绑定 ip_hash
每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且 可以有效解决动态网页存在的 session 共享问题
。俗称IP绑定。
###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮询机制
upstream test{
server 127.0.0.1:8001;
server 127.0.0.1:8002;
ip_hash;
}
server {
listen 80;
server_name www.test.com;
location / {
proxy_pass http://test;
index index.html index.htm;
}
}
7 Nginx
配置故障转移
当上游服务器(真实访问服务器),一旦出现故障或者是没有及时相应的话,应该直接轮训到下一台服务器,保证服务器的高可用。
Nginx
配置代码:
###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮询机制
upstream test{
server 127.0.0.1:8001;
server 127.0.0.1:8002;
}
server {
listen 80;
server_name www.test.com;
location / {
### 指定上游服务器负载均衡服务器
proxy_pass http://test;
### nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 1s;
### nginx发送给上游服务器(真实访问的服务器)超时时间
proxy_send_timeout 1s;
### nginx接受上游服务器(真实访问的服务器)超时时间
proxy_read_timeout 1s;
index index.html index.htm;
}
}
8 Nginx
rewrite
Nginx
提供的全局变量或自己设置的变量,结合正则表达式和标志位实现 url
重写以及重定向。rewrite
只能放在 server{}
、location{}
、if{}
中,并且只能对域名后边的除去传递的参数外的字符串起作用。
Rewrite
主要的功能就是实现 URL
的重写,Nginx
的 Rewrite
规则采用 Pcre
,perl
兼容正则表达式的语法规则匹配,如果需要 Nginx
的 Rewrite
功能,在编译 Nginx
之前,需要编译安装 PCRE
库。
通过 Rewrite
规则,可以实现规范的 URL
、根据变量来做 URL
转向及选择配置。
8.1 Rewrite
全局变量
nginx 的 rewrite 规则就是使用正则匹配请求的 url,然后根据定义的规则进行重写和改变,需 ngx_http_rewrite_module
模块来支持 url
重写功能,该模块是标准模块,默认已经安装。
变量 | 含义 |
---|---|
$args |
这个变量等于请求行中的参数,同 $query_string |
$content length |
请求头中的 Content-length 字段 |
$content_type |
请求头中的 Content-Type 字段 |
$document_root |
当前请求在root指令中指定的值 |
$host |
请求主机头字段,否则为服务器名称 |
$http_user_agent |
客户端 agent 信息 |
$http_cookie |
客户端 cookie 信息 |
$limit_rate |
这个变量可以限制连接速 |
$request_method |
客户端请求的动作,通常为 GET 或 POST |
$remote_addr |
客户端的 IP 地址 |
$remote_port |
客户端的端口 |
$remote_user |
已经经过 Auth Basic Module 验证的用户名 |
$request_filename |
当前请求的文件路径,由root或alias指令与URI请求生成 |
$scheme |
HTTP 方法(如 http ,https ) |
$server_protocol |
请求使用的协议,通常是HTTP/1.0 或 HTTP/1.1 |
$server_addr |
服务器地址,在完成一次系统调用后可以确定这个值 |
$server_name |
服务器名称 |
$server_port |
请求到达服务器的端口号 |
$request_uri |
包含请求参数的原始 URI ,不包含主机名,如 /foo/bar.php?arg=baz |
$uri |
不带请求参数的当前 URI ,$uri 不包含主机名,如 /foo/bar.html |
$document_uri |
与 $uri 相同 |
8.2 判断 IP
地址来源
## 如果访问的ip地址为192.168.5.165,则返回403
if ($remote_addr = 192.168.5.166) {
return 403;
}
8.3 限制浏览器访问
## 不允许谷歌浏览器访问 如果是谷歌浏览器返回500
if ($http_user_agent ~ Chrome) {
return 500;
}