最近项目上需要使用到IPVS进行负载均衡,针对外部传来的HTTP请求,分摊到多台服务器上进行处理,所以看了一下这方面的资料,在这里纪录一下。

Lvs是基于IP层和内容分发请求的负载均衡方法(所以也可以叫IPVS)。所谓负载均衡,就是分担给多个服务器进行处理。

IPVS有三种常见的负载均衡技术,NAT/DR/TUN 三种方式。也算是有各自的优劣点吧。

_ VS/NAT VS/TUN VS/DR

Server any Tunneling Non-arp device

server network private LAN/WAN LAN

server number low (10~20) High (100) High (100)

server gateway load balancer own router Own router

先放出官方对比的表。

因为是在内部网络下搭建的,所以我们使用的方法是在一台机器上面创建多个虚拟机的方式进行模拟多个机器的方式进行测试,这样可以避免中间因为网络情况复杂,而且对实践还不太明白的时候出现太多错误。

1.IPVS/NAT模式:这种模式下由一台负载均衡服务器充当网关,将消息转发给后台几台web server进行处理,后台服务器将对应的response回应给负载均衡服务器,再返回给各个用户,这样用户也不会感知到有实际服务器的存在,类似于反向代理。但是这种模式下的负载均衡服务器容易成为瓶颈。

 

在这里,我直接使用了负载均衡服务器充当了网关,所以后面几台服务器的路由都要指向它。

中间遇到的坑是:

(1)由于在虚拟机中按NAT分配的时候,会自动给虚拟网络的路由表分配一条指向默认网关的路由规则,如果直接添加的时候,会出现curl: (56) Recv failure: Connection reset by peer, 这种情况需要仔细检查下路由表。

2.IPVS/DR模式,这种模式下需要将负载均衡服务器和后台的real server在物理上在一个网段内。在负载均衡服务器接受到请求之后,可以直接将数据帧的MAC地址写成对应的选出的real server的mac地址。并且由该服务器直接返回给对应的请求者。

 

配置的时候主要要记得关闭real server的arp表发现和更新功能,这样可以避免request无法转发到合适的服务器。

3 IPVS/TUN模式,这种模式运用IP隧道模式,甚至可以直接在IP包外层封装IP包,再将对应的链接转发给指定的real server, 由对应的real server将IP包处理,关于包的细节可以用wireshark进行监听查看。

 

中间用WireShark抓的包如下图所示。

 

这里主要的坑是在设置webServer的时候,记得将 rp_filter  参数关闭掉。rp_filter的作用是控制系统是否开启对数据包源地址的校验,会检测反向路径是否是最佳路由路径(严格)/或者是否能通(宽松),不是就丢掉。如果不关掉可能会出现有些请求显示被转发给real server,但是对应的real server并没有响应纪录。

关于IPVS的几种负载均衡算法,这里只测试了rr/wrr/lc/wlc方式,而其他两种针对访问的目的地址去做负载均衡的方法,找了很多资料之后实在无法理解到,先纪录在这里。

关于IPVS的一些调试方法:

1、使用route和ping,tcpdump等工具检查对应的网络连接情况。

2、使用ipvsadm的命令查看转发情况和转发tcp/UDP状态

root@roaddb-VirtualBox:/home/roaddb# ipvsadm -l --stats

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes

-> RemoteAddress:Port

TCP 10.69.142.28:http 100 564 432 40110 83556

-> 10.0.2.4:http 33 231 165 16995 37290

-> 10.0.2.5:http 33 231 165 16995 37290

-> 10.0.2.15:http 34 102 102 6120 8976

root@roaddb-VirtualBox:/home/roaddb# ipvsadm -l -c

IPVS connection entries

pro expire state source virtual destination

TCP 00:52 SYN_RECV 10.69.142.70:57004 10.69.142.80:http 10.69.142.73:http

3.检查对应的Nginx log确认转发的情况。

关于keepalived,keepalived主要用来做前端负载均衡服务器的备份,可以在负载均衡服务器挂掉的时候自动使用backup机进行替换,并且对后端的真实服务器可以起监督作用,当有真实服务器挂掉的时候,通过把权重置位0的方式迅速的切换过来。keepalived的原理是路由选举算法。文档地址:http://www.keepalived.org/doc/

keepalived的配置项中主要有两个配置要注意:

(1)inhibit_on_failure 这个参数主要是为了监视真实服务器的情况,在挂掉的情况下可以不转发给这个服务器,起起来的时候也可以重新配回规则

(2)persistence_timeout 这个是连接的粘连参数,可以在一段时间内把链接都转发给选定的服务器。

进一步进行备份的还有heartbeat等,说是比keepalived的功能更强大[doing]


————————————————