Lvs详md


原文链接: Lvs详md

LVS 集群中的术语
LVS工作在网络的第四层,内核的tcp/ip栈上,这也决定了它在所有负载均衡软件中性能是最好的。

LVS主要由两部分组成,一个是工作在用户空间的ipvsadm,另一个是工作在内核上的ipvs。ipvsadm主要负载管理集群服务,包括添加、删除、修改集群服务、对数据包进行监控等,真正起到负载均衡的是ipvs。ipvs主要监听在INPUT钩子函数中,一旦发现用户请求的是集群服务,ipvs会将数据包forward到POSTROUTING的钩子函数上,然后转发给后端的realserver.

LVS的几个重要角色和术语:

    前端调度器(Director):主要负责将用户的请求转发到后端的realserver。

    后端服务器(realserver):运行用户服务器的服务器,如httpd,tomcat等。

    VIP:可以理解为对外的ip,用户就是根据这个ip访问集群服务。

    DIP:一般为Director的内网ip。

    RIP:一般为realserver的内网ip。


LVS主要的工作模式有:NAT(地址转换),DR(直接路由),TUN(ip隧道技术)。下面主要简单搭建下基于NAT模式的LVS集群,暂时不包括高可用功能。
  • VS: Virtual Server, Director,Dispatcher(调度器),Load Balancer
  • RS: Real Server(LVS),upstream server(nginx),backend server(haproxy)
  • CIP: Client IP
  • VIP: Virtual Server IP(VS 外网 IP)
  • DIP: Director IP(VS 内网 IP)
  • RIP: Real Server IP

访问流程: CIP <—> VIP <===> DIP <—> RIP

LVS: ipvsadm/ipvs

ipvsadmin: 用户空间的命令行工具,规则管理器。用于管理集群服务及 Real Server

ipvs: 工作于内核空间 netfilterINPUT 钩子上的框架

LVS 集群类型

  • LVS-NAT: 修改请求报文的目标 IP,多目标 IP 的 DNAT
  • LVS-DR: 操纵封装新的 MAC 地址
  • LVS-TUN: 在原请求 IP 报文之外新加一个 IP 首部
  • LVS-FULLNAT: 修改请求报文的源和目标 IP(kernel 默认不支持,需要自行编译)

LVS-NAT

本质是多目标 IP 的 DNAT,通过将请求报文中目标地址和目标端口修改为某选出的 RS 的 RIP 与 PORT 实现转发

1)RIP 和 DIP 必须同在一个 IP 网络,且应该使用私网地址;RS 的网关要指向 DIP

2)请求报文和响应报文都必须经由 Director 转发,Director 容易成为系统瓶颈

3)支持端口映射,可修改请求报文的目标 PORT

4)VS 必须是 Linux 系统,RS 可以是任意 OS

LVS-DR

LVS-DR(Direct Routing),直接路由,LVS 默认模式,应用最广泛,通过为请求报文重新封装一个 MAC 首部进行转发,源 MAC 是 DIP 所在的接口的 MAC,目标 MAC 是某挑选出的 RS 的 RIP 所在接口的 MAC 地址;源 IP 和 PORT 以及目标 IP 和 PORT 均保持不变

Director 和各个 RS 都配置有 VIP

1)确保前段路由器将目标 IP 为 VIP 的请求报文发往 Director

前端网关做静态绑定 VIP 和 Director 和 MAC 地址

在 RS 上使用 arptables 工具

在 RS 上修改内核参数以及限制 arp 通告及应答级别

arp_announce

arp_ignore

2)RS 的 RIP 可以使用私网地址,也可以是公网地址;RIP 与 DIP 在同一 IP 网络;RIP 的网关不能指向 DIP,以确保响应报文不会经由 Director

3)RS 和 Director 要在同一物理网络

4)请求报文要经由 Director,但响应报文不经由 Director,而由 RS 直接返回给 Client

5)不支持端口映射(端口不能修改)

6)RS 可以使用大多数 OS

LVS-TUN

不修该请求报文的 IP 首部(源 IP 为 CIP,目标 IP 为 VIP),而是在原 IP 报文之外再分装一个 IP 首部(源 IP 为 DIP,目标 IP 为 RIP),将报文发给选出的目标 RS;RS 处理后直接返回给客户端(源 IP 为 VIP,目标 IP 为 CIP)

1)DIP,VIP,RIP 都应该是公网地址

2)RS 的网关不能,也不可能指向 DIP

3)请求报文要经由 Director,但响应不能经由 Director

4)不支持端口映射

5)RS 的 OS 必须支持隧道功能

LVS-FULLNAT

通过同时修改请求报文的源 IP 地址和目标 IP 地址进行转发

1)VIP 是公网地址,RIP 和 DIP 是私网地址,且通常不再同一 IP 网络;因此,RIP 的网关一般不会指向 DIP

2)RS 收到的请求报文源地址是 DIP ,因此,只需要响应给 DIP;但 Director 还要将其发往 Client

3)请求和响应报文都经由 Director

4)支持端口映射;

lvs核心概念

1. LVS/DR如何处理请求报文的,会修改IP包内容吗?

