LVS是Linux Virtual Server的简写,意思是Linux虚拟服务器,它工作在input链上,当客户端发送的请求到达input链上以后,通过LVS的验证若是关于lvs的请求就会在此链上直接修改目标地址,而后通过postrouting链传送给其定义的服务器,LVS和iptables不能同时使用。

一、LVS的原理

1、NET的基本原理

把从客户端发来的IP包的IP头目的地址在DR上换成其中一台RS(real server)的IP地址并发至此RS,而RS则在处理完成后把数据经过DR主机发回给客户端,DR在这个时候再把数据包的源IP地址转换为DR接口上的IP地址即可,期间,无论是进来的数据还是出去的数据都必须经过DR。如下图所示:

集群之LVS的详细介绍_集群

LVS/NET 模型

NAT模式的特点:

  • LB会修改数据包的地址

  对于请求包,会进行DNAT;对于响应包,会进行SNAT。

  • LB会透传客户端IP到RS(DR模式也会透传)

  虽然LB在转发过程中做了NAT转换,但是因为只是做了部分地址转发,所以RS收到的请求包里是能看到客户端IP的。

  • 需要将RS的默认网关地址配置为LB的浮动IP地址

  因为RS收到的请求包源IP是客户端的IP,为了保证响应包在返回时能走到LB上面,所以需要将RS的默认网关地址配置为LB的虚拟服务IP地址。当然,如果客户端的IP是固定的,也可以在RS上添加明细路由指向LB的虚拟服务IP,不用改默认网关。

  • LB和RS须位于同一个子网,并且客户端不能和LB/RS位于同一子网

  因为需要将RS的默认网关配置为LB的虚拟服务IP地址,所以需要保证LB和RS位于同一子网。

  又因为需要保证RS的响应包能走回到LB上,则客户端不能和RS位于同一子网。否则RS直接就能获取到客户端的MAC,响应包就直接回给客户端了,不会走网关,也就走不到LB上面了。这时候由于没有LB做SNAT,客户端收到的响应包源IP是RS的IP,而客户端的请求包目的IP是LB的虚拟服务IP,这时候客户端无法识别响应包,会直接丢弃。

2、DR的基本原理:

1)LVS调度器收到目标地址为VIP的请求包后,将MAC地址改成RS的MAC地址,并通过交换机(链路层)发给RS

2)RS的链路层收到请求后,往上传给IP层。IP层需要验证请求的目标IP地址。所以RS需要配置一个VIP的loopback(以下简称为lo,意为环回接口)device。这样RS的IP层收到报文后,会往上递交给传输层,之所以配置成lo,是因为lo对外不可见,不会跟LVS的VIP起冲突。

3)RS处理完成后,将应答包直接返回给客户端。若是公网服务器,则RS需要连接在互联网(公网IP或网关)才能将应答包返回。如下图所示:

集群之LVS的详细介绍_nat_02

LVS/DR 模型

 DR模式的特点:

  • 数据包在LB转发过程中,源/目的IP端口都不会变化

  LB只是将数据包的MAC地址改写为RS的MAC地址,然后转发给相应的RS。

  • 每台RS上都必须在环回网卡上绑定LB的虚拟服务IP

  因为LB转发时并不会改写数据包的目的IP,所以RS收到的数据包的目的IP仍是LB的虚拟服务IP。为了保证RS能够正确处理该数据包,而不是丢弃,必须在RS的环回网卡上绑定LB的虚拟服务IP。这样RS会认为这个虚拟服务IP是自己的IP,自己是能够处理这个数据包的。否则RS会直接丢弃该数据包!

  • RS上的业务进程必须监听在环回网卡的虚拟服务IP上,且端口必须和LB上的虚拟服务端口一致

  因为LB不会改写数据包的目的端口,所以RS服务的监听端口必须和虚拟服务端口一致,否则RS会直接拒绝该数据包。

  • RS处理完请求后,响应直接回给客户端,不再经过LB

  因为RS收到的请求数据包的源IP是客户端的IP,所以理所当然RS的响应会直接回给客户端,而不会再经过LB。这时候要求RS和客户端之间的网络是可达的。

  • LB和RS须位于同一个子网

  因为LB在转发过程中需要改写数据包的MAC为RS的MAC地址,所以要能够查询到RS的MAC。而要获取到RS的MAC,则需要保证二者位于一个子网,否则LB只能获取到RS网关的MAC地址。

3、TUN的基本原理

TUN模式使用网络分层的原理,把从客户端发来的数据包基础上,封装一个新的IP头标记(不完整的IP头,只有目的IP部)发给RS,RS收到后先把DR发过来的数据包头给解开,还原其数据包原样,处理后,直接返回给客户端,而不需要再经过DR。需要注意的是由于RS需要对DR发过来的数据包进行还原,也就是说必须支持IP TUNNEL协议,所以在RS的内核中,必须编译支持IP TUNNEL这个选项。

