原文地址:

http://www.chenqing.org/2012/11/%E3%80%90lvs%E3%80%91lvs%E5%B7%A5%E4%BD%9C%E6%80%BB%E7%BB%93%E4%B9%8B%E5%8E%9F%E7%90%86%E7%AF%87.html

博客中还有其他模式和keepalived的原理总结。这篇自己总结标注和整理了一下,自己总结的地方红色标注。

======================================================================================================================================

先解释几个名词:

LB(Load Balancer) :负载均衡器,也就是装有LVS(ipvsadm)的server

VIP(Virtual IP):虚拟IP,也就是给远程客户端(网民)提供服务的外部IP,比如,提供80服务,域名是www.a.com,则www.a.com 对应的A记录就是VIP

LD(Load Balancer Director):同LB,负载均衡调度器

real server:即后端提供真是服务的server,比如你提供的是80服务,那你机器可能就是装着Apache这中web服务器

DIP(Director IP):在NAT模式中是后端realserver的gateway,在DR和Tune中如果使用heartbeat或者keepalived,用来探测使用

RIP(Real Server IP):后端realserver的IP

LVS的三种工作模式

DR(直接路由)

NAT(网络地址转换)

Tune (隧道)

DR(直接路由)

这里我们以及后面的例子我们都会假设这么一个场景,我们使用LVS为我们的web集群提供负载均衡功能:

VIP: 221.130.1.2

DIP1: 221.130.1.3

DIP2: 221.130.1.4

RIP1: 221.130.1.100

RIP2: 221.130.1.101

GATEWAY: 221.130.1.1

关于公网VIP获得:这个IP不能真实存在,不能是服务器的IP,VIP和其他IP必须在一个网段,如果机器均置于IDC机房,只需要向你的IDC申请5个公网IP即可,多余的一个公网ip用于VIP;

DR模式的原理

现在客户端CLient访问www.a.com ,经过dns查询得到目的IP为VIP,目的端口为80,于是客户端和我们VIP,端口80建立连接(TCP三次握手,只是建立连接没有传送数据),之后客户端发送HTTP请求,LVS在VIP上收到之后,根据hash策略,从后端realserver中选

出一台作为此次请求的接受者,假设为RIP1,LVS将请求包的目的mac地址更改为RIP1的mac,然后封装后转发给后端的RIP1,同时将该链接记录在hash表中。

RIP1的某一块网卡,比如eth0,接收到这个转发包看到mac地址是自己的,于是就转发给上层的IP层,IP层解开包后,发现目的的IP地址也是自己,因为VIP也配置在我们的一块non-arp的网卡上(比如lo:0),然后根据IP首部的类型字段(这里是TCP),把请求送给

TCP,然后TCP根据目的端口80,传给应用层的Apache,Apache处理完请求之后,将数据传给TCP,TCP将源端口更改为80 ,源IP更改为VIP,目的端口更改为客户端的端口,目的IP更改为Client的IP,打包后给IP层,IP层根据目的地址进行路由,然后经过网络返给

Client,完成了一次请求,而不经过LB;

这里注意的是,VIP和realserver必须在同一个网段中的(想想为什么?)

DR模式的优缺点

优点:

可扩展性强,ld不会成为业务增长的瓶颈

缺点:

节点不能跨网段,即real server和ld必须在一个物理网段中,一定程度上可能会使用多个公网IP

realserver上须有一块网卡不接受arp广播

DR模式与arp

由于DR模式使用的是更改目的的mac地址,所以难免要和arp打交道。

一般来说客户端是不会和我们的服务器在同一个网段的,那么请求就会经过我们的服务器所在网段的路由设备上,我们知道在同一网段中,两个主机通信靠的是二层的物理地址而不是Ip地址,所以当请求包到达这路由设备上之后,若路由设备的arp表中没有VIP对应的

MAC,就会广播一个arp请求,在这里我们将LVS和real server上都配置了VIP,那么按照理论他们都会响应这个arp请求,那路由器的arp表就会乱了。所以,我们就需要只让LVS上响应VIP的arp请求,而real server 不响应;

Linux主机有这么一个特性,假设我们的主机上有两块网卡,比如eth0,eth1 当arp请求eth1的mac地址的时候,eth1会答复,这个是理所当然的,但是eth0也会“好心”的帮eth1回答这个arp请求; 要防止这样的话,就需要更改下我们的一些内核参数:

