绪论、高并发专题之负载均衡方案详述(包括HTTP,DNS,反向代理)
1、负载均衡概述
在**服务器集群**中,需要有**一台服务器充当调度者**的角色,**用户的所有请求都会首先由它接收**,**调度者再根据每台服务器的负载情况将请求分配给某一台后端服务器去处理**。
- 重点:那么在这个过程中,调度者如何合理分配任务,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡问题。
2、http重定向负载均衡
-
含义:Web服务器可通过Http响应头信息中的Location标记来返回一个新的URL,浏览器自动去访问这个新的URL。
-
实现:可以通过Web应用程序代码实现你想到的调度策略,如可根据请求的URL的不同来进行合理的过滤和转移。
- 请求过程如下:
①当用户向服务器发起请求时,请求首先被集群调度者截获;调度者根据某种分配策略,选择一台服务器,并将选中的服务器的IP地址封装在HTTP响应消息头部的Location字段中,并将响应消息的状态码设为302,最后将这个响应消息返回给浏览器。
②当浏览器收到响应消息后,解析Location字段,并向该URL发起请求,然后指定的服务器处理该用户的请求,最后将结果返回给用户。
-
注意事项:在使用HTTP重定向来实现服务器集群负载均衡的过程中,需要一台服务器作为请求调度者。用户的一项操作需要发起两次HTTP请求
-
第一次:向调度服务器发送请求,获取后端服务器的IP
-
第二次:向后端服务器发送请求,获取处理结果。
-
3、DNS负载均衡
- 含义:DNS负责将用户请求的域名映射为实际的IP地址,这种映射可以是一对多的( DNS的A记录,用来指定域名对应的IP地址),这样DNS服务器便充当负载均衡调度器。
- 实现:DNS节省了所谓的主站点,DNS服务器已经充当了主站点的职能。常见的策略是对多个A记录进行RR(轮询)
- 请求过程如下:
①域名指向多个后端服务器(将一个域名解析到多个IP上),再设置调度策略,之后负载均衡就完全由DNS服务器来实现;
②当用户向我们的域名发起请求时,DNS服务器会自动地根据我们事先设定好的调度策略选一个合适的IP返回给用户,用户再向该IP发起请求。
- DNS域名解析步骤·:
- 第一步:客户端提交请求给域名服务器
- 第二步:域名服务器将域名解析为IP地址返回给客户端
- 第三步:客户端收到IP后向该IP发起请求
4、反向代理负载均衡
- 含义:反向代理服务器的核心工作是转发HTTP,它工作在HTTP层面,因此,基于反向代理的负载均衡也称为七层负载均衡。
- 实现:任何对于实际服务器的HTTP请求都必须经过调度器;调度器必须等待实际服务器的HTTP响应,并将它反馈给用户
- 请求过程如下:
①客户端发起请求给反向代理服务器
②代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器
③后台服务器将资源返回给代理服务器
④代理服务器将资源返回给客户端
第一章 Nginx专题之代理服务器概述
1、Nginx概述
- 定义:一个高性能【http】和反向代理的web服务器
- 官网:
http://nginx.org/
- 功能:负载均衡、静态文件服务器、支持多种协议https、POP3等
2、正向代理服务器&反向代理服务器
2.1、代理服务器
- 代理服务器:客户端和目标服务器之间的服务器;
- 主要作用:客户端向代理发送一个请求,然后代理向目标服务器请求获得内容,并返回给客户端
2.2、正向代理服务器
- 核心:用户知道自己访问的目标机器
- 场景:跳板机、访问原来无法访问的网站,比如国外的站点
2.3、反向代理服务器
- 核心:客户端不知道要访问的目标服务器是哪台服务器,代理会根据一定的策略返回一个真实的服务器进行请求,隐藏了真实服务器,客户端只知道代理服务器地址。
- 场景:访问京东,我们知道要访问的域名是jd.com,但是后面提供数据的具体是什么域名ip我们是不知道的。
第二章 Nginx专题之核心文件详述
1、Nginx常用命令
(1)默认启动命令
./nginx
(2)启动-指定某个配置文件
./nginx -c /usr/local/nginx/conf/nginx.conf
(3)重启命令
./nginx -s reload
(4)停止命令
./nginx -s stop
(5)杀死进程
#nginx有master process 和workerprocess,关闭master即可
ps -ef | grep "nginx"
kill -9 PID
2、核心目录文件详解
-
conf:所有配置⽂件⽬录
- nginx.conf :默认的主要的配置⽂件
- nginx.conf.default :默认模板
-
html : 这是编译安装时Nginx的默认站点⽬录
- 50x.html :错误⻚⾯
- index.html :默认⾸⻚
-
logs : nginx默认的⽇志路径,包括错误⽇志及访问⽇志
- error.log :错误⽇志
- nginx.pid :nginx启动后的进程id
- access.log :nginx访问⽇志
-
sbin :nginx命令的⽬录
- nginx:启动命令
3、配置文件详解
- 核心配置文件
(1)配置项
- 含义:每个配置项由配置指令和指令参数 2 个部分构成
user nobody; # 指定Nginx Worker进程所属⽤户组
worker_processes 1; # woker进程数目,一般和CPU的核数保持一致
error_log logs/error.log; # 错误⽇志的存放路径和错误⽇志
error_log logs/error.log notice;#日志级别
error_log logs/error.log info;
pid logs/nginx.pid; # nginx进程PID存放路径
(2)事件模块指令
- 含义:⽤来指定Nginx的IO模型,Nginx⽀持的有 select、poll、kqueue、epoll 等。
events {
use epoll;
# 定义Nginx每个进程的最⼤连接数, 作为服务器来说: worker_connections * worker_processes,
# 作为反向代理来说,最⼤并发数量应该是 worker_connections * worker_processes/2。
# 注解:因为反向代理服务器,每个并发会建⽴与客户端的连接和与后端服务的连接,会占⽤两个连接
worker_connections 1024;
}
(3)虚拟主机配置
- 虚拟主机:一台物理主机服务器上划分出多个磁盘空间,每个磁盘空间都是一个虚拟主机,每台虚拟主机都可以对外提供Web服务,并且互相不干扰。
http {
include mime.types;
default_type application/octet-stream;
# ⾃定义服务⽇志
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
# 是否开启⾼效传输模式 on开启 off关闭
sendfile on;
#减少⽹络报⽂段的数量
#tcp_nopush on;
#keepalive_timeout 0;
# 客户端连接保持活动的超时时间,超过这个时间之后,服务器会关闭该连接
keepalive_timeout 65;
#gzip on;
# 虚拟主机的配置
server {
listen 80; # 虚拟主机的服务端⼝
server_name localhost; #⽤来指定IP地址或域名,多个域名之间⽤空格分开
#charset koi8-r;
#access_log logs/host.access.log main;
#URL地址匹配
location / {
root html; # 服务默认启动⽬录
index index.html index.htm; # 默认访问⽂件,按照顺序找
}
#error_page 404
/404.html; #错误状态码的显示⻚⾯
# redirect server error pages to the
static page /50x.html
error_page 500 502 503 504
/50x.html;
location = /50x.html {
root html;
}
第三章 Nginx专题之实战案例一 - 搭建前端静态服务器
- 注意事项:配置之前,拷⻉⼀份默认的出来
1、业务场景:
2、修改配置文件
#修改域名
server_name taobao.com
#拷贝并重命名域名
server {
listen 80;
server_name jingdong.com;
location / {
root html;
index jingdong.html;
}
}
server {
listen 80;
server_name weipinhui.com;
location / {
root html;
index weipinhui.html;
}
}
- 如图
3、添加html文件,并修改相关配置
[atguigu@hadoop102 html]$ cp index.html taobao.html
[atguigu@hadoop102 html]$ cp index.html jingdong.html
[atguigu@hadoop102 html]$ cp index.html weipinhui.html
4、启动nginx
./nginx
5、修改windows的域名映射文件
host文件路径:C:\Windows\System32\drivers\etc
#添加配置如下
192.168.6.102 taobao.com
192.168.6.102 jingdong.com
192.168.6.102 weipinhui.com
6、进行相关域名访问
6.1、访问taobao.com
http://taobao.com
6.2、访问jingdong.com
http://jingdong.com
6.3、访问weipinhui.com
http://weipinhui.com
第四章 Nginx专题之实战案例二 图片服务器搭建
1、业务场景
- 实际业务场景:公司一般使用图片服务器或者云厂商提供的CDN
- 使用流程:前端提交图片–>后端处理–>存储到图片服务器–>拼接好访问路径存储到数据库和范围前端
- 业务场景范例:
2、配置相关文件
#分别配置三个如下
location /app/img {
alias /opt/software/img/
}
- 如图
3、上传淘宝/京东/唯品会的log图片
cd /opt/software/img
4、重启Nginx服务器
./nginx -s reload
5、访问图片
5.1、访问淘宝的log
http://taobao.com/app/img/taobao.png
5.2、访问京东的log
http://jingdong.com/app/img/jingdong.png
5.3、访问唯品会的log
http://weipinhui.com/app/img/weipinhui.png
第五章 Nginx专题之实战案例三 Accesslog日志挖掘
1、Accesslog日志概述
(1)统计站点访问ip来源、某个时间段的访问频率;
(2)查看访问最频的页面、http响应状态码、接口性能;
(3)接口秒级访问量、分钟级访问量、小时和天级访问量
2、默认配置变量剖析
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
- 范例:访问京东的log的日志信息
192.168.6.1 - - [03/Feb/2022:10:16:49 +0800] "GET /app/img/jingdong.png HTTP/1.1" 200 21416 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"
- 变量详述
变量名称 | 变量 | case |
---|---|---|
remote_addr | 访问网站客户端地址,即客户端的ip | 192.168.6.1 |
remote_user | 2远程用户 | 对应的是第⼆个中杠“-”,没有远程⽤户, 所以⽤“-”填充 |
[$time_local] | 访问时间+时区 | [10/Jan/2022:17:10:25 +0800] |
$request | 用户http请求行信息 | GET /app/img/jingdong.png HTTP/1.1 |
$status | 访问状态码 | 200表示正常访问。 |
$body_bytes_sent | 响应body的字节数 | 21416 |
“$http_referer | 站点来源 | -,表示没有 |
$http_user_agent | 记录客户端的浏览信息 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36 |
“$http_x_forwarded_for | 对应的是”-“或者空 |
3、实战案例之运维平台统计
(1)查看访问最频繁的前100个ip
awk '{print $1}' access.log | sort -n | uniq -c | sort -rn | head -n 100
- 运行结果
(2)统计访问最多的url前20名
cat access.log |awk '{print $7}'| sort|uniq -c| sort -rn| head -20 | more
- 运行结果
4、实战案例之自定义日志统计接口性能
(1)$request_time变量详述
- 含义:从接收用户请求的第一个字节到发送完响应数据的时间,即包括接受请求数据时间、程序响应时间、输出响应数据时间。
(2)配置日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $request_time';
- 如图
(3)启用日志配置
access_log logs/access.log main;
- 如图
(4)重启应用
./nginx -s reload
(5)发送请求
http://weipinhui.com/app/img/weipinhui.png
http://jingdong.com/app/img/jingdong.png
(6)查看access日志最新信息
- 响应时间为0.000,不足1ms
192.168.6.1 - - [03/Feb/2022:11:01:49 +0800] "GET /app/img/jingdong.png HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" "-" 0.000
192.168.6.1 - - [03/Feb/2022:11:01:52 +0800] "GET /app/img/weipinhui.png HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" "-" 0.000
192.168.6.1 - - [03/Feb/2022:11:01:54 +0800] "GET /app/img/jingdong.png HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" "-" 0.000
192.168.6.1 - - [03/Feb/2022:11:01:57 +0800] "GET /app/img/weipinhui.png HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" "-" 0.000
第六章 Nginx专题之后端应用集群配置&负载均衡策略详述(图解+实测)
1、后端应用集群搭建
1.1、jar包上传
- demo-1.jar:监听8080端口
- demo-1.jar:监听8081端口
1.2、接口说明
(1)接口一:GET请求
- 作用:返回Json数据,控制输出日志
http://127.0.0.1:8080/api/v1/pub/info/check
(2)接口二:返回HTML⻚⾯
- 作用:两个jar返回的HTML内容不⼀样, ⽅便区分访问的是哪个jar
http://localhost:8080/api/v1/pub/web
1.3、jar包启动
java -jar demo-1.jar
java -jar demo-2.jar
- 启动成功如下
1.4、访问应用
(1)访问第一个接口
http://192.168.6.102:8080/api/v1/pub/info/check
http://192.168.6.102:8081/api/v1/pub/info/check
- 运行结果
(2)访问第二个接口
http://192.168.6.102:8080/api/v1/pub/web
http://192.168.6.102:8080/api/v1/pub/web
http://192.168.6.102:8080/api/v1/pub/web
http://192.168.6.102:8080/api/v1/pub/web
- 运行结果
1.5、守护进程启动
nohup java -jar demo-1.jar &
nohup java -jar demo-2.jar &
2、Nginx负载均衡
2.1、Nginx负载均衡概述
-
含义:当访问的服务有多个实例时,需要根据某种“均衡策略”决定请求发往哪个节点
-
原理:将流量分摊到多个服务器上执行,减轻服务器的压力
-
实现:Nginx负载均衡是通过upstream模块来实现的
2.2、Nginx负载均衡配置
- 打开配置文件
vim nginx.conf
- 修改配置如下
http{
#配置代理服务器
upstream logcluster{
server hadoop102:8080 weight=3;
server hadoop103:8080 weight=2;
server hadoop104:8080 weight=1;
}
server {
listen 80;
server_name localhost;
location /api/ {
#root html;
#index index.html index.htm;
#代理的服务器集群,命名随意,但是不能出现下划线
proxy_pass http://logcluster;
proxy_connect_timeout 10;
}
......
}
2.3、Nginx负载均衡测试(查看请求的源IP)
(1)修改配置文件
http {
......
#反向代理+负载均衡
upstream logcluster{
#负载均衡应用服务器hadoop102: 权重为3
server hadoop102:8080 weight=3;
#负载均衡应用服务器hadoop103: 权重为2
server hadoop103:8080 weight=2;
#负载均衡应用服务器hadoop104: 权重为1
server hadoop104:8080 weight=1;
}
server {
#监听80端口,http默认端口80
listen 80;
#服务器IP或域名
server_name weipinhui.com;
#反向代理请求路径中含有/api/的所有请求到upstream定义的对应反向代理模块
location /api/ {
proxy_pass http://logcluster;
#显示后台响应IP
add_header backendIP $upstream_addr;
add_header backendCode $upstream_status;
proxy_connect_timeout 10;
}
......
}
}
(2)重启Nginx
./nginx -s reload
- 查看进程
(3)启动三个SpringBoot应用
- 注意:分别在102、103、104三个虚拟机节点启动对应的SpringBoot应用
java -jar demo-1.jar
- 运行结果
(4)访问页面:过proxy_pass将用户的请求转发给webserver集群
http://weipinhui.com/api/v1/pub/info/check
(5)查看源IP
- 查看结果:六次请求中102响应3次(第一、二、四次),103响应2次(第三、六次),104响应1次(第五次)
- 详细图解如下
3、Nginx负载均衡策略
3.1、节点轮询(默认)
-
简介:每个请求按顺序分配到不同的后端服务器
-
场景:会造成可靠性低和负载分配不均衡,适合静态⽂件服务器
-
文件配置
upstream logcluster{
server hadoop102:8080;
server hadoop103:8080;
server hadoop104:8080;
}
- 示意图如下:
3.2、权重配置(weight)
- 含义:weight和访问⽐率成正⽐,数字越⼤,分配 得到的流量越⾼
- 业务场景:服务器性能差异⼤的情况使⽤
- 文件配置
upstream logcluster{
server hadoop102:8080 weight=3;
server hadoop103:8080 weight=2;
server hadoop104:8080 weight=1;
}
- 示意图如下:
- 注意事项:实测后六次请求中102响应3次(第一、二、四次),103响应2次(第三、六次),104响应1次(第五次)
3.3、固定分发(ip_hash)
-
简介:根据请求按访问ip的hash结果分配,这样每个⽤户就可以固定访问⼀个后端服务器
-
场景:服务器业务分区、业务缓存、Session需要单点的情况
-
文件配置
upstream logcluster{
ip_hash;
server hadoop102:8080;
server hadoop103:8080;
server hadoop104:8080;
}
- 示意图如下:
3.4、可用性检测配置
- 场景:总共三个应用,其中一个应用挂掉,请求不应该分发过去
(1)配置参数剖析
①max_fails:设定Nginx与后端节点通信的尝试失败的次数,默认为1,当超过最大次数就不会请求;
②fail_timeout:设定在Nginx失败次数达到最大后,Nginx节点不可用的时间段,即在此时间段内服务器不在会被尝试请求,默认为10s;
- 通信失败场景
- 服务器:服务器节点挂掉
- 网络:网络不通,通信超时
- 参数指定:proxy_next_upstream参数配置失败状况
(2)生产配置
- max_fails=3:设定最大通信尝试次数为3
- fail_timeout=60s:设定失败暂停时间为60s
http{
#配置代理服务器
upstream logcluster{
server hadoop102:8080 weight=1 max_fails=3 fail_timeout=60s;
server hadoop103:8080 weight=1 max_fails=3 fail_timeout=60s;
server hadoop104:8080 weight=1 max_fails=3 fail_timeout=60s;
}
server {
listen 80;
server_name localhost;
location /api/ {
#root html;
#index index.html index.htm;
#代理的服务器集群,命名随意,但是不能出现下划线
proxy_pass http://logcluster;
proxy_connect_timeout 10;
proxy_next_upstream error timeout http_500 http_503 http_404;
}
......
}