背景介绍
说起负载均衡,第一印象无非就是nginx,没错,nginx是一种,但是nginx是七层负载均衡。什么意思?也就是说nginx首先会和每一个客户端进行tcp握手,既然是连接,就一定会消耗资源,在并发环境高的情况下一定会有一些不足。那么有一种办法不和客户端连接而实现负载均衡吗?有的,那就是今天要讲的LVS。
LVS,Linux Virtual Server。其实LVS很早就有了,查看百科发现,它是在1998年就开始了,而且作者是中国人,以前是淘宝网资深技术总监。LVS已经写进linux的内核代码中去了,也就是每一台linux服务器都有一段代码是LVS。
废话不说,我们直接上手!
上手实验
环境准备
South Africa red wine
环境准备:
VMWare软件,配置三台Linux虚拟机。
网络规划
South Africa red wine
网络规划:
这里根据自己虚拟机的IP进行配置,只要能有一台LVS服务器,两台节点服务器。
然后配置各自的IP即可。其中VIP是我们对外的访问地址,是Virtual IP简写。
IP地址 | 角色 | 备注 |
---|---|---|
192.168.181.2 | LVS调度器 | 对外提供服务的VIP 为192.168.181.3 |
192.168.181.4 | 节点服务器 | 真实的服务器1 |
192.168.181.5 | 节点服务器 | 真实的服务器2 |
LVS安装
South Africa red wine
这里安装比较特殊,因为LVS是存在于Linux内核中,我们其实不用安装它,首先我们查询本地有没有开启LVS
执行命令查看是否已加载到内核中
代码语言:javascript复制lsmod | grep ip_vs
如果什么都没有输出,那么就说明没有启用。
安装ipvsadm,这是lvs的客户端工具。
代码语言:javascript复制yum install -y ipvsadm
然后加载ip_vs模块
代码语言:javascript复制ipvsadm
此时再查看模块是否加载
说明已经成功。
LVS 配置VIP
South Africa red wine
我们先在LVS服务器上添加一个VIP。
代码语言:javascript复制ip addr add 192.168.181.3/24 dev ens33 label ens33:1
查看网络配置:
节点服务器环境准备
South Africa red wine
后续为了方便,我们简称节点服务器为RS,也就是Real Server的意思,意味着真正提供服务的机器。
安装nginx服务,进行测试。或者随便其他什么服务,Tomcat也好其他什么东西也罢。
为了展示方便,我们把nginx默认的页面换一下,换成IP地址。去/usr/share/nginx/html/index.html里面直接修改内容,然后在你电脑上访问是否成功。
节点服务器绑定VIP
South Africa red wine
同样的,我们也需要在节点服务器上绑定VIP,但是这次我们绑定在lo上,也就是loopback lo网卡上。
在lo网卡上绑定VIP,这一步是为了不丢弃目的IP为VIP的数据包。
以下作为了解:
为什么要绑定在lo网卡上,因为绑定在物理网卡会产生IP冲突。
这里一定要注意是/32,表示掩码是255.255.255.255,保证物理接口和环回接口不在同一个网段内。
如果配置成了/24,子网掩码是255.255.255.0的话,那么网络号就是192.168.181.0,和物理网卡的网络号相同,这时有两个相同的网段,环回接口的权重又比物理接口的高,就会导致数据包就会在环回接口上数据发送不出去。
抑制ARP
South Africa red wine
在每个节点服务器RS上执行抑制ARP的命令:
代码语言:javascript复制echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
至于什么是抑制ARP,在后面原理部分讲,先不要管那么多。
LVS服务器添加服务
South Africa red wine
切换回LVS服务器中,执行如下命令。
代码语言:javascript复制ipvsadm -A -t 192.168.181.3:80 -s rr
代码语言:javascript复制ipvsadm -a -t 192.168.181.3:80 -r 192.169.181.4:80 -gipvsadm -a -t 192.168.181.3:80 -r 192.169.181.5:80 -g一步是说添加
执行完毕后,也就添加了负载均衡的规则。至于每个命令的含义,可以通过ipvsadm --help进行查看。
执行完毕后,查看结果
进行实验
South Africa red wine
在你浏览器上访问你自己的VIP,刷新后看是否负载均衡成功了。
我的是访问192.168.181.3,成功!对请求进行了轮询的负载均衡。
原理分析
在分析之前,我们先来统一下叫法:
RS:Real Server,节点服务器,提供服务的设备,也就是你自己的代码程序
VIP:Virtual IP,虚拟IP,对外提供服务的IP地址
RIP:Real Server IP,节点服务器的IP地址
CIP:客户端IP
DIP:负载均衡器的IP
上述的LVS负载均衡是使用的DR模式,也就是Direct Route直接路由,最大优点就是节点服务器返回数据包时,不走LVS负载均衡器,直接发回给客户端。最大的缺点是必须在同一个局域网下。
最显著的特点是通过修改目的包的MAC地址实现。
画张图说下
首先,当客户端访问服务时,此时的源IP为CIP,目的IP为VIP。也就是CIP:VIP。
然后,数据包在网络中传输,当到达LVS服务器的时候,LVS服务器在RS中挑选出一台,把数据包的MAC地址修改为RS服务器的MAC地址,然后把这个数据包发送给RS服务器。然后RS服务器再直接发送给客户端。
看似简单,但是这个流程有几点需要解决。
首先是IP的问题,在RS服务器收到数据包后,一看MAC地址是自己的,ok没问题,拆开,但是一看目的IP地址是VIP,但是自己没有VIP,随之就丢弃掉了。
那么我们就必须在RS上绑定一个VIP,也就是我们上面操作的。
这样就保证了VIP不会被丢弃。
但是问题又来了,考虑下图中的问题
这张图上,当数据包在网络中传递,跳到路由器上,然后向后传递的时候,我们知道网络的七层模型,在IP的基础之上,链路层是需要知道mac地址才能后发送的。
那么当客户端的数据包到达路由器后,不知道VIP的mac地址是谁,就需要一个mac地址为全f的ARP广播包,询问VIP的mac地址是什么,这也就是ARP协议。
这时,RS因为有VIP,那么也可能会响应自己的mac地址。就相当于路由器说,VIP给我站起来,这时候RS比LVS先站起来了!这样一来的话路由器就缓存这个mac地址到本地arp映射表,也就是后续每次请求都会找这台RS服务器,完全失去了负载均衡的功能。也就是下面这种情况:
怎么解决?有没有一种方法既配置VIP,又不告诉别人我有VIP?
有,我们进行ARP抑制!
也就是不让RS节点服务器响应ARP广播,就是让lo网卡不响应arp广播。
也就是我们之前执行的:
在进行了这几步操作后,首先我们保证了RS有了VIP,不会丢弃客户端的数据包,又保证了RS不会响应VIP的ARP请求,完成了LVS需要。于是就实现了负载均衡。
我们不是说LVS是四层负载均衡吗?怎么证明呢?
查看连接情况,没有新增连接
然后再看RS的连接情况
看到了吧,LVS并没有进行连接,全部转发给了RS,RS和客户端进行了连接。
总结
通过上述的操作,我们就能搭建起了LVS的DR模式的负载均衡,简单介绍了下原理。你可能会想,如果lvs挂了怎么办,那么我就接下来写一篇文章介绍如何通过keepalived保证高可用。