LVS 详解
Linux Cluster 相关概念
Cluster:计算机集合,为解决某个特定问题组合起来形成的单个系统。
1、Linux Cluster 类型
LB:Load Balancing # 负载均衡
HA:High Availiablity # 高可用
A=MTBF/(MTBF+MTTR) # 计算公式
HP:High Performance # 高性能
2、分布式系统及扩展方式
- 分布式系统包括:分布式存储和分布式计算
- 系统扩展方式包括:向上扩展( Scale UP,比如:提升主机性能)和向外扩展(Scale Out,比如:Cluster )
LB Cluster 相关概念
1、LB Cluster 的实现方式
-
硬件
F5 Big-IP Citrix Netscaler A10
-
软件
lvs # Linux Virtual Server nginx haproxy ats # apache traffic server perlbal pound
2、LB Cluster 的划分(基于工作的协议层次)
-
传输层(通用):(DPORT)
lvs nginx:(stream) haproxy:(mode tcp)
-
应用层(专用):(自定义的请求模型分类)
proxy server: http:nginx(http), httpd, haproxy(mode http), ... fastcgi:nginx, httpd, ... mysql:ProxySQL, ... ...
LVS 介绍
1、LVS 概念
LVS 是一个四层路由器或四层交换机(针对于OSI 7层模型),VS(Virtual Server)根据请求报文的目标IP和目标协议及端口将其调度转发至某RS(Real Server),根据调度算法来挑选RS。
2、LVS 工作原理
2.1 iptables/netfilter 简短回顾
iptables # 用户空间的管理工具
netfilter # 内核空间上的框架
三种数据流向:
流入 # PREROUTING --> INPUT
流出 # OUTPUT --> POSTROUTING
转发 # PREROUTING --> FORWARD --> POSTROUTING
nat table:
DNAT # 目标地址转换---PREROUTING
SNAT # 源地址转换---POSTROUTING
2.2 LVS 实现方式
LVS 使用 ipvsadm/ipvs 来实现。
- ipvsadm:用户空间的命令行工具,规则管理器,用于管理集群服务及相关的 RealServer
- ipvs:工作于内核空间的netfilter的INPUT钩子之上的框架
上图所示,ipvs工作于内核空间的INPUT链上,当收到用户请求某集群服务时,经过PREROUTING链,经检查本机路由表,送往INPUT链;在进入netfilter的INPUT链时,ipvs强行将请求报文通过ipvsadm定义的集群服务策略的路径改为FORWORD链,将报文转发至后端真实提供服务的主机。
3、LVS 相关术语
VS:Virtual Server, Director, Dispatcher, Balancer
RS:Real Server, upstream server, backend server
CIP:Client IP
VIP: Virtual server IP
RIP: Real server IP
DIP: Director IP
CIP <--> VIP == DIP <--> RIP
4、LVS 集群的类型
lvs-nat # 修改请求报文的目标IP;多目标IP的DNAT
lvs-dr # 操纵封装新的MAC地址
lvs-tun # 在原请求IP报文之外新加一个IP首部
lvs-fullnat # 修改请求报文的源和目标IP
4.1 lvs-nat
多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发。
注意事项:
- RIP和DIP必须在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP
- 请求报文和响应报文都必须经由Director转发;Director易于成为系统瓶颈
- 支持端口映射,可修改请求报文的目标PORT
- vs必须是Linux系统,rs可以是任意系统
4.2 lvs-dr
通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。
注意事项:
-
Director和各RS都得配置使用VIP
-
确保前端路由器将目标IP为VIP的请求报文发往Director:
(a) 在前端网关做静态绑定; (b) 在RS上使用arptables; (c) 在RS上修改内核参数以限制arp通告及应答级别 arp_announce arp_ignore
-
RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director
-
RS跟Director要在同一个物理网络
-
请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client
-
不支持端口映射
针对此类型的一些问题和解决方法:
- Director和各RS都得配置使用VIP,如何保证ARP请求报文和响应都只有Director的MAC地址能够响应?(解决办法:修改Liunx内核中关于ARP的内核参数:arp_announce/arp_ignore)
- 由于RS只有一个网络接口,而Linux内核默认情况下包封装时是从哪个网口出去那个网口就是源地址,如何确保RS转发出来的报文源IP是VIP,而不是RIP?(解决办法:在数据报封装后指定路由经lo别名上的接口发送出去然后再通过物理网卡转发出去)
- Director和各RS都得配置使用VIP,如何避免个主机的IP广播,造成无法通信?(解决办法:在RS上进行配置时,设定VIP的广播地址为它自己即可)
4.3 lvs-tun
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)。
注意事项:
- DIP, VIP, RIP都应该是公网地址
- RS的网关不能,也不可能指向DIP
- 请求报文要经由Director,但响应不能经由Director
- 不支持端口映射
- RS的OS得支持隧道功能
此场景优缺点:
- 优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。
- 缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。封装两个IP报文首部会有问题: MTU大小为1500的大小,而再加一个IP报文首部会超出MTU的大小,导致路由器拒收(因为传输之前已经被切片传输的大小为1500字节)。
4.4 lvs-fullnat
通过同时修改请求报文的源IP地址和目标IP地址进行转发。
注意事项:
- VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
- RS收到的请求报文源地址是DIP,因此,只能响应给DIP;但Director还要将其发往Client
- 请求和响应报文都经由Director
- 支持端口映射
- 此类型默认不支持(需要编译内核进行支持)
4.5 LVS 场景总结
-
lvs-nat, lvs-fullnat:请求和响应报文都经由Director
lvs-nat # RIP的网关要指向DIP lvs-fullnat # RIP和DIP未必在同一IP网络,但要能通信
-
lvs-dr, lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
lvs-dr # 通过封装新的MAC首部实现,通过MAC网络转发 lvs-tun # 通过在原IP报文之外封装新的IP首部实现转发,支持远距离通信