前言
负载均衡旨在解决客户端对服务的请求压力,鉴于此负载均衡常见的方式是基于网络的七层负载均衡合四层负载均衡
一、七层负载均衡
七层负载均衡通常是应用层负载均衡技术,常见的是nginx的负载均衡。其优势在于可以针对具体的应用进行分流、管控,也就是更大的自主性,但缺点也显而易见,就是七层负载已经到了应用层,它所经过的网络层次更多了,也就有了更多的验证过程、数据包的处理过程,这样效率就低了。鉴于nginx的负载均衡已经比较常见,就不多赘述了。
二、四层负载均衡
1.原理
四层负载均衡的就是通过改变数据包的首部进而达到去往不同的后端服务,四层只是概述负载均衡到达了应用层下层,未必是一定运用了四层网络结构。这种分流方式由于没有了握手的过程,负载均衡服务器仅做数据包的转发,不做解析,效率很快。这其中包括基于3层网络结构的D-NET模式,基于2层网络结构的DR模式,还有基于对数据包的封装技术(IP隧道)的TUN隧道模式。
(1)NET模式
NET模式即是通过网络地址转换来完成,准确应该是目标地址的网络转换(D-NET),当客户端请求(CIP->VIP)到达负载均衡服务器时,负载均衡服务器会将VIP替换(CIP->RIP)成后端服务器的IP地址,处理完了数据再将数据包发回(RIP->CIP)负载均衡服务器,由负载均衡服务器再将后端服务器的IP替换成负载均衡服务器的IP,发回(VIP->CIP)客户端。
VIP:暴露给客户端的IP。
DIP:暴露给服务端的IP,一个服务器可以设置多块网卡,DIP所在的网络中就含后端服务。
RIP:后端服务器IP。
除了目标地址转换模型,还有源地址转换模型(S-NET),平时正是通过S-NET模式来上网的,通常我们的电脑只有一个内网IP,路由器会将内网IP转换成一个公网IP,至于保证两台电脑同时访问相同的服务,响应的数据不会出现错乱,就要凭借交换机和路由器的映射记录了
(2)DR模式
DR模式是通过通过修改数据包内IP地址对应的MAC地址来完成分流。具体说就是当负载均衡服务器接收到客户端请求时(CIP->VIP)不替换VIP而是替换MAC地址。这样目标IP未变过,返回就可以直接从后端服务器返回,无需再经过负载均衡服务器。
(3)TUN隧道模式
这种方式说白了就是给原始数据包在套一层衣服,也就是把原始数据包当成IP数据包的内容,重新定义首部,到达服务端时拆除首部。
2. 实现
在此仅以DR模式为例实现。
在实现之前首先要明白一些概念,负载均衡仅是分流请求,对客户端来说服务就是一个,所以对外界服务也只会暴露一个出去,这个服务是负载均衡服务器的服务,真正的后端服务客户端并不知道,但是客户端的响应是后端服务器直接发送出去的,那么响应数据包的源地址就必须是VIP,这样客户端才会受理。因此,要有一个IP(VIP)是后端服务器和负载均衡服务器都有的,而且外网当中只暴露负载均衡服务器的IP,这样就必须把后端服务器的VIP藏起来,只能在负载均衡服务器和后端服务器构成的局域网中可见,对外不可见。要实现这一点,就需要环回地址和arp协议共同配合完成。
实验环境:windows10以及其hyper-v虚拟机管理平台,三台centos8虚拟机。
首先打通三台虚拟机的网络,三台虚拟机要都能访问外网,以为之后安装各种服务准备,实际当中也要能通外网,毕竟要把数据包发回客户端。
第一步:配置负载均衡服务器的VIP,就叫node1
两种方式一种永久性起效,一种临时生效。
永久性起效:增加IP配置文件
/etc/sysconfig/network-scripts目录下除了本来的IP外再新增一个配置文件ifcfg-eth0:1(可以直接拷贝原来的配置文件ifcfg-eth0),重点注意一下几点
临时起效:
ip addr add 192.168.137.100/24 dev eth0
当然也可以把这条写到启动脚本里面rc.local,形成另一种永久有效
第二步:配置两台后端服务器的VIP,就叫node2,node3
两台服务器真实IP:
node2 : 192.168.137.5
node3 : 192.168.137.6
注意这两台服务器的VIP要对外隐藏,对内开放
通过修改arp参数和环回地址可以达成这一步,由于arp参数是内存中的数据,修改后是立即生效的,所以要先改参数,再配置IP。
更改arp_ignore参数,该参数表示对外部发起的arp请求该如何响应。
具体可以参考https://blog.csdn.net/bluehawksky/article/details/93061779
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
更改arp_announce,该参数表示本系统如何对外发送arp请求
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
接下来就是给环回接口配置VIP,
node2:ip addr add 192.168.137.100/24 dev lo
node3:ip addr add 192.168.137.100/24 dev lo
第三步:配置负载均衡策略
在node1上配置负载均衡,lvs负载均衡技术是通过linux内核自带的ipvs模块实现的,我们通过ipvsadm工具来实现对ipvs的控制。
安装ipvsadm工具:dnf install ipvsadm -y
配置负载策略: ipvsadm -A -t 192.168.137.100:80 -s rr
配置j均衡策略:
node2:ipvsadm -a -t 192.168.137.100:80 -r 192.168.137.5 -g -w 1
node3: ipvsadm -a -t 192.168.137.100:80 -r 192.168.137.6 -g -w 1
第四步:搭建,验证服务
在node2,node3上安装web服务验证负载均衡的效果
dnf install httpd -y
systemctl start httpd
在httpd的默认首页目录/var/www/html/index.html下新增一个标识页面然后在宿主机浏览器中直接访问VIP地址
在浏览器中可以看到node2和node3的标识页面会经常性切换,此时在node1中执行ipvsadm -lnc,可以看到负载记录,执行netstat -natp命令没有访问httpd服务的socket连接 ,在node3和node3中执行netstat -natp可以看到访问httpd的socket连接
但是这些操作太繁琐了,有没有一种自动化配置的流程来替代人完成这些配置呢?有,keepalived工具就可以帮助我们完成这些配置。同时keepalived还支持主备模式。
总结
总之,负载均衡只是为了解决客户端并发请求过大的问题,要选择什么样的负载均衡方式还要看业务对哪一方面的要求更高,针对业务适时应用合适的负载均衡模式,甚至要做好随时更换负载方式的准备。