一、四层负载均衡(TCP层)

1.1 什么是四层负载均衡

所谓四层就是基于IP+端口的负载均衡,它通过用户请求的端口来决定将请求转发至哪台后端服务器。就是通过第三层(网络层)的IP地址并加上四层(传输层)的端口号,来决定哪些流量需要做负载均衡。对需要负载均衡的流量进行NAT转换,然后转发至后端服务器节点,并记录这个TCP或者UDP的流量是由哪台后端服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理。

1.2 四层负载均衡应用场景

  1. 端口代理。首先http当然是最常用的一种协议,但是还是有很多非http的应用(mysql、redis、ssh),只能用四层代理
  2. 四层负载均衡+七层负载均衡,实现大规模集群架构。其次七层代理需要CPU运算,所以单台机器很难做到很高的处理能力,因此需要在七层负载均衡前面再加四层负载均衡。(提高网站的访问效率,并保证了七层负载均衡的高可用性。)
    在这里插入图片描述

1.3 四层负载均衡优缺点

1.四层负载均衡通常用来转发非http应用:如 tcp/80 tcp/443 tcp/3306 tcp/22 udp/53
2.四层负载均衡可以解决七层负载均衡高可用性的问题。( 多个七层负载均衡同时提供服务 )
3.四层负载均衡可以解决七层负载均衡端口数限制问题。(七层负载均衡最多能使用的端口是5w)
4.四层转发效率远比七层代理的效率高的多,但是他只能支持tcp/ip协议,所以他的功能较弱,虽然七层效率不高,但他支持http/https这样的应用层协议。

1.4 nginx四层与LVS四层的区别

在这里插入图片描述

在这里插入图片描述

二、四层负载均衡场景实践

2.1 配置示例

基于TCP的四层负载均衡配置文件不能配置http层,需要在 /etc/nginx/nginx.conf文件中配置(负载均衡主机ip :10.0.0.9)

[root@web03 nginx]# cat nginx.conf 

user  www;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


# 需要包裹在stream中
stream {
	upstream backend {
	server 172.16.1.51:3306;	
	server 172.16.1.5:3306;
	}

	server {
		listen 3366;
		proxy_pass backend; # tcp代理
	}
}

....

然后找两台安装过mariadb的主机,授权远程连接用户为mysql 密码123456,两台主机都执行如下命令

MariaDB [(none)]> grant all privileges on *.* to 'mysql'@'%' identified by '123456';

随便找一台安装了mariadb客户端的主机,测试

[root@web04 wordpress]# mysql -h 10.0.0.9 -u"mysql" -P 3366 -p"123456"
MariaDB [(none)]> select @@hostname
    -> ;
+------------+
| @@hostname |
+------------+
| db01       |
+------------+
1 row in set (0.00 sec)

MariaDB [(none)]> exit
Bye
[root@web04 wordpress]# mysql -h 10.0.0.9 -u"mysql" -P 3366 -p"123456"
MariaDB [(none)]> select @@hostname;
+------------+
| @@hostname |
+------------+
| lb01       |
+------------+
1 row in set (0.00 sec)

可以看到,他们轮询的调度到集群的不同的主机。

2.2 实现TCP协议负载均衡

前端四层负载均衡(TCP)+后端七层负载均衡(HTTP)+应用节点
1.配置nginx四层负载均衡
不能配置在http层。

stream {
	upstream lb_cluster {  # lb集群
		server 172.16.1.4:80;
		server 172.16.1.5:80;
		server 172.16.1.6:80;
	}
	
	server {
		listen 999;
		proxy_pass lb_cluster;
	}
}

七层配置:

upstream web {
	server 172.16.1.7;
	server 172.16.1.8;
	server 172.16.1.9;
}

server {
	listen 80;
	server_name proxy.oldxu.net;
	
	location / {
		proxy_pass http://xx;
		include proxy_params;
	}
}

2.3 基于端口映射,实现跳板机

stream {
        server {
                listen 6666; # 只要ssh远程连接匹配到我的6666 我就跳转到 172.16.1.7:22
                proxy_pass 172.16.1.7:22;
        }
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