什么是四层负载均衡
- OSI七层模型中,四层是传输层,传输层使用端口到端口的通信方式
 - 四层负载均衡,就是在传输层做端口的转发(端口映射)
 
四层负载应用场景
1、四层+七层来做负载均衡,四层可以保证七层的负载均衡的高可用性;如:nginx就无法保证自己的服务高可用,需要依赖LVS或者keepalive。 2、如:tcp协议的负载均衡,有些请求是TCP协议的(mysql、ssh),或者说这些请求只需要使用四层进行端口的转发就可以了,所以使用四层负载均衡。
nginx四层负载
负载均衡软件:
- nginx
 
- 四层负载(nginx 1.9版本以后有stream模块,才可以做四层负载)
 
- stream
 - 七层负载
 - upstream
 
- LVS
 
- 四层负载
 
- HAproxy
 
- 四层负载
 - 七层负载
 
四层负载均衡配置
环境准备
 主机名   |  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层上面
http{
    ...
}
使用stream做端口转发
实现22端口转发
# 在10.0.0.6机器上开456端口,映射到10.0.0.8的22端口
ssh 10.0.0.6 -p 456
# 主配置文件,添加include
[root@lb02 streamd.d]# vim /etc/nginx/nginx.conf
user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;
events {
    ...
}
include /etc/nginx/stream.d/*.conf;
http {
    ...
}
# 实现456映射22端口需求(stream.d下只能有一个模块)
[root@lb02 nginx]# vim /etc/nginx/stream.d/456_22.conf
stream {
        upstream web02_ssh {
                server 172.16.1.8:22;
        }
        server {
                listen 456;
                proxy_pass web02_ssh;
        }
        upstream backend {
                server 172.16.1.5:80;
        }
        server {
                listen 90;
                proxy_pass backend;
        }
}




映射数据库端口
stream {
  upstream web02_ssh {
    server 172.16.1.8:22;
  }
  server {
    listen 456;
    proxy_pass web02_ssh;
  }
  upstream backend {
          server 172.16.1.5:80;
      }
      server {
              listen 90;
              proxy_pass backend;
      }
  upstream db01_mysql {
    server 172.16.1.51:3306;
  }
  server {
    listen 3307;
    proxy_pass db01_mysql;
  }
}
# 重启nginx 查看端口
[root@lb02 stream.d]# systemctl reload nginx
[root@lb02 stream.d]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:456             0.0.0.0:*               LISTEN      1256/nginx: master  
tcp        0      0 0.0.0.0:3307            0.0.0.0:*               LISTEN      1256/nginx: master  
# 检查能否连接 
[root@web01 wordpress]# mysql -uwp_user -p123 -h10.0.0.6 -P3307
redis端口转发
[root@lb02 stream.d]# cat stream.conf
stream {
  upstream redis_6379 {
    server 172.16.1.51:6379;
  }
  
  server {
    listen 7777;
    proxy_pass redis_6379;
  }
}
  
[root@db01 ~]# redis-cli -a 123 -h 10.0.0.6 -p 7777
10.0.0.6:7777> KEYS *
(empty list or set)









