在大规模互联网应用中,负载均衡设备是必不可少的组成部分,源于互联网应用的高并
发和大流量的冲击压力场景下,通常会在服务端部署多个无状态的应用服务器和若干有状态的存储服务器(数据库、缓存等等)实现高可用特点和机制。
LVS 是四层负载均衡,是我们国家著名技术专家:章文嵩博士研发的,也就是说建立在 OSI 模型的第四层——传输层之上,传输层上有我们熟悉的TCP/UDP,LVS支持TCP/UDP的负载均衡。
LVS的转发主要通过修改IP地址(NAT模式,分为源地址修改SNAT和目标地址修改DNAT)、修改目标MAC(DR 模式)来实现。
提供共享存储空间和内容一致性的存储区域;例如:数据库、OSS存储、FS文件服务器等。
返里挑选常用的 DR、NAT、Full-NAT、TUN 来简单介绍一下。
通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变;
请求由LVS接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,返回的时
候不经过 LVS。
DR 模式下需要LVS和绑定同一个 VIP(RS 通过将 VIP绑定在 loopback 实现),此时报文的源IP为CIP,目标IP为VIP;
源地址 | 目的地址 |
---|---|
CIP | VIP |
源MAC地址 | 目的MAC地址 |
---|---|
CIP-MAC | VIP-MAC |
IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址, 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址;
源地址 | 目的地址 |
---|---|
CIP | VIP |
源MAC地址 | 目的MAC地址 |
---|---|
DIP-MAC | RIP-MAC |
由于DS和RS在同一个网络中,所以是通过二层来传输。目标MAC地址为RIP的MAC地址,那么此时数据包将会发至RS。
RS 收到 LVS 转发来的包,链路层发现 MAC 是自己的,到上面的网络层,发现 IP 也是自己的,于是返个包被合法地接受,RS 感知不到前面有 LVS 的存在。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出,此时的源IP地址为VIP,目标IP为CIP;
源地址 | 目的地址 |
---|---|
VIP | CIP |
这种模式下,有几个要点:
主要是这种模式在于,通过LVS只是在请求阶段做转发,而且修改的也不是IP地址,而是MAC地址,针对于修改后的MAC地址会自动转发到对应网段内MAC主机的服务器上面,之后因为IP都没有改变,之后实际RS可以直接发送给目标client服务器,这种性能最好,但是对网络层面要求比较高,对网络扩展角度而言控制力度略低。
多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为选出来的RS的RIP和PORT实现转发。
源地址 | 目的地址 |
---|---|
CIP | VIP |
源地址 | 目的地址 |
---|---|
CIP | RIP |
源地址 | 目的地址 |
---|---|
RIP | CIP |
客户端无法感知到后端RS 的存在
源地址 | 目的地址 |
---|---|
VIP | CIP |
客户端是不知道真是RS地址的,但是RS服务器却是可以知道ClientIP的(因为数据包中会包含了ClientIP),但是由于中介LVS的原因,使得发送的时候发给VIP(LVS),返回的时候,由LVS把源地址修改为VIP,所以对于客户端不能来讲是不知道目标地址的RS的存在。这就是反向代理的概念,客户端是不知道真正服务器的存在,知道的只有门面VIP的存在。
在原有的IP报文外再次封装多一层IP首部,内部IP首部(源地址为CIP,目标IIP为VIP),外层IP首部(源地址为DIP,目标IP为RIP)。
源地址 | 目的地址 |
---|---|
CIP | VIP |
PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链;
IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP;
IP首部源地址 | IP首部目的地址 | 源地址 | 目的地址 |
---|---|---|---|
DIP | RIP | CIP | VIP |
POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输),此时源IP为DIP,目标IP为RIP;
RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的tun0接口VIP,那么此时RS开始处理此请求,处理完成之后,通过tun0接口送出去向外传递,此时的源IP地址为VIP,目标IP为CIP;
源地址 | 目的地址 |
---|---|
VIP | CIP |
1、DIP、VIP、RIP都应该是公网地址;
2、RS的网关不能,也不可能指向DIP;
3、RS必须支持IP隧道;
无论是 DR 还是 NAT 模式,不可避免的都有一个问题:LVS 和 RS 必须在同一个 VLAN 下,
否则 LVS 无法作为 RS 的网关。
这引发的两个问题是:
Full-NAT 由此而生,解决的是 LVS 和 RS 跨 VLAN 的问题,而跨 VLAN 问题解决后,LVS
和 RS 不再存在 VLAN 上的从属关系,可以做到多个 LVS 对应多个 RS,解决水平扩容的问
题。
Full-NAT 相比 NAT 的主要改迕是,在 SNAT/DNAT 的基础上,加上另一种转换,转换过
程如下:
Full-NAT主要的思想是把网关和其下机器的通信,改为了普通的网络通信,从而解决了跨
VLAN 的问题。采用返种方式,LVS 和 RS 的部署在 VLAN 上将不再有任何限制,大大提高了运维部署的便利性。
上面其实是把内网ip和内网ip之间通过交换机进行转换捆绑,从而可以跨vlan进行服务请求代理。
客户端与服务端的通信,一次请求可能包含多个TCP 包,LVS 必须保证同一连接的TCP包,必须被转发到同一台RS,否则就乱套了。为了确保返一点,LVS 内部维护着一个 Session的 Hash 表,通过客户端的某些信息可以找到应该转发到哪一台 RS 上。
采用 Full-NAT 模式后,可以搭建 LVS 的集群,拓扑结构如下图:
容灾分为 RS 的容灾和 LVS 的容灾。
RS 的容灾可以通过 LVS 定期健康检测实现,如果某台 RS 失去心跳,则认为其已经下线,
不会在转发到该 RS 上。
LVS 的容灾可以通过主备+心跳的方式实现。主 LVS 失去心跳后,备 LVS 可以作为热备立
即替换。
容灾主要是靠 KeepAlived 来做的。(心跳以及下线剔除或者替换工作主要通过keepalived进行控制)