什么是四层负载均衡
基于传输层的负载均衡,协议包来封装的是(TCP/IP)。
四层负载均衡的应用场景
- 实现端口转发,ssh、mysql等都是tcp协议请求,只能用tcp方式连接的服务,我们就可以使用四层负载均衡来调度。
- 四层结合七层实现大规模集群架构
原因:
七层负载均衡能够接受的连接数有限,需要配置多台七层负载均衡
问题:多台七层如何实现轮询?
解决:在多台七层负载均衡前面接入四层负载均衡。
四层可以保证七层负载均衡的高可用性。
四层负载均衡,不识别域名,只能识别端口,可以在四层结合七层的情况下,四层做端口转发,七层来实现域名的匹配,然后代理到后端web节点。
四层负载均衡只能转发TCP/UDP/IP协议:如TCP/80 TCP/22 TCP/3306 UDP/53。
四层负载均衡可以解决七层负载均衡高可用性的问题。(可以多个负载均衡同时提供服务)
四层负载均衡可以解决七层负载均衡端口数限制问题(七层负载均衡最多能使用的端口是65535)
四层的转发效率远比七层代理的效率快的多,但是只能支持tcp/ip协议,所以他的功能较弱,虽然七层效率不高,但他支持http/https这样的应用层协议。
nginx四层负载均衡配置
- 请求四层负载均衡调度后端七层负载均衡
[root@lb-4 ~]# cat /etc/nginx/nginx.conf
#用户请求四层负载均衡80,调度到后端七层负载均衡 (与http{}同级)
stream {
upstream lb {
server 172.16.1.5:80 weight=3 max_fails=2 fail_timeout=10s;
#server 172.16.1.6:80 weight=3 max_fails=2 fail_timeout=10s;
}
server {
listen 80;
proxy_pass lb;
proxy_connect_timeout 3s;
proxy_timeout 3s;
}
}
- 配置四层负载均衡 基于端口转发(22端口 3306端口)
stream {
upstream lb {
server 172.16.1.5:80;
}
server {
listen 80;
proxy_pass lb;
proxy_connect_timeout 3s;
proxy_timeout 3s;
}
upstream ssh {
server 172.16.1.51:22;
}
upstream mysql {
server 172.16.1.52:3306;
}
server {
listen 5555;
proxy_pass ssh;
}
server {
listen 6666;
proxy_pass mysql;
}
}
四层负载均衡如果想要获取日志,需要把日志信息定义到stream层中。使用log_format定义。
定义方法:
#定义日志的格式
log_format proxy '$remote_addr - [$time_local] $status $protocol'
' "$upstream_addr" "$upstream_bytes_sent" "$upstream_connect_time"';
#调用日志
access_log /var/log/nginx/tcp_access.log proxy;
-
四层负载均衡透传真实ip
环境:四层+七层+七层+web
配置步骤: -
在四层添加proxy_protocol协议(传递信息携带一个新的tcp头部(包含源IP、源端口等信息))
-
在七层负载均衡上添加proxy_protocol协议
-
排除七层前面代理的ip地址 (使用set_real_ip_from)
-
同时将proxy_protocol协议提取真实ip地址赋值给$remote_addr变量通过x-forward-for。
-
第二个七层负载均衡什么都不用配置,只需要开启x-forward-for即可
配置方法:
四层配置
[root@lb-4 conf]# vim nginx.conf
...
stream {
upstream web {
server 172.16.1.5:80;
}
server {
listen 80;
proxy_pass web;
proxy_protocol on; #开启proxy_protocol协议
}
}
...
七层 (如果有多个配置第一个七层即可)
[root@lb conf.d]# cat proxy_ip_oldxu.com.conf
upstream ip {
server 172.16.1.7:80;
}
server {
server_name ip.oldxu.com;
listen 80 proxy_protocol; #添加proxy_protocol
set_real_ip_from 172.16.1.0/24; #添加七层负载前经过的代理IP地址
real_ip_header proxy_protocol; #将proxy_protocol获取的IP赋值给$remote_addr
location / {
proxy_pass http://ip;
proxy_set_header Host $http_host;
#将proxy_protocol真实客户端的IP地址赋值给X-Forwarded-For变量携带至后端
proxy_set_header X-Forwarded-For $proxy_protocol_addr;
}
}
web
[root@web02 ~]# cat /etc/nginx/conf.d/ip.oldxu.com.conf
server {
listen 80;
server_name ip.oldxu.com;
root /php;
#web前端所有的代理服务器地址,一个都不能少
set_real_ip_from 10.0.0.5;
set_real_ip_from 10.0.0.7;
set_real_ip_from 172.16.1.4;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
结果(第一个字段出现了真是的IP地址):
10.0.0.1 - - [29/Apr/2020:12:21:39 +0800] "GET / HTTP/1.0" 200 61