IPVS(LVS)负载均衡简介及实验测试

1 LVS 简介

LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,现在已经是 Linux标准内核的一部分。LVS是一种叫基于TCP/IP的负载均衡技术,转发效率极高,具有处理百万计并发连接请求的能力。

LVS的IP负载均衡技术是通过IPVS模块实现的。IPVS模块是LVS集群的核心软件模块,它安装在LVS集群作为负载均衡的主节点上,虚拟出一个IP地址和端口对外提供服务。用户通过访问这个虚拟服务(VS),然后访问请求由负载均衡器(LB)调度到后端真实服务器(RS)中,由RS实际处理用户的请求给返回响应。

2 LVS转发模式

根据负载均衡器转发客户端请求以及RS返回响应机制的不同,将IPVS的转发模式分为三种:VS/NAT,VS/DR,VS/TUN

2.1DR模式(Direct Routing)

DR模式下,客户端的请求包到达负载均衡器的虚拟服务IP端口后,负载均衡器不会改写请求包的IP和端口,但是会改写请求包的MAC地址为后端RS的MAC地址,然后将数据包转发;真实服务器处理请求后,响应包直接回给客户端,不再经过负载均衡器。所以DR模式的转发效率是最高的,特别适合下行流量较大的业务场景,比如请求视频等大文件。

DR模式的特点:

  • 数据包在LB转发过程中,源/目的IP端口都不会变化

LB只是将数据包的MAC地址改写为RS的MAC地址,然后转发给相应的RS。

  • 每台RS上都必须在环回网卡上绑定LB的虚拟服务IP

因为LB转发时并不会改写数据包的目的IP,所以RS收到的数据包的目的IP仍是LB的虚拟服务IP。为了保证RS能够正确处理该数据包,而不是丢弃,必须在RS的环回网卡上绑定LB的虚拟服务IP。这样RS会认为这个虚拟服务IP是自己的IP,自己是能够处理这个数据包的。否则RS会直接丢弃该数据包!

  • RS上的业务进程必须监听在环回网卡的虚拟服务IP上,且端口必须和LB上的虚拟服务端口一致

因为LB不会改写数据包的目的端口,所以RS服务的监听端口必须和虚拟服务端口一致,否则RS会直接拒绝该数据包。

  • RS处理完请求后,响应直接回给客户端,不再经过LB

因为RS收到的请求数据包的源IP是客户端的IP,所以理所当然RS的响应会直接回给客户端,而不会再经过LB。这时候要求RS和客户端之间的网络是可达的。

  • LB和RS须位于同一个子网

因为LB在转发过程中需要改写数据包的MAC为RS的MAC地址,所以要能够查询到RS的MAC。而要获取到RS的MAC,则需要保证二者位于一个子网,否则LB只能获取到RS网关的MAC地址。

2.2 NAT模式(Network Address Translation)

NAT模式下,请求包和响应包都需要经过LB处理。当客户端的请求到达虚拟服务后,LB会对请求包做目的地址转换(DNAT),将请求包的目的IP改写为RS的IP。当收到RS的响应后,LB会对响应包做源地址转换(SNAT),将响应包的源IP改写为LB的IP。

NAT模式的特点:

  • LB会修改数据包的地址

对于请求包,会进行DNAT;对于响应包,会进行SNAT。

  • LB会透传客户端IP到RS(DR模式也会透传)

虽然LB在转发过程中做了NAT转换,但是因为只是做了部分地址转发,所以RS收到的请求包里是能看到客户端IP的。

  • 需要将RS的默认网关地址配置为LB的浮动IP地址

因为RS收到的请求包源IP是客户端的IP,为了保证响应包在返回时能走到LB上面,所以需要将RS的默认网关地址配置为LB的虚拟服务IP地址。当然,如果客户端的IP是固定的,也可以在RS上添加明细路由指向LB的虚拟服务IP,不用改默认网关。

  • LB和RS须位于同一个子网,并且客户端不能和LB/RS位于同一子网

因为需要将RS的默认网关配置为LB的虚拟服务IP地址,所以需要保证LB和RS位于同一子网。

