欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LVS负载均衡DR模式的搭建过程(不用keepalived)

程序员文章站 2024-03-21 17:36:46
...

LVS简介

LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。其他的内容在这里就不做过多赘述,网上的文章也比较多,本文主要介绍DR模式的手动搭建的详细过程。

LVS三种模式的比较

专有名词的定义

开始之前,我们先把后面将要用到的一些专属概念说一下:
CIP: 是客户端的IP
VIP:是LVS的接收IP – virtual IP
DIP:是LVS的分发IP – distribute IP
RIP 是真实目标服务器IP – Real IP
我们以下面的图简单说一下:
LVS负载均衡DR模式的搭建过程(不用keepalived)

1.NAT模式

NAT模式,英文全称为Network Address Translation,即网络地址转换,其实说白了,就是通过改变3层中的IP,使得内网IP的客户端能够访问公网,公网的数据也能返回到内网的客户端上。我们现在家里用的路由器就是这种模式,多个设备连接一个路由器机进行上网。关于它的概念,网上的资料也很多,我们主要说一下整个流程图和问题。

请看我下面画的一个简单的NAT模式的流程图

LVS负载均衡DR模式的搭建过程(不用keepalived)
其中,黑色箭头代表请求的过程,绿色代表响应结果返回的过程,红色代表此路不通。

图中解释

上图演示的是客户端CIP请求负载均衡的VIP,即封了个包,包中的源IP是CIP,目标IP是VIP,但问题也就出现在这。既然我们要做负载均衡,那么这个数据包就要转发的后面的server端,可能到server1,也可能到server2,但是通过网络知识我们,这个数据包是不可能到达server,因为目标地址不是RIP,而是VIP,所以这时候就需要负载均衡服务器将VIP换成RIP,然后通过DIP发到RIP(即数据包变为:VIP-RIP);同理,响应返回的时候,数据包中的ip为(RIP->CIP),但是这个数据包是无论如何也不可能直接到达CIP的,所以需要负载均衡服务器再把RIP换成VIP,数据包中的ip就变为(VIP->CIP),这样就能找到CIP,正确返回了。
(如果不明白为什么,可能需要补充一下网络知识)

NAT模式的一些问题

  1. 非对称性,由于请求与响应的数据量不对称,一般发送请求时所带的数据量少,响应时返回的数据量多,所以服务器带宽是瓶颈(因为请求和响应要经过负载均衡)。这就像我们通过userId查询user的所有信息,请求只有一个userId,而响应返回的数据却是整个用户信息(如姓名,年龄、住址等等);
  2. 消耗计算机的cpu。从上面的图中我们可以到,在请求的过程中,要将VIP转换成RIP,在响应的时候,也要将RIP转换成VIP.
  3. 要求server端的网关要指向负载均衡服务器

2.DR模式

1,什么是DR模式?

从上面的NAT模式,我们看到有不少弊端,那么怎么进一步改进呢?有没有更好的方式呢?那首先我们要明白,要改进的是什么呢?大家思考一下,如果能够让RIP可以直接返回到CIP,就解决了上面的问题,即不需要进行VIP和RIP之间的更换,同时,响应的数据包也不需要再经过负载均衡器返回了。懂一点网络知识的人我们都知道,要想RIP直接返回到CIP,这是不可能的,我不可能把server1、server2和负载均衡服务器的VIP设置成一样的,这样就冲突了。那怎么办呢?其实想一想,如果我们能让VIP在server1和server2中对内可见,对外隐藏,就能够直接解决问题了。对于我们写程序的来说,平时我们开发中,最常用的可能就是localhost了,对了,就是这个LO回环接口,我们可以在回环接口中配一个子接口,使得ip地址和VIP地址一样,这就是我们所说的DR模式。
DR模式:英文全称为Virtual Server via Direct Routing,即直接路由模式。

2.DR模式的拓扑图

LVS负载均衡DR模式的搭建过程(不用keepalived)

图中解释

上图演示的是客户端CIP请求负载均衡的VIP,即封了个包,包中的源IP是CIP,目标IP是VIP,那么为了让这个包只经过负载均衡器的转发就能到达server1和server2,我们利用回环接口,在server1和server2中隐藏了一个VIP,这样响应的包也就成了VIP到CIP了,显然是能够到达的。

DR模式小结

  1. 它是基于二层的MAC地址欺骗,速度快,成本低;
  2. 但是它要求负载均衡服务器要和server端在同一个局域网内。

3.TUN(隧道)模式

1,什么是隧道模式?

从上面的DR模式我们可以看出,它的弊端就在于负载均衡服务器要和server端处在同一个局域网下,那怎么解决这个问题呢?那就是IP隧道(IP tunning)。IP隧道(IP tunning)是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的VIP地址的数据包封装,通过隧道转发给后端的真实服务器(Real Server),通过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务器的IP地址及对应端口),LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后直接给客户端主机响应数据。

