前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >走进LVS负载均衡

走进LVS负载均衡

作者头像
凯哥的Java技术活
发布2022-07-08 14:13:47
4880
发布2022-07-08 14:13:47
举报
文章被收录于专栏:凯哥的Java技术活

背景介绍

说起负载均衡,第一印象无非就是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保证高可用。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 凯哥的Java技术活 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档