四层负载均衡

什么是四层负载均衡

基于传输层的负载均衡,协议包来封装的是(TCP/IP)。

四层负载均衡的应用场景

  1. 实现端口转发,ssh、mysql等都是tcp协议请求,只能用tcp方式连接的服务,我们就可以使用四层负载均衡来调度。
  2. 四层结合七层实现大规模集群架构
    原因:
    七层负载均衡能够接受的连接数有限,需要配置多台七层负载均衡
    问题:多台七层如何实现轮询?
    解决:在多台七层负载均衡前面接入四层负载均衡。
    四层可以保证七层负载均衡的高可用性。
    四层负载均衡,不识别域名,只能识别端口,可以在四层结合七层的情况下,四层做端口转发,七层来实现域名的匹配,然后代理到后端web节点。
    四层负载均衡只能转发TCP/UDP/IP协议:如TCP/80 TCP/22 TCP/3306 UDP/53。
    四层负载均衡可以解决七层负载均衡高可用性的问题。(可以多个负载均衡同时提供服务)
    四层负载均衡可以解决七层负载均衡端口数限制问题(七层负载均衡最多能使用的端口是65535)
    四层的转发效率远比七层代理的效率快的多,但是只能支持tcp/ip协议,所以他的功能较弱,虽然七层效率不高,但他支持http/https这样的应用层协议。

nginx四层负载均衡配置

  1. 请求四层负载均衡调度后端七层负载均衡
[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;
	}
}
  1. 配置四层负载均衡 基于端口转发(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;

  1. 四层负载均衡透传真实ip
    环境:四层+七层+七层+web
    配置步骤:

  2. 在四层添加proxy_protocol协议(传递信息携带一个新的tcp头部(包含源IP、源端口等信息))

  3. 在七层负载均衡上添加proxy_protocol协议

  4. 排除七层前面代理的ip地址 (使用set_real_ip_from)

  5. 同时将proxy_protocol协议提取真实ip地址赋值给$remote_addr变量通过x-forward-for。

  6. 第二个七层负载均衡什么都不用配置,只需要开启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 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值