Nginx四层负载均衡
Nginx四层负载均衡
四层负载均衡基本概述
什么是四层负载均衡
四层负载均衡是基于传输层协议包来封装的(如:TCP/IP),那我们前面使用到的七层是指的应用层,他的组装在四层的基础之上,无论四层还是七层都是指的OSI网络模型
四层负载应用场景
- 四层+七层来做负载均衡,四层可以保证七层的负载均衡的高可用性;如:nginx就无法保证自己的服务高可用, 需要依赖LVS或者keepalive。
- 如:tcp协议的负载均衡,有些请求是TCP协议的(mysql、ssh),或者说这些请求只需要使用四层进行端口的转 发就可以了,所以使用四层负载均衡。
负载均衡软件
- nginx
- 四层负载(nginx 1.9版本以后有stream模块,才可以做四层负载)
- stream
- 七层负载
- upstream
- 四层负载(nginx 1.9版本以后有stream模块,才可以做四层负载)
- LVS
- 四层负载
- HAproxy
- 四层负载
- 七层负载
四层负载均衡总结
- 四层负载均衡仅能转发TCP/IP协议、UDP协议、通常用来转发端口,如:tcp/22、udp/53;
- 四层负载均衡可以用来解决七层负载均衡端口限制问题;(七层负载均衡最大使用65535个端口号)
- 四层负载均衡可以解决七层负载均衡高可用问题;(多台后端七层负载均衡能同事的使用)
- 四层的转发效率比七层的高得多,但仅支持tcp/ip协议,不支持http和https协议;
- 通常大并发场景通常会选择使用在七层负载前面增加四层负载均衡
四层负载均衡配置
环境准备
主机名 | WanIP | LanIP | 角色 | 应用 |
---|---|---|---|---|
lb01 | 10.0.0.5 | 172.16.1.5 | 七层负载 | nginx |
lb02 | 10.0.0.6 | 172.16.1.6 | 四层负载 | nginx |
web01 | 10.0.0.7 | 172.16.1.7 | web网站 | nginx、php |
web02 | 10.0.0.8 | 172.16.1.8 | web网站 | nginx、php |
db01 | 10.0.0.51 | 172.16.1. 51 | 数据库 | MariaDB |
部署四层负载均衡
# 1.添加nginx官方源
[root@lb02 ~]# vim /etc/yum.repos.d/nginx.repo
[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
# 2.安装nginx
[root@lb02 ~]# yum install -y nginx
# 3.配置四层负载
stream {
upstream backend {
server 172.16.1.5:80;
}
server {
listen 90;
proxy_pass backend;
}
}
http{
...
}
使用stream做端口转发
1.使用nginx四层负载均衡实现tcp的转发
请求负载均衡 5555 ---> 172.16.1.7:22;
请求负载均衡 6666 ---> 172.16.1.51:3306;
2.配置nginx四层负载均衡实现tcp的转发
[root@lb01 ~]# cat /etc/nginx/conf.c/lb_domain.conf
stream {
log_format proxy '$remote_addr $remote_port - [$time_local] $status $protocol '
'"$upstream_addr" "$upstream_bytes_sent" "$upstream_connect_time"' ;
access_log /var/log/nginx/proxy.log proxy;
#定义转发ssh的22端口
upstream ssh_7 {
server 10.0.0.7:22;
}
#定义转发mysql的3306端口
upstream mysql_51 {
server 10.0.0.51:3306;
}
server {
listen 5555;
proxy_connect_timeout 3s;
proxy_timeout 300s;
proxy_pass ssh_7;
}
server {
listen 6666;
proxy_connect_timeout 3s;
proxy_timeout 3s;
proxy_pass mysql_51;
}
}