又因为需要保证RS的响应包能走回到LB上,则客户端不能和RS位于同一子网。否则RS直接就能获取到客户端的MAC,响应包就直接回给客户端了,不会走网关,也就走不到LB上面了。这时候由于没有LB做SNAT,客户端收到的响应包源IP是RS的IP,而客户端的请求包目的IP是LB的虚拟服务IP,这时候客户端无法识别响应包,会直接丢弃。

2.3 TUNNEL模式

IP隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技 术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。
利用IP隧道技术将请求报文封装转发给后端服务器,响应报文能从后端服务器直接返回给客户。但在这里,后端服务器有一组而非一个,所以我们不可 能静态地建立一一对应的隧道,而是动态地选择一台服务器,将请求报文封装和转发给选出的服务器。这样,可以利用IP隧道的原理将一组服务器上的网络服 务组成在一个IP地址上的虚拟网络服务。各个服务器将VIP地址配置在自己的IP隧道设备上。
它的连接调度和管理与VS/NAT中的一样,只是它的报文转发方法不同。调度器根据各个服务器的负载情况, 动态地选择一台服务器,将请求报文封装在另一个IP报文中,再将封装后的IP报文转发给选出的服务器;服务器收到报文后,先将报文解封获得原来目标地址为 VIP的报文,服务器发现VIP地址被配置在本地的IP隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。

3 IPVS调度算法

3.1 轮叫调度(Round-Robin Scheduling)

轮叫调度(Round Robin Scheduling)算法就是以轮叫的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。

3.2 加权轮叫调度(Weighted Round-Robin Scheduling)

LB会根据RS上配置的权重,将消息按权重比分发到不同的RS上。可以给性能更好的RS节点配置更高的权重,提升集群整体的性能。

3.3 最小连接调度(Least-Connection Scheduling)

最小连接调度(Least-Connection Scheduling)算法是把新的连接请求分配到当前连接数最小的服务器。最小连接调度是一种动态调度算法,它通过服务器当前所活跃的连接数来估计服务 器的负载情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中止或超时,其连接数减一。

3.4 加权最小连接调度(Weighted Least-Connection Scheduling)

加权最小连接调度(Weighted Least-Connection Scheduling)算法是最小连接调度的超集,各个服务器用相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权 值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。

3.5 基于局部性的最少链接(Locality-Based Least Connections Scheduling)

基于局部性的最少链接调度(Locality-Based Least Connections Scheduling,以下简称为LBLC)算法是针对请求报文的目标IP地址的负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群中 客户请求报文的目标IP地址是变化的。这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的 请求调度到同一台服务器,来提高各台服务器的访问局部性和主存Cache命中率,从而整个集群系统的处理能力。

3.6 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)

带复制的基于局部性最少链接调度(Locality-Based Least Connections with Replication Scheduling,以下简称为LBLCR)算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要 维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。对于一个“热门”站点的服务请求,一台Cache 服务器可能会忙不过来处理这些请求。这时,LBLC调度算法会从所有的Cache服务器中按“最小连接”原则选出一台Cache服务器,映射该“热门”站 点到这台Cache服务器,很快这台Cache服务器也会超载,就会重复上述过程选出新的Cache服务器。这样,可能会导致该“热门”站点的映像会出现 在所有的Cache服务器上,降低了Cache服务器的使用效率。LBLCR调度算法将“热门”站点映射到一组Cache服务器(服务器集合),当该“热 门”站点的请求负载增加时,会增加集合里的Cache服务器,来处理不断增长的负载;当该“热门”站点的请求负载降低时,会减少集合里的Cache服务器 数目。这样,该“热门”站点的映像不太可能出现在所有的Cache服务器上,从而提供Cache集群系统的使用效率。

3.7 目标地址散列调度(Destination Hashing Scheduling)

目标地址散列调度(Destination Hashing Scheduling)算法也是针对目标IP地址的负载均衡,但它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。
目标地址散列调度算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

3.8 源地址散列调度(Source Hashing Scheduling)

