lvs是一种集群技术,采用IP负载均衡技术和基于内容请求分发技术。调度器(Director)具有很好的吞吐率,将请求均衡地转移到不同的服务器上处理,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。

lvs的用户空间的命令行管理工具为ipvsadm,ipvs是工作在内核中netfilter的INPUT的钩子函数上,对进入的报文在没有进入用户空间前,对这些报文进行操作。

lvs的工作类型有四种,分别是lvs-nat,lvs-dr,lvs-tun和lvs-fullnat。最常用的为前两种(lvs-nat,lvs-dr)。

lvs-nat:是一种最简单的方式,所有的RealServer将自己的网关指向Director。客户端请求的都是Director上的IP,然后报文到Director上以后经过DNAT转换,把请求Director的报文重新封装成报文,以Director的IP为源地址,然后请求RS(RealServer),RS直接响应给Director,然后由Director把结果发给客户端。简单来说就是:多目标的DNAT(iptables),它通过修改请求报文的目标IP地址(同时可能会修改目标端口)至挑选出某RSRIP地址实现转发;

lvs-nat类型的结构图:

 

 

                            lvs负载均衡, ipvs的NAT模式,DR模式的实现,


lvs-nat的特点:   

  (1)RS应该和DIP应该使用私网地址,且RS的网关要指向DIP

  (2)请求和响应报文都要经由director转发;极高负载的场景中,director可能会成为系统瓶颈;

  (3)支持端口映射;

  (4)RS可以使用任意操作系统(OS)

  (5)RSRIPDirectorDIP必须在同一IP网络;

   优点:实现方便简单,也容易理解;

   缺点:Director会称为一个优化的瓶颈,所有的报文都要经过Director,如果Director坏掉,后果很严重


lvs-dr:是通过修改请求中的目标MAC地址进行转发的;

lvs-dr的特点:

 (1) 保证前端路由器将目标IP为VIP的请求报文发送给director,后端的RS要能以VIP的地址响应给客户端; 

解决方案:

静态绑定

arptables

修改RS主机内核的参数      

  (2) RS的RIP可以使用私有地址;但也可以使用公网地址;

  (3) RS跟Director必须在同一物理网络中;

  (4) 请求报文经由Director调度,但响应报文一定不能经由Director;

  (5) 不支持端口映射;

  (6) RS可以大多数OS;

  (7) RS的网关不能指向DIP;

   为了让RS的不响应VIPARP响应,需要配置arp_ignore=1  别人来请求时,当别从哪个接口进入,就让那个接口的地址响应,如果不是就不响应;arp_announce=2只让自己的物理网卡的地址通告给别人;为了让RS以VIP为源地址把报文发送给客户端,RSRIP在物理网卡上,VIPlo(虚拟的设备)上,报文出去时要定义走lo这个设备,就是加一条路由(route add -host VIP dev lo:0)这样就能保证RS响应客户端时的源IPVIP。

lvs-tun:就是IP隧道,就是将一个IP报文再封装一个IP报文的首部,这样可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。

lvs-fullnat:就是在报文进来时做SNAT和DNAT。

后两种不是很常见就不详细说了

lvs-dr的架构图

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

 

这只是一个大概的图,DIP,VIP,RIP同一网段的是这样

DIP,VIP,RIP不同网段的架构图为:

lvs负载均衡, ipvs的NAT模式,DR模式的实现,


 下面是一个lvs-nat的示例:

用物理机作为测试机,作为客户端172.16.249.123这台机器为Director,它有两块网卡,一块配置172.16.249.123为外网地址,另一块配置为192.168.36.1做内网地址

192.168.36.2192.168.36.3web服务器即为RealServer,这两台内网主机的网关指向192.168.36.1

内网的网络类型选为VMnet2

做好之后测试内网之间能不能通信,

lvs负载均衡, ipvs的NAT模式,DR模式的实现,


lvs负载均衡, ipvs的NAT模式,DR模式的实现,

然后为为其打开httpd服务,然互配置测试页,为了演示效果我们把两台web服务器的页面配成不同的,(实际中是一模一样的资源的)

打开httpd服务,然后测试页面内容如下:

<h1>Hello , This is 192.168.36.2</h1>

<h1>This is 192.168.36.3</h1>

 

Director安装ipvsadm,把本地光盘挂上,然后写好yum源的指向

yum install ipvsadm

然后在Director上测试下,能否正常访问

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

保证Director的防火墙是关的

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

Director的核心转发要打开

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

 

然后在Director上做ipvs规则

首先添加集群服务 ipvsadm -A  -t 172.16.249.123:80 -s rr  -t 172.16.249.123:80是指这个地址(172.16.249.123)的tcp协议的80端口开启集群服务 –s rr 指明调度器算法为论调

 

ipvsadm -A -t 172.16.249.123:80-s rr

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

然后添加集群服务中的RSRealServer

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

 

这样就做好了,然后测试下

lvs负载均衡, ipvs的NAT模式,DR模式的实现,


然后你在刷新下,

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

但是你的httpd服务不能开启长链接,要不就会出新好几次一台RS才会换下一台

Driector中查看下,也可以看到每个主机响应一次服务

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

 

这些规则使用/etc/sysconfig/ipvsadm 把规则保存到/etc/sysconfig/ipvsadm

ipvsadm –R <  /etc/sysconfig/ipvsadm 重载这个规则

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

 

 


lvs-dr的示例:

我们用VIPDIP,RIP在同一网段来做一下,这样简单一些

首先规划Director的网卡为eth0,采用桥接模式,只使用一块网卡

地址配置为DIP172.16.249.123网关指向172.16.0.1VIP 放到eth0:0这个别名上172.16.249.199

