LVS初步
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不行?要理解这一点,只需要知道响应是怎么回去的就明白了。
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。 |