源地址散列调度(Source Hashing Scheduling)算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法 的相同。它的算法流程与目标地址散列调度算法的基本相似,除了将请求的目标IP地址换成请求的源IP地址。

4 LVS DR实验

4.1 LVS转发流程及原理

客户端发送对VIP的请求,lvs负载到后端某一台server,后端server处理后,直接封包回送客户端,源IP地址一定是lvs上面配的那个公网服务地址,也就后端server要配置这个ip,后端server收到的数据包是lvs没有变动过的(IP:vip),多个server,接入互联网的server持有相同的IP,是不允许的,因此,必须将后端server中的vip隐藏起来(对外隐藏,对自己可见)

4.2 名词解释

VIP: 虚拟服务器地址
DIP: 转发的网络地址
1,和RIP通信:ARP协议,获取Real Server的RIP:MAC地址;
2,转发Client的数据包到RIP上,RIP上要求有VIP(对外隐藏VIP);
RIP: 后端真实主机(后端服务器)
CIP: 客户端IP地址

4.3 隐藏VIP方法

对外隐藏,对内可见

kernel parameter:
目标mac地址为全F,交换机触发广播

# 每个网卡对应一个目录
[root@common conf]# pwd
/proc/sys/net/ipv4/conf
[root@common conf]# ls
all  default  docker0  ens33  ens37  lo  tunl0

arp_ignore: 定义接收到ARP请求时的响应级别;
0:只要本地配置的有相应地址,就给予响应;
1:仅在请求的目标(MAC)地址配置请求
到达的接口上的时候,才给予响应;

arp_announce:定义将自己地址向外通告时的通告级别;
0:将本地任何接口上的任何地址向外通告;
1:试图仅向目标网络通告与其网络匹配的地址;
2:仅向与本地接口上地址匹配的网络进行通告;

4.4 环境准备

lvs 主机:192.168.56.118

RIP主机:也就是需要负载的服务器,192.168.56.101-103

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,后来将lvs嵌入到linux内核,叫做ipvs

4.5 LVS命令

ipvs参数

添加虚拟服务器
    语法:ipvsadm -A [-t|u|f]  [vip_addr:port]  [-s:指定算法]
    -A:添加
    -t:TCP协议
    -u:UDP协议
    -f:防火墙标记
    -D:删除虚拟服务器记录
    -E:修改虚拟服务器记录
    -C:清空所有记录
    -L:查看
添加后端RealServer
    语法:ipvsadm -a [-t|u|f] [vip_addr:port] [-r ip_addr] [-g|i|m] [-w 指定权重]
    -a:添加
    -t:TCP协议
    -u:UDP协议
    -f:防火墙标记
    -r:指定后端realserver的IP
    -g:DR模式
    -i:TUN模式
    -m:NAT模式
    -w:指定权重
    -d:删除realserver记录
    -e:修改realserver记录
    -l:查看
通用:
    ipvsadm -ln:查看规则

保存规则
-S

ipvsadm -S > /path/to/somefile

载入此前的规则:
-R

ipvsadm -R < /path/form/somefile

4.6 LVS主机操作

配置lvs的VIP

[root@common conf]# ifconfig ens37:0 192.168.56.188/24

ens37:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.56.188  netmask 255.255.255.0  broadcast 192.168.56.255
        ether 00:0c:29:1f:1f:e2  txqueuelen 1000  (Ethernet)

确保/proc/sys/net/ipv4/ip_forward 内容是1

echo “1” > /proc/sys/net/ipv4/ip_forward 

调整RS的响应。通告级别(每一台RS都配):

echo 1  > /proc/sys/net/ipv4/conf/ens37/arp_ignore
echo 2  > /proc/sys/net/ipv4/conf/ens37/arp_announce
echo 1  > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2  > /proc/sys/net/ipv4/conf/all/arp_announce

配置RS的VIP(每一台RS都配)

ifconfig lo:8 192.168.56.188 netmask 255.255.255.255

lo:8: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.56.188  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)

启动RS上的httpd

yum install httpd -y

编写测试文件

# vim /var/www/html/index.html  
from masterxxx

启动httpd