4. FULLNAT模式

  FULLNAT模式下,LB会对请求包和响应包都做SNAT+DNAT。

  FULLNAT模式的特点:

  • LB完全作为一个代理服务器
  FULLNAT下,客户端感知不到RS,RS也感知不到客户端,它们都只能看到LB。此种模式和七层负载均衡有点相似,只不过不会去解析应用层协议,而是在TCP层将消息转发
  • LB和RS对于组网结构没有要求
  不同于NAT和DR要求LB和RS位于一个子网,FULLNAT对于组网结构没有要求。只需要保证客户端和LB、LB和RS之间网络互通即可。

二、LVS的类型有哪些?它们各有什么特点?

1)NAT:地址转换(类似DNAT)

集群节点跟director必须在同一个网络IP

RIP通常是私有地址,仅用于各集群节点间的通信

director位于client和realserver之间,并负责处理进出的所有通信

realserver必须将网关指向DIP

支持端口映射

realserver可以使用任意OS

较大规模应用场景中,director易成为系统瓶颈

2)DR:直接路由(只处理请求报文)

集群节点跟director必须在同一个物理网络中

RIP可以使用公网地址,实现便捷的远程管理和监控

director仅负责处理入站请求,响应报文则由realserver直接发往客户端;

realserver不能将网关指向DIR

不支持端口映射;

3)TUN:(隧道)

集群节点可以跨越互联网(Internet);

RIP必须是公网地址;

director仅负责入站请求,响应报文则由realserver直接发往客户端;

只有支持隧道功能的OS才能用于realserver;

不支持端口映射;

三、LVS调度算法

1、固定调度

四种静态的调度方法

rr:Round Robin,轮叫,轮询

wrr:Weight Round Robin,加权,考虑服务器本身权重的意义

sh:source hash,源地址hash,只要是来自于同一个客户

dh(Destination Hashing):目标地址散列,将相同的的请求发送给同一个IP

2、动态调度

六种动态调度方法:

1)lc:Least Connections,最少连接

active*256+inactive (谁的小,挑谁)

2)wlc:Weighted Least Connections,加权最少连接

(active*256+inactive)/weight

3)sed:最短期望延迟

(active+1)*256/weight

4)nq:never queue 永不排队

5)lblc:Locality-Based Least Connections,基于本地的最少连接

6(lblcr:Locality-Based Least Connections with Replication,基于本地的带复制功能的最少连接

默认方法(最理想的方法):wlc

四、管理集群服务的命令行工具ipvsadm

1、ipvsadm的几个重要功能:

1)管理集群服务

添加:-A -t|u|f service-address [-s scheduler]

-t:TCP协议的集群

-u:UDP协议的集群

service-address: IP:PORT

-f:FWM,防火墙标记

service-address: Mark Number

修改:-E

删除:-D -t|u|f service-address

eg:#ipvsadm -A -t 172.16.66.1:80 -s rr

2)管理集群服务中的RS

添加:-a -t|u|f service-address -r server-address [-g|i|m] [-w weight]

-t|u|f service-address:事先定义好的某集群服务

-r server-address:某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射

[-g|i|m]:LVS类型(若不指定则默认为DR)

-g:DR 表示DR模型

-i:TUN 能够跨越互联网的

-m:NAT 地址伪装

[-w weight]:定义服务器权重

修改:-e

删除:-d -t|u|f service-address -r server-address 指定从哪个集群服务中删除那个用户

eg:# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 -m

eg:# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -m

3)查看

-L|l

-n: 数字格式显示主机地址和端口

--stats: 统计数据

--rate: 速率

--timeout: 显示tcp、tcpfin和udp的会话超时时长

--sort: 对查看的内容进行排序,默认是升序

--daemon:

-c: 显示当前的ipvs连接状况

4)删除所有集群服务

-C:清空ipvs规则

5)保存规则

-S

#ipvsadm -s > /path/to/somefile

6)载入此前的规则

-R

#ipvsadm -R < /path/form/somefile

五、LVS-NET的实现过程

1、首先规划好IP

Director Server(以下简称DR)DIP:192.168.66.1 VIP:172.16.66.2

Real Server 1 (以下简称RS1) DIP:192.168.66.2

Real Server 2 (以下简称RS2) DIP:192.168.66.3

2、配置RS1、RS2服务器

1)RS1服务器的配置过程:

RS1的IP配置为:192.168.66.2 网关是:192.168.66.1

wget ftp://172.16.0.1/pub/gls/server.repo -O /etc/yum.repos.d/server.repo

yum install httpd –y 安装web服务

提供相应的网页页面并启动web服务:

集群之LVS的详细介绍_LVS_03 2)RS2服务器的配置过程

RS1的IP配置为:192.168.66.3 网关是:192.168.66.1

wget ftp://172.16.0.1/pub/gls/server.repo -O /etc/yum.repos.d/server.repo

yum install httpd –y 安装web服务

