简介
负载均衡
什么是负载均衡?
负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行。
Nginx负载均衡
什么是Nginx负载均衡?
Nginx负载均衡可以大大提升系统的吞吐率、请求性能、容灾性能。
工作原理
web服务器直接面向用户时,往往要承载大量并发请求。
单台服务器难以负荷,此时使用多天web服务器组成集群,前端使用Nginx负载均衡将请求分散到后端web服务器集群中。
示意图
应用
主机规划
主机名称 | 主机地址 | 主机功能 |
---|---|---|
master-1 | 192.168.131.129 | 负载均衡主机 |
master-2 | 192.168.131.130 | web主机1 |
master-3 | 192.168.131.131 | web主机2 |
环境准备
安装Nginx
三台主机一同安装Nginx服务
- 配置yum仓库
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
- 安装Nginx
yum list | grep nginx
yum -y install nginx
nginx -v
配置web主机
- 配置web站点
地址:192.168.131.130、192.168.131.131
路径:/etc/nginx/conf.d/default.conf
server {
listen 80;
server_name wang.mingqu.com;
charset utf-8;
location / {
root /www/wangmingqu/;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
- 配置web页面
地址:192.168.131.130、192.168.131.131
路径:/www/wangmingqu/index.html
#主机:192.168.131.130、192.168.131.131
mkdir -p /www/wangmingqu/
#主机:192.168.131.130
echo "王茗渠测试页面,主机IP:192.168.131.130" > /www/wangmingqu/index.html
#主机:192.168.131.131
echo "王茗渠测试页面,主机IP:192.168.131.131" > /www/wangmingqu/index.html
注意:生成环境中两台web主机的资源内容需要保持一致,此处是为了演示负载均衡分配到了两台机器上
- 启动web服务
systemctl stop firewalld
setenforce 0
nginx -t
systemctl start nginx
curl -iv wang.mingqu.com
简单应用
配置负载均衡
地址:192.168.131.129
路径:/etc/nginx/conf.d/wangmingqu.conf
upstream web {
server 192.168.131.130;
server 192.168.131.131;
}
server {
listen 80;
server_name wang.wangmingqu.com;
charset utf-8;
location / {
proxy_pass http://web;
}
}
检查配置
nginx -t
systemctl reload nginx
验证负载均衡
配置参数
upstream
语法:upstream name {…}
作用:定义一个负载均衡主机组
适用范围:http
server
语法:server url|host;
作用:定义负载均衡主机组中的主机
适用范围:upstream
proxy_pass
语法:proxy_pass http://name;
作用:引用定义的负载均衡主机组,将客户端请求转发至upstream服务池。
适用范围:location
后端状态
- weight
语法:server url|host weight=数值;
作用:指定负载均衡主机组中的主机权重,将客户端请求优先发送到该主机。
适用范围:upstream
- down
语法:server url|host down;
作用:指定当前主机暂时不参与负载均衡。
适用范围:upstream
- backup
语法:server url|host backup;
作用:指定负载均衡主机组中的某个主机为备份主机。
适用范围:upstream
- max_fails
语法:server url|host max_fails=数值;
作用:允许请求失败的次数
适用范围:upstream
- fail_timeout
语法:server url|host max_fails=数值 fail_timeout=时间s;
作用:经过max_fails失败后,服务暂停时间,单位秒“s”
适用范围:upstream
- max_conns
语法:server url|host max_conns=数值;
作用:限制最大的请求连接数。
适用范围:upstream
算法详解
轮询算法
- 简介
按时间顺序逐一分配到不同的后端服务器(默认算法),简称rr。
不考虑实际负载或配置,平均分配客户端请求。
- 应用
upstream web {
server 192.168.131.130;
server 192.168.131.131;
}
server {
listen 80;
server_name wang.wangmingqu.com;
charset utf-8;
location / {
proxy_pass http://web;
}
}
权重算法
- 简介
权重算法,设置的weight值越大,请求访问到该机器的概率越高。又称为加权轮询,简称wrr。
- 应用
upstream web {
server 192.168.131.130 weight=10;
server 192.168.131.131;
}
server {
listen 80;
server_name wang.wangmingqu.com;
charset utf-8;
location / {
proxy_pass http://web;
}
}
IP哈希算法
- 简介
每个请求按访问IP的hash结果分配。
这样来自同一IP的固定客户端访问同一个后端服务器。
注意:不能和weight一起使用。
- 应用
upstream web {
ip_hash;
server 192.168.131.130;
server 192.168.131.131;
}
server {
listen 80;
server_name wang.wangmingqu.com;
charset utf-8;
location / {
proxy_pass http://web;
}
}
URL哈希算法
- 简介
每个请求按访问URL的hash结果分配。
每个相同的URL定向到同一个后端服务器。
- 应用
upstream web {
hash $request_uri;
server 192.168.131.130;
server 192.168.131.131;
}
server {
listen 80;
server_name wang.wangmingqu.com;
charset utf-8;
location / {
proxy_pass http://web;
}
}
最少连接数算法
- 简介
最少连接数算法,哪台机器的链接数少就分发到这台机器上,简称lc。
- 应用
upstream web {
least_conn;
server 192.168.131.130;
server 192.168.131.131;
}
server {
listen 80;
server_name wang.wangmingqu.com;
charset utf-8;
location / {
proxy_pass http://web;
}
}
加权最少连接数算法
- 简介
加权最少连接数算法,就是weight和least_conn两个算法的集合,简称wlc。
- 应用
upstream web {
least_conn;
server 192.168.131.130 weight=5;
server 192.168.131.131;
}
server {
listen 80;
server_name wang.wangmingqu.com;
charset utf-8;
location / {
proxy_pass http://web;
}
}
七层负载&四层负载
七层负载
七层负载均衡简介
什么是Nginx七层负载均衡?
七层负载均衡是在应用层,可以完成很多应用方面的协议请求。
比如http应用的负载均衡,可以实现http信息的改写、头信息的改写、安全应用规则控制、URL匹配规则控制、以及转发、rewrite等等的规则。
所以在应用层的服务里面,可以做的内容就更多,Nginx是一个典型的七层负载均衡。
七层负载均衡应用场景
可以将请求分发到不同的服务上,并且可以根据请求信息进行灵活的代理转发;
由于请求会通过负载均衡服务器,负载均衡服务器会过滤一些请求(例如:DOS攻击)避免所有请求信息都打到服务器上,保障了服务器的稳定运行。
处于网络分层的最上层,需要对数据进行解析,与客户端建立连接,效率比较低。
配置web主机
- 配置web站点
地址:192.168.131.130、192.168.131.131
路径:/etc/nginx/conf.d/default.conf
server {
listen 80;
server_name wang.mingqu.com;
charset utf-8;
location / {
root /www/wangmingqu/;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
- 配置web页面
地址:192.168.131.130、192.168.131.131
路径:/www/wangmingqu/index.html
#主机:192.168.131.130、192.168.131.131
mkdir -p /www/wangmingqu/
#主机:192.168.131.130
echo "王茗渠测试页面,主机IP:192.168.131.130" > /www/wangmingqu/index.html
#主机:192.168.131.131
echo "王茗渠测试页面,主机IP:192.168.131.131" > /www/wangmingqu/index.html
注意:生成环境中两台web主机的资源内容需要保持一致,此处是为了演示负载均衡分配到了两台机器上
- 启动web服务
systemctl stop firewalld
setenforce 0
nginx -t
systemctl start nginx
curl -iv wang.mingqu.com
配置负载均衡
地址:192.168.131.129
路径:/etc/nginx/conf.d/wangmingqu.conf
upstream web {
server 192.168.131.130;
server 192.168.131.131;
}
server {
listen 80;
server_name wang.wangmingqu.com;
charset utf-8;
location / {
proxy_pass http://web;
}
}
检查配置
nginx -t
systemctl reload nginx
验证负载均衡
四层负载
四层负载均衡简介
什么是Nginx四层负载均衡?
四层负载均衡是基于传输层协议包来封装的(如:TCP/IP),那我们前面使用到的七层是指的应用层,他的组装在四层的基础之上,无论四层还是七层都是指的OSI网络模型。
四层负载均衡应用场景
- 四层+七层来做负载均衡,四层可以保证七层的负载均衡的高可用性;如:nginx就无法保证自己的服务高可用,需要依赖LVS或者keepalive。
- 如:tcp协议的负载均衡,有些请求是TCP协议的(mysql、ssh),或者说这些请求只需要使用四层进行端口的转发就可以了,所以使用四层负载均衡。
四层负载均衡总结
- 四层负载均衡仅能转发TCP/IP协议、UDP协议、通常用来转发端口,如:tcp/22、udp/53;
- 四层负载均衡可以用来解决七层负载均衡端口限制问题;(七层负载均衡最大使用65535个端口号)
- 四层负载均衡可以解决七层负载均衡高可用问题;(多台后端七层负载均衡能同时的使用)
- 四层的转发效率比七层的高得多,但仅支持tcp/ip协议,不支持http和https协议;
- 通常大并发场景通常会选择使用在七层负载前面增加四层负载均衡;
添加四层负载模块
查看四层负载均衡模块
/usr/local/nginx/sbin/nginx -V 2>&1 | grep stream
安装四层负载均衡模块
cd /usr/local/nginx/conf/
./configure --prefix=/usr/local/nginx \
--user=nginx --group=nginx \
--with-http_realip_module \
--with-http_v2_module \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-stream \
--with-stream_ssl_module \
--with-http_sub_module \
--with-http_random_index_module
创建配置文件
mkdir -p /usr/local/nginx/conf/conf.stream/
主配置文件
路径:/usr/local/nginx/conf/nginx.conf
主机地址:192.168.131.129
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
include /usr/local/nginx/conf/conf.stream/*.conf;
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /usr/local/nginx/conf/conf.d/*.conf;
}
子配置文件
路径:/usr/local/nginx/conf/conf.d/stream.conf
主机地址:192.168.131.129
stream {
upstream web_test_01 {
server 192.168.131.130:22;
}
upstream web_test_02 {
server 192.168.131.131:22;
}
server {
listen 8081;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass web_test_01;
}
server {
listen 8082;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass web_test_02;
}
}
验证四层负载
- 检查配置文件
/usr/local/nginx/sbin/nginx -t
systemctl reload nginx
- 验证四层负载
ssh -p 8081 root@192.168.131.129
ssh -p 8082 root@192.168.131.129