RS1的网卡采用桥接,RIP1172.16.249.115网关指向172.16.0.1lo:0 VIP 172.16.249.199

RS2的网卡采用桥接,RIP2172.16.249.124  网关指向172.16.0.1lo:0 VIP172.16.249.199

首先把Director的另一块VMnet2的网卡断开,然后配置DIP172.16.249.123

RS1RS2的网卡改为桥接,地址为172.16.249.115172.16.249.124

然后从RS上测试ping172.16.0.1   ping172.16.249.123都是通的证明网络没问题了

然后配置Director上的VIP 172.16.249.199/32,掩码使用32位,就是让它只做负载均衡器的调度用的

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

这个时候RS主机ping VIP   172.16.249.199是通的

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

然后要限制从哪个接口进的报文,要让哪个接口去响应

Diretor的这个配置不必须,但RS的必须配置

route add -host 172.16.249.199dev eth0:0

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

然后设置RS

首先要先加这两个参数

arp_ignore=1

arp_announce=2

然后配置VIP,和限定报文从哪个接口进就从哪个接口出去

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore 为了禁用彻底,把这一个也配上

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce 为了禁用彻底,把这一个也配上

然后配置VIP地址

ifconfig lo:0 172.16.249.199/32 broadcast172.16.249.199 up

或者ifconfigeth0:0 172.16.249.199 netmask 255.255.255.255 broadcast 172.16.249.199 up

route add -host 172.16.249.199 dev lo:0

然后把另一台RS也这样配置

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore 为了禁用彻底,把这一个也配上

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce 为了禁用彻底,把这一个也配上

然后配置VIP地址

ifconfig lo:0 172.16.249.199/32 broadcast172.16.249.199 up

route add -host 172.16.249.199dev lo:0

这样RS就做好了,刚才web服务已经启动了,为了确认查看80端口是否启用

然后在Director上使用RIP地址请求进行测试

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

然后把Director上的以前做的规则清掉,

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

然后重新配置ipvsadm规则

ipvsadm -A -t 172.16.249.199:80 -s rr

ipvsadm -a -t 172.16.249.199:80 -r172.16.249.115 -g

ipvsadm -a -t 172.16.249.199:80 -r172.16.249.124 -g

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

用物理机的浏览器访问出问题了不能随时论调,隔一段时间能切换,应该是浏览器缓存问题;打开一个虚拟机测试没有问题

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

这样做容易出现这样的问题,在虚拟机下测试没有问题,证明这个实验是成功的,就是受网络或者浏览器的影响,

 

 

下面我们用VIPDIP,RIP在不同网段来做一下(在物理机和Director之间加上一个路由器)

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

首先规划Director的网卡为eth1,采用VMnet2模式

地址配置为DIP192.168.36.10 VIP 放到eth0:0这个别名上10.1.1.2

RS1的网卡VMnet2RIP192.168.36.8lo:0 VIP 10.1.1.2

RS2的网卡VMnet2RIP192.168.36.9lo:0 VIP 10.1.1.2

 

物理机的地址为172.16.249.100

添加一条路由

route add 10.1.1.0 mask 255.255.255.010.1.1.1

首先要有一个路由器,打开一个虚拟机打开核心转发功能,然后加入两块网卡(也可以一块网卡),类型为VMnet2,地址分别为eth1192.168.36.1/24 eth1010.1.1.2/24 ;一块为桥接为172.16.249.117

路由条目为

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

一台虚拟机做Director,一块网卡,网卡类型为VMnet2,地址eth0DIP192.168.36.10/24

eth0:010.1.1.2/8

Director上要添加一条路由

route add  default  gw 10.1.1.1

RSIP地址为192.168.36.8192.168.36.9默认网关指向192.168.36.1

这样物理网络就创建好了

ping测试下

Director上是能ping 172.16.249.110

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

从物理机也能ping10.1.1.2

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

RS上能ping通物理机

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

lvs负载均衡, ipvs的NAT模式,DR模式的实现,


然后启动RS80服务,就可以在Director上设置集群服务了

Director上测试以下web服务


lvs负载均衡, ipvs的NAT模式,DR模式的实现,

然后在Director上做集群服务配置,配置如下图

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

然后在RS 配置这两个参数

arp_ignore=1

arp_announce=2

然后配置VIP,和限定报文从哪个接口进就从哪个接口出去

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore 为了禁用彻底,把这一个也配上

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce 为了禁用彻底,把这一个也配上

然后配置VIP地址

ifconfig lo:0 10.1.1.2/32  broadcast 10.1.1.2 up      

route add -host 10.1.1.2 dev lo:0

然后把另一台RS也这样配置

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore 为了禁用彻底,把这一个也配上

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

echo 2 >  /proc/sys/net/ipv4/conf/eth0/arp_announce 为了禁用彻底,把这一个也配上

然后配置VIP地址

ifconfig lo:0 10.1.1.2/32 broadcast 10.1.1.2 up

route add -host 10.1.1.2   devlo:0

可以写到脚本里

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

然后执行脚本,验证一下

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

lvs负载均衡, ipvs的NAT模式,DR模式的实现,


然后进行测试

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

lvs负载均衡, ipvs的NAT模式,DR模式的实现,


Director上看一下,可以看到连接数是相同的

lvs负载均衡, ipvs的NAT模式,DR模式的实现,

从这里可以看出来,上面DIP,VIP,RIP在同一网段时,物理机浏览器测不轮调,是因为MAC地址影响的,这里面加了个路由器,隔离了一些arp的广播报文,所以物理主机没有受到影响。


 这样lvs的lvs-nat和lvs-dr的实验就做完了,如有指教和建议可以留言。