2.TUN模式的图谱图

LVS负载均衡DR模式的搭建过程(不用keepalived)
至于隧道模式,这里就不做过多解释了,对于中小型的企业,一般采用DR模式就足够了,我们这里也是主要讲DR模式。

LVS的DR模式搭建

1.实验物料及流程图

由于条件有限,我用电脑搭建了3台虚拟机,装的系统是Centos7,虚拟机网络采用的NAT模式。大家如果想做实验的话,可以参考我的上一篇博客,VMware虚拟机下安装CentOS(NAT模式)
LVS负载均衡DR模式的搭建过程(不用keepalived)
1.我使用3台服务器,其中n1做负载服务器,n2和n3作为server端
2.CIP:192.168.15.3,即我宿主机vmnet网卡上设置的ip地址
3.VIP:192.168.15.100,即n1上eth0:1这个往卡上的ip地址
4.DIP:192.168.15.61,即n1上的eth0网卡的地址
5.RIP:n2上的IP:192.168.15.62 n3上的地址:192.168.15.63
6.网关是192.168.15.2
7.黑色箭头代表请求,红色箭头代表响应

2.写在实验前面的话

1.server端隐藏VIP的方法

我们要做的VIP对内可见,对外隐藏,就需要修改内核中的参数:
arp_ignore:定义接收到ARP请求时的响应级别(对ARP不了解的,请自行百度)
0:只要本地配置的有相应的地址,就予以响应
1:仅在请求的目标(MAC)地址配置请求到达接口上的时候才给予响应
arp_announce:定义将自己地址向外通告时的通告级别;
1.将本地任何接口上的任何地址向外通告
2.试图仅向目标网络通告与其网络匹配的地址
3.仅向与本地接口上地址匹配的网络进行通告
先然,我们将arp_ignore设置成1,把arp_announce设置成2就可以了。

同时还要在lo环卫接口上配置子接口VIP,lo是个虚拟网卡,是内核中的一个模块,并且是优先级最高的

2.调度算法

1.四种静态调度算法
       rr:轮询,按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是实现简单。轮询算法假设所有的服务器处理请求的能力都一样的,调度器会将所有的请求平均分配给每个真实服务器。
       wrr:加权轮询,对轮询算法的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,如果服务器A的权值为1,服务器B的权值为2,则调度器调度到服务器B的请求会是服务器A的两倍。权值越高的服务器,处理的请求越多。
       dh:目标地址散列调度,先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空。
       sh:源地址散列调度,先根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同,它的算法流程与目标地址散列调度算法的基本相似。
2.动态调度算法
		lc:最小连接,是把新的连接请求分配到当前连接数最小的服务器。最小连接调度是一种动态的调度算法,它通过服务器当前活跃的连接数来估计服务器的情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中断或者超时,其连接数减1。
		wlc:加权最少连接,是最小连接调度的超集,各个服务器相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
		sed:最短期望延迟,基于WLC算法,根据权重最期望,选择期望做小的一个。
		nq:最少队列,即无需队列,如果有realserver的连接数等于0就直接分配过去,不需要在进行SED运算。
		LBRC:基于本地的带复制功能的最少连接,针对目标IP地址的负载均衡,目前主要用于Cache集群系统。
至于详细的说明,请大家查找相关的资料自行学习。

3.ipvs模块

1.简介

lvs在linux系统是在内核中,叫ipvs内核模块,要用lvs,所以不需要安装了。
但是需要安装一个外部的用户接口程序,ipvsadm
yum install ipvsadm -y

2.管理集群输入(请求)服务
添加:-A -t|u|f service-address [-s scheduler]
-t:TCP协议的集群
-u:UDP协议的集群
service-address:IP:port
-f:FWM:防火墙标记
service-address:Mask Number
修改:-E
删除:-D -t|u|f service-address
ipvsadm -A -t 192.168.15.100:80 -s rr
3管理集群输出(响应)服务
添加:-a -t|u|f service-address -r server-address[-g|i|m][-w weiht]
-t|u|f service-address:事先定义好的某集群服务
-r server-address:某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射;
[-g|i|m]:LVS类型
-g:DR
-i:TUN
-m:NAT
[-w weiht]:定义服务器权重
修改:-e
删除:-d -t|u|f service-address -r server-address
#ipvsadm -a -t 192.168.15.100:80 -r 192.168.15.12 -g
#ipvsadm -a -t 192.168.15.100:80 -r 192.168.15.13 -g
4.查看ipvs负载情况
-L|l
-n:数字格式显示主机地址和端口
--stats:统计数据
--rate:速率
--timeout:显示tcp、tcpfin和udp的会话超时时长
-c:显示当前ipvs连接状况
5.删除集群服务
-C:清空ipvs规则
保存规则
-S
#ipvsadm -S > /path/to/somefile
载入此前的规则
-R
#ipvsadm -R </path/from/somefile   

