LVS初步

本为2014年一篇文章,发现被删除了,故重发。

LVS初步.pdf

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请求(因为这时根据IP取MAC地址会失败):

① 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

参数

解释

-C

--clear,清除内核虚拟服务器表中的所有记录

-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。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏linux系统运维

负载均衡集群介绍,LVS介绍, LVS调度算法,LVS NAT模式搭建

1912
来自专栏jeremy的技术点滴

Web应用程序限速方法

3886
来自专栏Java3y

网络层【第三篇】

路由信息协议 RIP (Routing Information Protocol) 是内部网关协议 IGP 中最先得到广泛使用的协议。

1621
来自专栏SDNLAB

SDN关键技术-Segment Routing协议简介

当前,SDN作为一种新的网络架构,已经成为行业高度关注的热点。其倡导的开放式网络,代表了从网络应用适应网络能力向网络能力主动适配网络应用需求这个网络建设理念的改...

4209
来自专栏北京马哥教育

LVS集群详解

一、什么是集群 LVS(Linux Virtual Server)Linux虚拟服务器,将多台虚拟主机组织起来满足同一个需求。由国人章文嵩开发,通过LVS提...

49810
来自专栏我是东东强

细说子网

最近闲来无事,抄起本《Wireshark网络分析就是这么简单》想了解下数据包粒度(Packet-level)的网络测量及分析方法,书开篇提出一个面试题,与子网掩...

1231
来自专栏Web 开发

preconnect & more

preconnect 出现在 w3 组织 16 年制订 《Resource Hints》。

1370
来自专栏SDNLAB

容器 Flannel vxlan 基本原理和验证

作者简介:yangjunsss,曾就职于IBM、青云QingCloud,现就职于华为,研究方向:容器微服务、IaaS、P2P分布式。邮箱 cj.yangjun@...

2342
来自专栏天天P图攻城狮

Android系统打印方案分析

Android Print API Android默认实现了打印的框架,使用PrintManager+PrintManagerService可以轻松实现打印...

1.6K4
来自专栏开源优测

RFC1180 TCP/IP指南

1272

扫码关注云+社区

领取腾讯云代金券