提供相应的网页页面并启动web服务:

集群之LVS的详细介绍_tun_04

3、配置Director服务器

1)在Director服务器上再要添加一块网卡eth1,其IP为DIP:192.168.66.1 则eth0为VIP,其IP为172.16.66.2(提醒:eth1网卡的连接方式是Host-only,RS1、RS2的网卡连接方式也是Host-only)

wget ftp://172.16.0.1/pub/gls/server.repo -O /etc/yum.repos.d/server.repo

2)同步时间

集群之LVS的详细介绍_tun_05

集群之LVS的详细介绍_LVS_06

3)安装、启动ipvsadm并测试web服务是否能访问

yum install ipvsadm –y 安装ipvsadm

service ipvsadm start 启动ipvsadm

集群之LVS的详细介绍_nat_07

4)添加集群服务

集群之LVS的详细介绍_集群_08

(-m以nat模式运作)

5)ipvsadm –L –n ipvsadm规则查看

在物理主机上 访问172.16.66.2 刷新几次再执行ipvsadm –L –n命令就会发现InActConn比例接近1:1

六、LVS-DR的实现过程

1、首先划分好IP

Director:eth0,DIP:172.16.66.2 eth0:0,VIP:172.16.66.1

RS1: Eth0,RIP:172.16.66.7 lo:0,VIP:172.16.66.1

RS2: Eth0,RIP:172.16.66.8 lo:0,VIP:172.16.66.1

2、Director的IP、网卡配置过程

ifdown eth1 down Director的eth1断开连接

vim /etc/sysconfig/network-scrips/ifcfg-eth1 编辑文件内容修改如下:

集群之LVS的详细介绍_tun_09

service network restart 重启网络服务器

ifconfig eth0:0 172.16.66.1/16 为eth0配置一个别名

ifconfig 查看别名是否设置成功

集群之LVS的详细介绍_集群_10

把网卡的连接方式改为桥接,以下RS1、RS2的网卡也改成桥接,因为服务器间要在同一台交换机上

3、RS1、RS2的配置过程

1)RS1服务器的IP配置

vim /etc/sysconfig/network-scripts/ifcfg-eth0 设置IP和网关

集群之LVS的详细介绍_tun_11

service network restart 重启网络服务器

2)RS2服务器的IP配置

vim /etc/sysconfig/network-scripts/ifcfg-eth0 设置IP和网关

集群之LVS的详细介绍_nat_12

service network restart 重启网络服务器

测试能否ping通RS1和Director服务器

集群之LVS的详细介绍_集群_13

3)RS1服务的配置

cd /proc/sys/net/ipv4/conf/

集群之LVS的详细介绍_nat_14

(小知识补充:还可以用另外一种命令实现上述命令的执行过程

sysctl -w net.ipv4.conf.eth0.arp_announce=2

sysctl -w net.ipv4.conf.all.arp_announce=2 )

ifconfig lo:0 172.16.66.1/16 配置VIP

在物理主机上ping 172.16.66.1看看是否能ping通

集群之LVS的详细介绍_LVS_15

Ping通后 可执行 arp -a 命令查看哪一个IP响应了

ifconfig lo:0 down 关闭VIP

ifconfig lo:0 172.16.66.1 broadcast 172.16.66.1 netmask 255.255.255.255 up (broadcast为广播地址,255.255.255.255意味着只跟自己在同一个网段内,全是网络地址)

route add -host 172.16.66.1 dev lo:0 添加路由

4)RS2服务的配置

配置RS2的VIP并启用

集群之LVS的详细介绍_集群_16

在物理主机上ping172.16.66.1 查看是否能ping通, 然后执行arp –a查看响应状态

ifconfig lo:0 down 关闭VIP

ifconfig lo:0 172.16.66.1 netmask 255.255.255.255 broadcast 172.16.66.1 up

(broadcast为广播地址,255.255.255.255意味着只跟自己在同一个网段内,全是网络地址)

ifconfig

route add -host 172.16.66.1 dev lo:0 添加路由

4、Directory服务的配置过程

1)添加路由并访问web服务

集群之LVS的详细介绍_nat_17

2)设置ipvsadm

集群之LVS的详细介绍_tun_18

3)打开浏览器访问一下 172.16.66.1 刷新出现两次RS1,一次RS2

ipvsadm -L -n (刷新查看一下权重比例为1:2)

这就是DR模型的LVS

小知识点:

arp_ignore:定义接收到ARP请求时的响应级别;

0:只要本地配置有相应的地址,就给予响应

1:仅在请求的目标地址配置请求到达的接口上的时候,才给予响应

arp_announce:定义将自己地址向外通告时的通告级别

0:将本地任何接口上的任何地址向外通告

1:试图仅向目标网络通告与其网络匹配的地址;

2:仅向与本地接口上的地址匹配的网络进行通告

本文出自 “show_only” 博客,请务必保留此出处http://10240214.blog.51cto.com/6634068/1202622