4层负载均衡
什么是四层负载均衡?
`四层负载均衡是基于传输层协议包来封装的 (如:TCP/IP),那我们前面使用到的七层负载均衡指的是应用层,它的组装在四层的基础之上,无论四层还是七层都是指的OSI网络模型。
四层负载均衡应用场景
#1.四层+七层来作负载均衡,4层可以保证7层的负载均衡的高可用性。如:nginx就无法保证自己的服务高可用,需要依赖lvs或者keepalive来作。
#2.如:tcp协议的负载均衡,有些请求是TCP协议的(mysql、ssh),或者说这些请求只需要使用4层进行端口的转发就可以了,所以使用4层负载均衡。
比如做:mysql读的负载均衡(轮询)
比如做:端口映射、端口转发 tcp/udp
四层+七层构建大规模集群架构使用场景
`四层负载均衡是基于传输层协议包来封装的 (如:TCP/IP),那我们前面使用到的七层负载均衡指的是应用层,它的组装在四层的基础之上,无论四层还是七层都是指的OSI网络模型。
#1.四层+七层来作负载均衡,4层可以保证7层的负载均衡的高可用性。如:nginx就无法保证自己的服务高可用,需要依赖lvs或者keepalive来作。
#2.如:tcp协议的负载均衡,有些请求是TCP协议的(mysql、ssh),或者说这些请求只需要使用4层进行端口的转发就可以了,所以使用4层负载均衡。
比如做:mysql读的负载均衡(轮询)
比如做:端口映射、端口转发 tcp/udp
四层负载均衡总结
`1.四层负载均衡仅能转发TCP/IP协议、UDP协议,通常用来转发端口,如: tcp/3306,tcp/22,udp/53。
`2.四层负载均衡可以用来解决七层负载均衡的端口限制问题。(七层负载均衡最大使用65535个端口号)
`3.可以用来解决七层负载均衡的高可用问题。(多台后端七层负载均衡能同时的使用)
`4.四层的转发效率比七层的高的多,但仅支持tcp/ip协议,不支持http或者https协议
`5.通常大并发场景会选择在七层负载前面加上四层负载均衡
tcp的负载均衡说的就是4层
http的负载均衡说的就是7层
7层负载均衡只能做http协议相关的
4层负载均衡只能做tcp协议相关的 ip+端口转发
四层负载均衡场景实现
lb-4层 10.0.0.3
lb-7层 10.0.0.5 172.16.1.5
lb-7层 10.0.0.6 172.16.1.6
nfs
mysql
redis
1.在lb02上面安装Nginx
[root@lb02 ~]# cat /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
[root@lb02 ~]# yum install nginx -y
2.在lb02上面拷贝lb01的所有nginx相关配置即可
保持高度一致
[root@lb02 ~]# scp -rp root@172.16.1.5:/etc/nginx /etc/
3.启动nginx
[root@lb02 conf.d]# nginx -t
[root@lb02 conf.d]# systemctl start nginx
[root@lb02 conf.d]# systemctl enable nginx
4.域名解析
10.0.0.6 php.oldboy.com zh.oldboy.com blog.oldboy.com
\'查看5能不能登录之前的网站了 php.oldboy.com zh.oldboy.com blog.oldboy.com
\'发现知乎打不开网页了 报错502
\'这个时候先排查是web01 还是web02有错 down一台机器就行
\'找到web02出错
[root@web02 ~]# vim /etc/php.ini
/session
\'把之前那个auto改成0就好了
\'换成6 也能登录网页
5.配置nginx四层负载均衡
配置可以看官网 怎么配置
stream --with-stream 这个模块必须有
[root@lb03~]# cat /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
[root@lb03~]# yum install nginx -y
[root@lb03~]# vim /etc/nginx/nginx.conf
events {
....
}
include /etc/nginx/conf.c/*.conf;#在这个文件的这两行中间加上这段话
http {
.....
}
`创建存放四层负载均衡配置的目录
[root@lb03 ~]# rm -f /etc/nginx/conf.d/default.conf #删除http的80端口 因为四层不做http
[root@lb03 ~]# mkdir /etc/nginx/conf.c
[root@lb03 ~]# cd /etc/nginx/conf.c
[root@lb03 conf.c]# cat lb_domain.conf
stream { #官网配置模块
upstream lb {
server 172.16.1.5:80 weight=5 max_fails=3 fail_timeout=30s;
server 172.16.1.6:80 weight=5 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
proxy_connect_timeout 3s;
proxy_timeout 3s;
proxy_pass lb; #直接给资源池名字 不用带http://了
}
}
[root@lb03 conf.c]# nginx -t
[root@lb03 conf.c]# systemctl restart nginx
[root@lb03 conf.c]# systemctl enable nginx
域名解析
10.0.0.4 zh.oldboy.com web.oldboy.com php.oldboy.com blog.oldboy.com
刷新
[root@lb01 ~]# tail -f /var/log/nginx/access.log
[root@lb02 ~]# tail -f /var/log/nginx/access.log
\'查看日志 发现两边是轮询登录网站的
使用nginx四层负载均衡实现tcp的转发
请求负载均衡 5555 ---> 172.16.1.7:22;
请求负载均衡 6666 ---> 172.16.1.51:3306;
[root@lb03 ~]# 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;
}
}
nginx四层负载均衡记录日志
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;
}
日志展示效果
10.0.0.1 59129 - [23/Jan/2019:12:11:40 +0800] 200 TCP "172.16.1.5:80" "0" "0.000"
10.0.0.1 59124 - [23/Jan/2019:12:11:41 +0800] 200 TCP "172.16.1.6:80" "1298" "0.000"
10.0.0.1 59145 - [23/Jan/2019:12:11:44 +0800] 200 TCP "172.16.1.6:80" "1316" "0.001"
10.0.0.1 59598 - [23/Jan/2019:12:22:03 +0800] 200 TCP "10.0.0.7:22" "2213" "0.001"
10.0.0.1 59672 - [23/Jan/2019:12:23:51 +0800] 200 TCP "10.0.0.7:22" "2893" "0.001"
10.0.0.1 59698 - [23/Jan/2019:12:26:43 +0800] 200 TCP "10.0.0.7:22" "3309" "0.000"