分享

LVS+keepalived学习 --生产环境实践(单公网IP

 忧郁_小刚 2011-04-25
LVS+keepalived学习 --生产环境实践(单公网IP) (2010-09-09 16:56:41)
 

(2010-08-24 13:31:09)

这次主要是了解一下lvs+keepalived的DR模式在生产环境中是如何被应用的。
原文地址:http://hi.baidu.com/bikong0411/blog/item/9f4817ca1f48ecf053664f50.html
首先了解DR模式原理:
DR(Direct Routing)模式也被称为直接路由模式,实现此模式时LVS Route只实现IP分发功能,应用服务器收到IP数据包并处理后,通过自身来实现IP地址转换,将数据直接传送给用户。在此模式下,LVS Route只对TCP/IP数据包的头信息进行处理,然后直接路由到应用服务器,不需要处理应用服务器返回的数据信息,因此性能较高,如图所示。

(点击查看大图)图12-34 LVS DR模式

(1) LVS Route接收用户发来的消息,根据调度算法进行IP分流,将数据包发送到后端应用服务器。

(2) 应用服务器执行相应的操作后,将结果直接返回给客户

可见在处理过程中LVS Route只处理请求的直接路由转发,所有响应结果由各个应用服务器自行处理,并对用户进行回复,网络流量将集中在路由器之上。DR模式是3种模式中性能最好的,唯一的缺陷在于它要求LVS Route及所有应用服务器在同一个网段中,因此不能实现集群的跨网段应用



LVS+keepalived搭建负载均衡学习手札(五)

就以上的逻辑图看分析:
①如果四台机器均置于IDC机房,前端无防火墙时,这种情况好处理,只需要向你的IDC申请5个公网IP即可,多余的一个公网ip用于VIP;
②如果是上述网络拓扑,后面四台机器均用内网;此时只需要前面的Juniper将内网VIP映射成公网IP即可,注:非映射80和443端口,感谢田逸兄提供的技术性指导意见;
③lvs就比较依赖于网络环境,可以用苛求来形容;要做好LVS管理员,确实得跟进学习很多有关网络通信方面的知识,就不再是一个HTTP那么简单了;相对而言,nginx对网络的依赖较小,理论上只要ping得通,网页访问正常,nginx就能连得通。
④ 本来我想将公司的web环境生级成LVS+Keepalived架构,却发现lvs怎么都不能转发;结果查了下机器的route情况,发现每台机器都有十几条静态路由,二个网关,而Network engineer也说明了网络环境不可能更改,只能由系统环境牵就网络环境;最后只能将LVS+Keepalvied更改为 Nginx+Keepalived架构,甚是遗憾。

这里首先说下LVS/DR的网络拓扑情况,如果均置于电信IDC机房,用5个外网IP的话,整个网络拓扑清晰明了,实施起来也非常方便;但如果是置于 Juniper防火墙后,情况就有点小复杂了,这时仍可用内网IP,只要将内网的VIP通过Juniper防火墙转换成一个公网IP即可,注:此时不要做 80端口的映射,在这里感谢田逸兄的指导性意见。


明白了以上的道理就好办了,我现在仅有一个公网IP,我分给VIP使用,在防火墙上做MIP,将这个公网IP映射成一个私网IP(和web集群为一个网段),VS/DR 通过改写请求报文的MAC地址(改为选出服务器的MAC地址),再将修改后的数据帧发送给选出的web服务器。因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该IP报文。当服务器发现报文的目标地址VIP是在本地的网络设备上(lo:0口),服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。

DR模式下:
应用服务器执行相应的操作后,将结果直接返回给客户。这句话没错,但更容易理解的话应该这么说:应用服务器执行相应操作后,通过lo:0口(也就是vip的地址),将结果返回给客户,这也就是为什么整个的架构中,仅需vip有公网IP,然后通过防火墙将公网IP做个mip到私网即可!
测试如下:在客户端2.176上抓包,其中2.188是vip
15:01:36.548415 IP 192.168.2.176.32806 > 192.168.2.188.http: S 2146846702:2146846702(0) win 5840 <mss 1460,sackOK,timestamp 88811212 0,nop,wscale 2>
15:01:36.549460 IP 192.168.2.188.http > 192.168.2.176.32806: S 3578986656:3578986656(0) ack 2146846703 win 5792 <mss 1460,sackOK,timestamp 1266709313 88811212,nop,wscale 2>
15:01:36.549480 IP 192.168.2.176.32806 > 192.168.2.188.http: . ack 1 win 1460 <nop,nop,timestamp 88811213 1266709313>
15:01:36.550199 IP 192.168.2.176.32806 > 192.168.2.188.http: P 1:121(120) ack 1 win 1460 <nop,nop,timestamp 88811213 1266709313>
15:01:36.551065 IP 192.168.2.188.http > 192.168.2.176.32806: . ack 121 win 1448 <nop,nop,timestamp 1266709315 88811213>
15:01:36.552261 IP 192.168.2.188.http > 192.168.2.176.32806: P 1:276(275) ack 121 win 1448 <nop,nop,timestamp 1266709315 88811213>
15:01:36.552274 IP 192.168.2.176.32806 > 192.168.2.188.http: . ack 276 win 1728 <nop,nop,timestamp 88811215 1266709315>
15:01:36.552602 IP 192.168.2.188.http > 192.168.2.176.32806: F 276:276(0) ack 121 win 1448 <nop,nop,timestamp 1266709316 88811213>
15:01:36.591798 IP 192.168.2.176.32806 > 192.168.2.188.http: F 121:121(0) ack 277 win 1728 <nop,nop,timestamp 88811255 1266709316>
15:01:36.592361 IP 192.168.2.188.http > 192.168.2.176.32806: . ack 122 win 1448 <nop,nop,timestamp 1266709355 88811255>
发现和客户端2.176在保持会话的其实一直是vip(实际是vip中的一台realserver!),所以这台realserver依旧通过vip的地址将请求转给客户端!那同理了,如果vip是公网IP,那realserver也会通过这个公网IP将请求发给客户!
在realserver上抓包:
15:50:22.347643 IP 192.168.2.176.32808 > 192.168.2.188.http: S 926785111:926785111(0) win 5840 <mss 1460,sackOK,timestamp 91734798 0,nop,wscale 2>
15:50:22.347719 IP 192.168.2.188.http > 192.168.2.176.32808: S 2377278632:2377278632(0) ack 926785112 win 5792 <mss 1460,sackOK,timestamp 1269633035 91734798,nop,wscale 2>
15:50:22.351310 IP 192.168.2.176.32808 > 192.168.2.188.http: . ack 1 win 1460 <nop,nop,timestamp 91734800 1269633035>
15:50:22.351383 IP 192.168.2.176.32808 > 192.168.2.188.http: P 1:121(120) ack 1 win 1460 <nop,nop,timestamp 91734800 1269633035>
15:50:22.351470 IP 192.168.2.188.http > 192.168.2.176.32808: . ack 121 win 1448 <nop,nop,timestamp 1269633039 91734800>
15:50:22.354468 IP 192.168.2.188.http > 192.168.2.176.32808: P 1:276(275) ack 121 win 1448 <nop,nop,timestamp 1269633042 91734800>
15:50:22.354888 IP 192.168.2.188.http > 192.168.2.176.32808: F 276:276(0) ack 121 win 1448 <nop,nop,timestamp 1269633042 91734800>
15:50:22.354980 IP 192.168.2.176.32808 > 192.168.2.188.http: . ack 276 win 1728 <nop,nop,timestamp 91734807 1269633042>
15:50:22.357216 IP 192.168.2.176.32808 > 192.168.2.188.http: F 121:121(0) ack 277 win 1728 <nop,nop,timestamp 91734809 1269633042>
192.168.2.188,注意到了吗?实际也是访问的VIP,realserver也是将自己当成vip来处理数据。


实际测试:
vip:192.168.2.188
server1:192.168.2.158 (有a.com和b.com虚拟主机)
server2:192.168.2.189 (有a.com和b.com虚拟主机)
客户端--防火墙--vip (这里防火墙将一个公网IP NAT成vip的私网IP,客户端将a.com和b.com的解析指到公网IP)
测试成功。!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多