net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.all.arp_ignore = 1

正常情况下只写第二条就是了,all 是指所有设备的interface,当all和具体的interface比如lo,按照最大的值生效;

另外一个linux的特性就是,对于一个从realserver发出的arp请求,其源IP是VIP,而出口不会是lo,这里假设是eth0,那么这个arp请求包里里面,源IP就是VIP,源MAC是eth0的mac,目的IP是网关,那么路由器在接收到这个请求的时候,会将将自己的相应接口的硬

件地址放在arp响应包中,同时将请求包中的源IP及MAC放在arp高速缓存中,那这下可就乱套 了,就会使真正的VIP得不到正确的请求了.

这是因为,正常的情况下,arp的请求中源IP是出去的所在接口的地址,mac也是出去的接口的mac,但linux在默认情况下却不是这样的,如果一个接口发出的arp请求须经另一个出口出去的时候,源IP就不是所出去接口的IP,那么将内核参数设置为 2 相应的解决了这个

问题。

net.ipv4.conf.lo.arp_announce = 2

net.ipv4.conf.all.arp_announce = 2

===================

关于arp:
1.什么是arp?

ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获

得的呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。

2.arp协议的工作原理?

在每台安装有TCP/IP协议的电脑里都有一个ARP缓存表,表里的IP地址与MAC地址是一一对应的

我们以主机A( )向主机B( )发送数据为例。当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。如果找到了,也就知道了目标MAC地址,直接把目标MAC地址写入帧里面发送就可以了;如果在ARP缓存表中没有找到相对应的IP地址,主机A就会在

网络上发送一个广播,目标MAC地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:“ 的MAC地址是什么?”网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这样的回应:“ 的MAC地址是00-aa-00-62-

c6-09”。这样,主机A就知道了主机B的MAC地址,它就可以向主机B发送信息了。同时它还更新了自己的ARP缓存表,下次再向主机B发送信息时,直接从ARP缓存表里查找就可以了。ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用,就会被删

除,这样可以大大减少ARP缓存表的长度,加快查询速度。

3.如何查看arp缓存表?

ARP缓存表是可以查看的,也可以添加和修改。在命令提示符下,输入“arp -a”就可以查看ARP缓存表中的内容了

用“arp -d”命令可以删除ARP表中某一行的内容

用“arp -s”可以手动在ARP表中指定IP地址与MAC地址的对应。

===================

其它问题

ip_forward不需要打开,因为LB和real server在同一个网段

一般VIP所在的网卡还配置一个DIP,这是因为如果是用了keepalived等工具做HA或者Load Balance,则在健康检查时需要用到DIP

在realserver上也可以将VIP配置在除RIP所在网卡的其它网卡上

最新文章

  1. Spket在Eclipse下的安装和配置(图文教程)
  2. 【Xpath学习】xpath都不会,说什么你做网站自动化测试的?
  3. WinForm开发框架【细化权限至操作按钮】
  4. BZOJ4446: [Scoi2015]小凸玩密室
  5. javax.imageio.IIOException: Can't create cache file!
  6. ASP.NET Web API 全局权限和全局异常处理
  7. 使用Memcached提高.NET应用程序的性能
  8. 013医疗项目-模块一:加入工具类ResultUtil
  9. 谈谈Objective-C的警告 (转)
  10. iOS - OC RunTime 运行时
  11. java批量插入数据进数据库中
  12. 临时改GCC编译器,重启后失效
  13. 我的MFC学习之路(一)
  14. The difference between text mode and binary mode with file streams
  15. iOS多线程——GCD与NSOperation总结
  16. Unity 3D Framework Designing(1)—— MVVM 模式的设计和实施(Part 2)
  17. HTTP 和 WebSocket的区别
  18. Wordpress上一篇文章和下一篇文章
  19. 【Static Program Analysis - Chapter 1】 Introduction
  20. android 根据滑动隐藏或显示导航 类似手机QQ好友个人信息

热门文章

  1. IE6和IE7中<a>标签宽高设置无效的问题
  2. epon e8-c HG220GS超级密码破解
  3. git使用相关文章的链接
  4. java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'XXXXX' bean
  5. 【HDU 4311】Meeting point-1(前缀和求曼哈顿距离和)
  6. perl sub
  7. win10前面板耳机没声音
  8. 【poj1733】 Parity game
  9. MVC5-10 ModleBinder那点事
  10. gzip、bzip2、tar压缩命令使用