3.开始安装

1.配置网络

  1. 配置每个机器的ip地址(在虚拟机安装时,已经配置好了)
  2. 配置lvs负载均衡服务器的VIP,即在n1上配置:
    ifconfig eth0:2 192.168.15.100/24
    这时候如果觉得自己配错了,可以给它down掉,命令如下:
    #ifconfig eth0:2 down
    如下图:
    LVS负载均衡DR模式的搭建过程(不用keepalived)
  3. 配置n2上的隐藏VIP
    1.首先要先设定arp_ignore和arp_announce,使其能够隐藏起来
    # cd /proc/sys/net/ipv4/conf/eth0/
    LVS负载均衡DR模式的搭建过程(不用keepalived)
    注意:不要用vi arp_ignore这个命令去改,要用echo
# echo 1 > arp_ignore
# echo 2 > arp_announce

LVS负载均衡DR模式的搭建过程(不用keepalived)
上面改的是eth0这个接口,下面我们到all目录下,把所有接口都改一下
LVS负载均衡DR模式的搭建过程(不用keepalived)
2.改完协议,就开始配置n2上的VIP,VIP要配置到LO环回接口

# ifconfig lo:2 192.168.15.100 netmask 255.255.255.255

LVS负载均衡DR模式的搭建过程(不用keepalived)
这里有一个问题,就是掩码为什么是255.255.255.255而不是255.255.255.0?
因为ip和掩码进行一次与运算,如果掩码是255.255.255.0,那么得出的网络号就是192.168.15.0,那么它就和eth0一样,走LO也可以访问整个局域网,但是由于它是在LO这个接口,靠近内核,会先走LO这个接口,但LO又不能向外转发,所以会导致包永远发布出去。但如果掩码是255.255.255.255,与192.168.15.100做与运算,得出的网络号是192.168.15.1,这样就能走eth0这个接口。包就发出去了,规避了死循环这个风险。
4. 配置n3上的隐藏VIP,这与n2上的配置一致,不再赘述。

2.安装配置服务器中的httpd服务(n2和n3中)

1.安装静态服务器httpd

 # yum install httpd -y

2.创建一个主页
在n2上:vi /var/www/html/index.html
内容填充为 I come from server1 192.168.15.62
在n3上:vi /var/www/html/index.html
内容填充为 I come from server2 192.168.15.63
3.启动httpd服务
systemctl start httpd.service
4.验证
这时候用浏览器访问下http://192.168.15.62 和http://192.168.15.63,如果不通,可能是防护墙没有关 ,可以用如下命令关闭防火墙:
查看防火墙状态 systemctl status firewalld
关闭防火墙 systemctl stop firewalld
5.注意
按理说两个主页应该一样,但是我们这里为了测试,所以设置为不一样的,方便观察测试结果

3.LVS负载均衡服务器安装和配置

  1. 安裝ipvsadm
 yum install ipvsadm -y
  1. 配置转发规则
    入包规则
    ipvsadm -A -t 192.168.15.100:80 -s rr
    出包规则
    bash ipvsadm -a -t 192.168.15.100:80 -r 192.168.15.62 -g -w 1 ipvsadm -a -t 192.168.15.100:80 -r 192.168.15.63 -g -w 1
    LVS负载均衡DR模式的搭建过程(不用keepalived)
  2. 验证
    1.浏览器访问 http://192.168.15.100/ 连续间隔刷新,可以看到一会负载到server1,一会负载到server2
    LVS负载均衡DR模式的搭建过程(不用keepalived)
    LVS负载均衡DR模式的搭建过程(不用keepalived)
    2.在n1上,查看是否有socket连接
    netstat -natp
    LVS负载均衡DR模式的搭建过程(不用keepalived)
    从图中可以看到,没有80端口的socket连接,也就是说,负载均衡只做了转发,并没有做握手。

注意:如果http://192.168.15.100访问不了,很有可能是防火墙没有关闭,关闭防火墙就可以了。
到此为止,整个安装过程就完成了。但是这个安装是一次性的,只要重启虚拟机n1,那么配置就消失了,需要重新配置。除此之外,我们发现这样的lvs负载均衡服务器是个单点的,那就存在单点故障,并且server端如果有一个故障,lvs负载均衡服务器也不能进行故障server的剔除。所以本文的安装,主要是给大家一个说一个原理。
下一篇文章,我们将基于keepalived来实现高可用的lvs负载均衡DR模式的安装过程。

有写的不正确的地方,希望大家多多指正,目前在我机器上,这样的流程是完全走通了。当然,这中间也还有很多的小细节问题,需要我们慢慢了解。