[root@k8s-master1 html]# systemctl start httpd

客户端验证:
RIP:80 能显示
VIP:80不能显示

负载服务器安装LVS管理工具—ipvsadm

yum install ipvsadm -y

# 配置规则
ipvsadm -A -t 192.168.56.188:80 -s rr
ipvsadm -a -t 192.168.56.188:80 -r 192.168.56.11 -g 
ipvsadm -a -t 192.168.56.188:80 -r 192.168.56.12 -g
ipvsadm -a -t 192.168.56.188:80 -r 192.168.56.13 -g

# 查看规则
ipvsadm -ln

IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.56.188:80 rr
  -> 192.168.56.11:80             Route   1      0          0         
  -> 192.168.56.12:80             Route   1      0          0         
  -> 192.168.56.13:80             Route   1      0          0       

浏览器刷新: 访问vip:80

[root@common nginx]# ipvsadm -lnc 
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:44  FIN_WAIT    192.168.56.1:57636 192.168.56.188:80  192.168.56.13:80
TCP 01:49  FIN_WAIT    192.168.56.1:57698 192.168.56.188:80  192.168.56.12:80
TCP 01:48  FIN_WAIT    192.168.56.1:57687 192.168.56.188:80  192.168.56.11:80
TCP 01:47  FIN_WAIT    192.168.56.1:57677 192.168.56.188:80  192.168.56.13:80
TCP 01:46  FIN_WAIT    192.168.56.1:57668 192.168.56.188:80  192.168.56.11:80
TCP 00:10  FIN_WAIT    192.168.56.1:56189 192.168.56.188:80  192.168.56.13:80
TCP 14:46  ESTABLISHED 192.168.56.1:51771 192.168.56.188:80  192.168.56.11:80
TCP 01:48  FIN_WAIT    192.168.56.1:57697 192.168.56.188:80  192.168.56.13:80
TCP 01:47  FIN_WAIT    192.168.56.1:57686 192.168.56.188:80  192.168.56.12:80
TCP 01:49  FIN_WAIT    192.168.56.1:57703 192.168.56.188:80  192.168.56.11:80
TCP 01:45  FIN_WAIT    192.168.56.1:57653 192.168.56.188:80  192.168.56.12:80
TCP 14:48  ESTABLISHED 192.168.56.1:54055 192.168.56.188:80  192.168.56.12:80

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是LVS负载均衡从安装到如何配置的详细步骤: 1. 安装LVS LVS分为内核态和用户态两部分,需要分别安装。在LVS负载均衡器和后端服务器上都需要安装用户态部分。 在CentOS系统上,可以使用以下命令安装: ``` yum install ipvsadm -y ``` 2. 配置LVS负载均衡LVS负载均衡器需要配置虚拟服务器、后端服务器负载均衡算法等参数。 - 配置虚拟服务器LVS负载均衡器上,需要配置虚拟IP地址。可以使用以下命令进行配置: ``` ip addr add 192.168.0.100/24 dev eth0 ``` - 配置后端服务器LVS负载均衡器上,需要配置后端服务器IP地址和端口号。可以使用以下命令进行配置: ``` ipvsadm -A -t 192.168.0.100:80 -s rr ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.10:80 -m ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.11:80 -m ``` 其中,-s参数表示使用轮询算法,-r参数表示后端服务器IP地址和端口号,-m表示使用NAT模式。 - 启动LVS 使用以下命令启动LVS服务: ``` service ipvs start ``` 3. 配置后端服务器 在后端服务器上,需要安装并配置应用服务,如HTTP服务器、数据库服务器等。同时,需要将虚拟IP地址配置为LVS负载均衡器上配置的IP地址。可以使用以下命令进行配置: ``` ip addr add 192.168.0.10/24 dev eth0 ``` 4. 配置客户端 在客户端上,需要将域名解析为LVS负载均衡器的虚拟IP地址。可以通过修改/etc/hosts或者DNS服务器进行配置。 以上是LVS负载均衡器的基本安装和配置步骤。需要根据具体的应用场景和需求进行调整,如选择不同的负载均衡算法、设置健康检查等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值