1.1 vs/dr本身不会关心IP层以上的信息,即使是端口号也是tcp/ip协议栈去判断是否正确,vs/dr本身主要做这么几个事:

1)接收client的请求,根据你设定的负载均衡算法选取一台realserver的ip;

2)以选取的这个ip对应的mac地址作为目标mac,然后重新将IP包封装成帧转发给这台RS;

3)在hash table中记录连接信息。

vs/dr做的事情很少,也很简单,所以它的效率很高,不比硬件负载均衡设备差多少。

数据包、数据帧的大致流向是这样的:client --> VS --> RS --> client

1.2 前面已作了回答,vs/dr不会修改IP包的内容.

2. RealServer为什么要在lo接口上配置VIP?在出口网卡上配置VIP可以吗?

2.1 既然要让RS能够处理目标地址为vip的IP包,首先必须要让RS能接收到这个包。

在lo上配置vip能够完成接收包并将结果返回client。

2.2 答案是不可以将VIP设置在出口网卡上,否则会响应客户端的arp request,造成client/gateway arp table紊乱,以至于整个load balance都不能正常工作。

3. RealServer为什么要抑制arp帧?

这个问题在上一问题中已经作了说明,这里结合实施命令进一步阐述。我们在具体实施部署的时候都会作如下调整:

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

我相信很多人都不会弄懂它们的作用是什么,只知道一定得有。我这里也不打算拿出来详细讨论,只是作几点说明,就当是补充吧。

3.1

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce

这两条是可以不用的,因为arp对逻辑接口没有意义。

3.2 如果你的RS的外部网络接口是eth0,那么

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

其实真正要执行的是:

echo "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/eth0/arp_announce

所以我个人建议把上面两条也加到你的脚本里去,因为万一系统里上面两条默认的值不是0,那有可能是会出问题滴。

4. LVS/DR load balancer(director)与RS为什么要在同一网段中?

从第一个问题中大家应该明白vs/dr是如何将请求转发给RS的了吧?它是在数据链路层来实现的,所以director必须和RS在同一网段里面。

  1. 为什么director上lo接口除了VIP另外还要在eth0配一个ip(即DIP)?

5.1 如果是用了keepalived等工具做HA或者Load Balance,则在健康检查时需要用到DIP。

5.2 没有健康检查机制的HA或者Load Balance则没有存在的实际意义。

  1. LVS/DR ip_forward需要开启吗?

不需要。因为director跟realserver是同一个网段,无需开启转发。

  1. director的vip的netmask一定要是255.255.255.255吗?

lvs/dr里,director的vip的netmask 没必要设置为255.255.255.255,也不需要再去

route add -host $VIP dev eth0:0

director的vip本来就是要像正常的ip地址一样对外通告的,不要搞得这么特殊.

  1. LVS/DR如何进行tcp的三次握手?


相信一般的小公司用的最多的还是DR和NAT模式,关于DR和NAT模式的原理请看看下图,我们先从lvs的DR和NAT模式特性聊聊一些问题。
图片描述
图片描述

问题1、lvs的DR模式和NAT模式核心缺陷有哪些?
DR模式的缺陷
1:Realserver和 lvs的vip提供服务的端口必须一致。
也就是说:vip的端口对外端口为 80,但后端服务的真实端口为8080,通过lvs的DR模式是实现不了的。
2:Realserver和LVS不能在同一台机器上
3: Realserver 和LVS需要在同一个vlan或者局域网下。
NAT模式的缺陷
1:NAT模式流量的入和出都需要通过LVS服务器。
2: 效率相比DR模式,性能和效率上会差一些。

为什么呢?别着急如果你不太了解,下面来解释为什么?

问题2、为什么Realserver和 lvs,vip提供服务的端口必须一致?
原因:因为LVS的DR模式,改写的就是数据包的目的MAC地址,并不会对数据报文IP和端口地址层修改,所以就作不到端口改写了。

问题3、为什么DR模式下,Realserver和LVS不能在同一台机器上?
原因:假设lvs主服务器上的数据包发送给自己备份节点(也是realserver) eth0 接口。备lv不能正常的被监听指定端口的程序所接收,因为数据包会首先先经过 ip_vs()来接受处理了.
不仅如此,备份节点还会将50%的机率将数据包转发给lvs主,这样一直主和备一直转发,就形成死循环了。所以客户端会发现,一次正常能请求,一次会出现
超时的情况。

问题4、为什么DR模式下,Realserver 和LVS需要在同一个vlan或者局域网下?
原因:LVS的是改写mac地址的,基于mac地址的通讯方式是2层的,所以需要限制在一个vlan或者局域网下。

问题5、为什么NAT模式下,NAT模式流量的入和出都需要通过LVS服务器?
原因:NAT模式修改的目的端的IP地址,对公网的VIP,并不会下放到realserver上,所以后端的realserver的网关必须指向lvs地址。

问题6、为什么效率相比DR模式,性能和效率上会差一些?
原因:原因和NAT模式的特性一样,出入的数据包都需要通过lvs,必然导致数量大了后,成为性能瓶颈。

`