LVS初步
一见
目录
1.
前言
很多人知道LVS,但可能知之不多,希望阅读本文后,能够对LVS有一个基本的感性认识。
LVS是国内最早出现的自由软件之一,由国防科技大学章文嵩博士在1998年5月创立,章博士目前是淘宝网高级研究员,是淘宝网核心系统负责人。
LVS首要的是解决路由问题,结果不但解决了耦合问题,实现了网络隔离,而且顺带实现了负载均衡,负载均衡复杂的地方在于不同的均衡策略。常常均衡和路由成对出现,象分布式中的一致性哈希,也是路由和均衡,实际上还达到了容灾的效果,可以说是一举多得。
2. 思考
一个数据包,是如何从一个机器达到另一个机器的?两个机器可以连接在同一个交换机上;也可以挂在不同的交换机上;甚至可能一个在内网,另一个在外网。
抓包工具tcpdump、Wireshark和Sniffer等是如何工作的?Linux内核中的Netfilter原理是什么?最好可以,动手写一个基于RAW SOCKET的抓包工具,按IP、TCP/UDP格式解析,并以可视化方式展现出来,甚至可以进一步解析诸于HTTP之类的。
3. 名词解释
下表中,蓝色字体部分是最基础的名词,其它可最后反过来再细读:
缩写 |
全称 |
说明 |
LVS |
Linux Virtual Server |
Linux虚拟服务器,它有三种工作模式:NAT、DR和TUN |
IPVS |
IP Virtual Server |
运行在LVS下的,提供负载均衡的一种技术 |
NAT |
Network Address Translation |
网络地址转换,也可叫IP地址转换 |
DR |
Direct Routing |
直接路由,也可叫MAC地址转换 |
TUN |
Tunneling |
隧道 |
LD |
LVS Director |
|
LB |
Load Balancer |
负载均衡器 |
|
IP Tunneling |
IP隧道 |
VS |
Virtual Server |
虚拟服务器 |
RS |
Real Server |
真实服务器 |
VIP |
Virtual IP |
虚拟IP |
VPN |
Virtual Private Network |
虚拟专用网络,也叫虚拟私有网络,利用加密技术在公网上封装出一个数据通讯隧道 |
LAN |
Local Area Network |
本地局域网 |
WAN |
Wide Area Network |
广域网 |
|
Switch |
交换机 |
AS |
Autonomous System |
自治系统,处于一个管理机构控制下的路由器和网络群组,有权自主决定在本系统中采用何种路由协议 |
BGP |
Border Gateway Protocol |
边界网关协议,用于AS间的动态路由协议,是一种外部网关协议 |
IGP |
Interior Gateway Protocol |
内部网关协议 |
EGP |
Exterior Gateway Protocl |
外部网关协议,在AS的相邻两个网关主机间交换路由信息的协议,是一个轮询协议 |
GGP |
Gateway to Gateway Protocol |
网关到网关协议 |
LSA |
Link State |
链路状态,OSPF接口上的描述信息,例如IP地址、子网掩码、网络类型等 |
OSPF |
Open Shortest Path First |
开放式最短路径优先,是一种IGP,用于在单一AS内决策路由,运作于AS内部,是链路状态协议。OSPF路由器间交换的不是路由表,而是LSA |
RIP |
Routing Information Protocol |
路由信息协议,使用最广泛的IGP,但正在被OSPF等所取代 |
ARP |
Address Resolution Protocol |
地址解析协议,根据IP取MAC的协议 |
RARP |
Reverse Address Resolution Protocol |
反向地址解析协议,根据MAC取IP的协议 |
OSI |
Open System Interconnection |
一个开放性的通行系统互连参考模型,是一个协议规范 |
4. OSI参考模型
5. LVS架构
5.1. 负载均衡器(Load Balancer)
它是整个集群对外面的前端机,负责将Client的请求发送到一组服务器上执行,而Client认为服务是来自一个IP地址上的。它可以是用IP负载均衡技术的负载均衡器,也可以是基于内容请求分发的负载均衡器,还可以是两者的结合。
5.2. 服务器集群(Server Cluster)
是一组真正执行Client请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
5.3. 后端存储(Storage)
它为服务器集群提供一个共享的存储区,这样很容易使得服务器集群拥有相同的内容,以便提供相同的服务。
6. 区别
|
特点 |
适用网络 |
LVS/DR |
修改MAC,RS将响应返回给Client |
LAN,同一物理网段 |
LVS/NAT |
修改IP为RS的IP,LD将顺应返回给Client |
私有网络 |
LVS/TUN |
不修改IP,但包装一个新的IP头,RS将响应返回给Client |
LAN、WAN |
DR特点导致它不能跨LAN,这个比较容易理解。
在IP处理上,NAT是修改,而TUN是新增,后者可跨LAN,为何NAT不行?要理解这一点,只需要知道响应是怎么回去的就明白了。
? 为何NAT是修改IP,而TUN是包装一个新IP头?
1) NAT:
它修改IP的目的是让包可以达到目标RS,仅此而已。但包装个新的IP头同样可以达到这个目的,但无疑多了开销。
2) TUN:
对于TUN模式,修改同样可以让包达到目标RS,但是这样的结果是包不能回到Client了,因为丢失了源IP,所以TUN模式必须包装一个新的IP头。而NAT模式,数据包的进出都是经过LD,包不会从RS直接到Client,所以NAT模式修改即可。
6.1. 包层次关系
6.2. IP包头结构
6.3. TCP包头结构
6.4. LVS/DR
6.5. LVS/NAT
从下图,可以看出NAT模式只需要一个公网IP:
6.6. LVS/TUN
7. 配置
7.1. LVS/DR配置
7.1.1. 配置Director
在Diector机器上完成下列所有操作:
1) 为Director配置VIP,此IP用于对外提供服务:
#ifconfig eth0:0 192.168.1.100 broadcast 192.168.1.100 netmask 255.255.255.255 up
上述操作,在eth0上绑定了一个虚拟设备eth0:0,同时设置VIP为192.168.1.100。
2) 指定eth0:0的路由:
#route add -host 192.168.1.100 dev eth0:0
3) 开启包转发,让Director充当路由器角色:
#echo 1 > /proc/sys/net/ipv4/ip_forward
注意,对于DR,开启包转发不是必须的,但对于NAT是必须的。
4) 接下来,配置ipvs,执行以下操作:
① #ipvsadm -C
② #ipvsadm -A -t 192.168.1.100:80 -s rr -p 600
③ #ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.20:80 -g
④ #ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.30:80 -g
上面,第一行是清除内核中的虚拟服务器列表中的所有记录;第二行是添加一条新的VIP记录,这个新的VIP是192.168.1.100,同时指定它的持续服务时间为600秒;第三和第四行,是在VIP记录中添加两条RS记录,并且指定LVS的工作模式为DR。
5) 至此,配置完成,即可启动LVS服务:
#ipvsadm
7.1.2. 配置RS
在DR和TUN两种工作模式下,请求达到RS后,响应直接返回给Client,而不经过Director。因此,需要在每个RS上配置VIP,这个VIP和Director上的相同,这样数据才能直接返回给Client。
在所有RS机器上分别完成下列所有操作:
1) 配置VIP:
#ifconfig lo:0 192.168.1.100 broadcast 192.168.1.100 netmask 255.255.255.255 up
2) 指定lo:0的路由:
#route add -host 192.168.1.100 dev lo:0
3) 禁止本机的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
? arp_ignore
定义响应ARP请求的策略:
值 |
作用 |
0 |
默认值,响应任何对本地IP的ARP请求 |
1 |
只响应目标IP是访问本机IP的ARP请求 |
2 |
只响应目标IP是访问本机IP的ARP请求,且源IP和本地IP须在同一子网 |
3 |
不响应ARP请求 |
4-7 |
保留未使用 |
8 |
不响应所有的ARP请求 |
? arp_announce
定义响应ARP请求的限制:
值 |
作用 |
0 |
无论哪块网卡收到ARP请求,只要是本机的MAC,都作出响应 |
1 |
尽量避免响应MAC不是本网卡的ARP请求 |
2 |
使用最合适的网卡来响应ARP请求 |
4) 为使禁止ARP请求生效,执行:
#sysctl -p
由于VIP是Director和所有RS共享的,如果不禁止,产生ARP请求时,会导致Director和所有RS都应答,从而产生冲突,因此需要禁止RS响应ARP请求。
7.2. LVS/NAT配置
7.2.1. 配置Director
在Diector机器上完成下列所有操作:
1) #ifconfig eth0:0 192.168.1.100 broadcast 192.168.1.100 netmask 255.255.255.255 up
2) #echo 1 > /proc/sys/net/ipv4/ip_forward
3) 接下来,配置ipvs,执行以下操作:
① #ipvsadm -C
② #ipvsadm -A -t 192.168.1.100:80 -s rr
③ #ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.20:80 -m
④ #ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.30:80 -m
4) 至此,配置完成,即可启动LVS服务:
#ipvsadm
7.2.2. 配置RS
在所有RS机器上分别完成下列所有操作:
1) 配置默认网关为Director,以保证数据可从Director返回:
#route add default gw 192.168.1.100
7.3. LVS/TUN配置
7.3.1. 配置Director
在Diector机器上完成下列所有操作:
1) 设置tunl0(隧道网卡)的IP为VIP:
#ifconfig tunl0 192.168.1.100 broadcast 192.168.1.100 netmask 255.255.255.255 up
2) 指定tunl0的路由:
#route add -host 192.168.1.100 dev tunl0
3) 接下来,配置ipvs,执行以下操作:
① #ipvsadm -C
② #ipvsadm -A -t 192.168.1.100:80 -s rr
③ #ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.20:80 -i
④ #ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.30:80 -i
4) 至此,配置完成,即可启动LVS服务:
#ipvsadm
7.3.2. 配置RS
在所有RS机器上分别完成下列所有操作:
1) #ifconfig tunl0 192.168.1.100 netmask 255.255.255.255 up
2) route add -host 192.168.1.100 dev tunl0
3) 禁止本机的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
4) 为使禁止ARP请求生效,执行:
#sysctl -p
8. ipvsadm
参数 |
解释 |
-A |
--add-service,往内核VS表添加一个VS |
-a |
--add-server,在内核VS表中添加一个RS |
-t |
--tcp-service,表示VS提供的是TCP服务 |
-m |
--masquerading,指定LVS的工作模式为NAT |
-i |
--ipip,指定LVS的工作模式为TUN |
-g |
--gatewaying,指定LVS的工作模式为DR |
-r |
--real-server,指定RS的地址和端口 |
-p |
--persistent [timeout],来自同一个Client的多次请求,转发给同一台RS,timeout默认为300秒 |
-s |
--scheduler,指定调度策略,有以下几个选项: 1) rr,轮询方式(Round-Robin) 2) wrr,加权轮询方式(Weighted Round-Robin),按顺序许循环分派请求给RS,但给能力的RS分派更多 3) lc,最小连接(Least-Connection) 4) wlc,加权最小连接(Weighted Least-Connection) 5) lblc,基于局部性的最少链接(Locality-Based Least-Connection) 6) lblcr,带复制的基于局部性最少链接(Locality-Based Least-Connection with Replication),某页面缓存在服务器A上,被访问次数极高,而其它服务器负载较低,监视是否访问同一页面,如果是则把请求转发给其它服务器 7) dh,目标地址散列(Destination Hash),对目标IP进行hash,将同一目标IP的请求转发给相同的RS 8) sh,源地址散列(Source Hash),与dh刚好相反,基于源IP 9) sed,最短预期延时(Shortest Expected Delay) 10) nq,不排队(Never Queue),如果某RS连接数为0,则直接分配 默认的调度策略为wlc。 |