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: 工作于内核空间 netfilter
的 INPUT
钩子上的框架
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在同一网段里面。
- 为什么director上lo接口除了VIP另外还要在eth0配一个ip(即DIP)?
5.1 如果是用了keepalived等工具做HA或者Load Balance,则在健康检查时需要用到DIP。
5.2 没有健康检查机制的HA或者Load Balance则没有存在的实际意义。
- LVS/DR ip_forward需要开启吗?
不需要。因为director跟realserver是同一个网段,无需开启转发。
- 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地址一样对外通告的,不要搞得这么特殊.
- 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,必然导致数量大了后,成为性能瓶颈。