所属分类: linux&Unix 整理: mopa@163.net 更新日期:2003/7/14 8:49:23 阅读次数:9586

关于双连接的负载均衡



关键词:ADSL,PPP,拨号上网,负载均衡,load balancing

v 0.01, 2002-Oct-31

版权及免责声明:

本文件意在有所助益,但不保证如此,也不对诸如销售或特殊应用之类做任何隐含承诺。如果你的网络、机器或其它因此停止运转或不能正常工作,很抱歉,我将不对此负责。

本文件遵循 Open Publication License v1.0 或更高版本。最高版本可在此网站获得:

http://www.opencontent.org/openpub/

本文件及其副本可以任何格式和媒介自由散发(包括销售或赠送)而无须向作者缴纳任何费用。然而任何修正及/或建议,皆须通知文件的维护者。只须符合以下条件,您也可创建自己的派生版本:派生版本必须遵循相同版权(即Open Publication License v1.0 或更高版本)。

Jing Tuo 版权所有 (c) 2002。

节省大家时间,首先说主旨:

包级别的 TCP/UDP 负载均衡和NAT(Network Address Translate)不能并存。

这是什么意思呢?简单来说,如果你有动态IP的连接,一个使用私有IP地址的局域网,通过NAT(Network Address Translate)上网,现在觉得速度不够,想再加一条使到某一Internet主机的速度加倍(现在中国大陆的典型情况),对不起,你就死了这条心吧,这是不可能的。

这里所说的连接包括 Ethernet,PPPoE,PPPoA,PPP,以及SLIP等等。并且,这是TCP/UDP 协议的内在机制造成的,和软/硬件无关。任何架构在 TCP/UDP 之上的应用,不论硬件还是软件,皆不能绕过此限制。

注意,如果你的局域网使用公用IP(public IP)而不需要NAT,则不在此列。

如果你想知道原因或者质疑我的结论:),请继续往下读。

本文假设

1.你已经阅读过 Linux Advanced Routing & Traffic Control HOWTO,特别是 4.2 小节的 Routing for multiple uplinks/providers,4.2.1小节Split access 和4.2.2小节 Load balancing。此文(以下按惯例简称lartc)非常清楚的说明了连接级别的TCP/UDP 负载均衡。

________

+------------+ /

| | |

+--- NATed ---+ Provider 1 +-------

__ IP1 | 100.0.0.1 | | / remote host 1

___/ \__ +------+-------+ +------------+ |

_/ \_ | if1 | /

/ local host 1\ | | |

| Local network -----+ Linux router | | Internet

\_local host 2/ | | |

\__ __/ | if2 | \

\___/ +------+-------+ +------------+ |

IP2 | 150.0.0.1 | | \ remote host 2

+--- NATed ---+ Provider 2 +-------

| | |

+------------+ \________

上面这幅示意图即摘自 lartc,官方站点是 http://lartc.org/。为行文方便,列在这里并做轻微改动,特此说明。

2.为便于理解,以下以常见的Linux 下 ADSL PPPoE 拨号上网为例,但如前所述,讨论适用于其它各种情况。用数对(IP address, port)来表示一个连结的端点。假定

Host IP Port

-------------------------------------

local host 1 192.168.0.1 5000

Linux route if1 100.0.0.1 6000

Linux route if2 150.0.0.1 7000

remote host 1 200.0.0.1 80

-------------------------------------

那么连接级别和包级别的负载均衡究竟有何不同?

1、连结级别的负载均衡

Linux 2.4内核支持连结级别的负载均衡。为理解这个问题,这里首先简述 Linux 的静态路由机制。当一部 Linux 主机收到一个需要转发的IP包时,它首先检查Cache中是否有相关的路由信息:如果有的话,会直接使用;否则再查找路由表。Cache中一段时间不使用的路由信息会被丢弃。如果设置了 MultiPath 路由,则选择哪一个路由是随机的,但随后的IP包都会走这条路由,直到Cache中的路由信息被丢弃。

比如,当LAN上的主机 local host 1 向 remote host 1 发起一次连结的时候,Linux router 在Cache中找不到有关remote host 1 的路由信息,因此转去查找路由表,当它发现有一个 MultiPath 路由的时候,会随机选择一个路由,比方说 if1,并把此路由加入Cache;下一个从 local hsot 1到 remote host 1 的 IP 包到达时,Linux router 直接在Cache 中找到路由信息然后直接转发,也就是说,所有目的地为 remote host 1 的 IP 包都会经由 if1 转发直到 Cache 中相关路由信息失效并被丢弃为止而不会经过if2,即使if2完全空闲也是如此。

因此,和 remote host 1 之间的通信并不会从附加的第二条连接中获益。其实际效果就是你用 Realplay 看网络电影时效果没有改善,当然心理作用除外:)

如果与此同时 local host 1 有发起一条到 remote host 2 的连接,则有可能这一次会使用 if2。其实际效果就是你用 Realplay 看网络电影时用 flashget开8个并发线程到一个FTP站下载一个 600M Redhat ISO 文件,两者不会互相影响。

那么,下载 ISO 文件的同时 localhost 2 发起一条到 remote host 2 的连接,会出现怎样的情况?是简单地走if1?又或别有蹊径?请读者思考。

2、包级别的负载均衡

现实中这种一边忙一边无所事事的情况在所多有,毋庸赘述:)。那么如何改善呢?很自然的想到,我们可以把同一条TCP/IP连接中的IP包同时从两条上行连接中发出,左右开弓,不就可以了吗?实际上,我们在 PPP Multilink 就是这么干的,不过现在没有服务器的支持,要靠自己。这是Internet,因此已经有人想到这一点并且编写了内核补丁供下载,请搜索 equalize_2.4.18.patch。

需要特别提醒你的是,请确保该补丁的日期是 Fri Mar 22 2002,而不是有问题的 Thu Mar 21 2002 版本。另外,根据我的经验,这个 patch 也可以用于 2.4.19 内核。

重新编译了内核以后,你可以使用 equalize 关键字了。如果你的 LAN 使用公有 IP 地址,那么恭喜你,你现在可以在双倍速度下用 Realplay 看网络电影了。但是正所谓人生不如意事常八九,如果你使用的是私有 IP 地址配合以NAT上网,让我们来看看当 local host 1 对 remote host 1 发起一次连结时会发生什么。

local host 1 第一次从(192.168.0.1,5000)向 remote host 1 (200.0.0.1, 80) 发起一条连接,现在第一个 IP 包 (SYN 包)已经到达 Linux router。既然是第一次,Cache 中当然没有有关路由信息,Linux router 查找路由表,发现带 equalize 标记的 MultiPath 路由,因此随机决定如何转发此IP 包 -- 好,这次茫茫中命里注定从 if2 走:) 并且雁过留声,在 Cache 中添加一条到 remote host 1 的路由信息-- 既然 local host 1 的 IP 是私有的,NAT 起作用,转换源地址为 (150.0.0.1,7000)后发出,没问题,remote host 1 收到并向 (150.0.0.1,7000) 发回SYN+ACK 包表示接受连结。Linux router if2 收到返回的 SYN+ACK 包,早有准备,NAT 再次转换目的地址为 (192.168.0.1, 5000)。

第一回合。到目前为止一切 OK。

紧接着 local host 1 (192.168.0.1, 5000) 按规矩再向 (200.0.0.1, 80) 发送 ACK 包表示确认。此 ACK 包又来到Linux router 这个岔路口,它将走向何方呢?既然设定了 equalize,Linux 不会根据先前生成的路由表 Cache 中的记录(就是由 SYN 包生成的)来决定走法,相反,它从 Cache 中删除该记录,然后重新查找路由表。这导致又一次重新选择路由,可能是 if1,也可能是 if2。

如果又是 if2,很好,remote host 1 收到,握手完成,连接建立。

若是 if1,又当如何呢?很不幸,if1 将该包源地址经 NAT 转换为 (100.0.0.1,6000),然后丢上 Internet,一路平安到达 remote host 1。remote host 1 正在苦等从 if2 (也就是 150.0.0.1,7000) 来的 ACK 包,没想却收到一个从(100.0.0.1,6000) 来的 ACK 包,它作何打算呢?难道说,反正是 ACK 包,马马虎虎将就着用用吗?很明显,这不是个好主意。其次,即便意欲如此,remote host 1 如何判断这个 ACK 包和哪一个 SYN 包关联呢?因此,

唯一合理的措施就是:忽略它,当没看见好了。

丢弃此来路不明的 ACK 包后,remote host 1 继续等待中......结果可想而知:不能同步,连结建立失败。这里 TCP/IP 的重传机制并不能解决问题,remote host 1 并不认为这是一个正常的 TCP 包,虽然它是一个正常的 IP 包。

刚才提到如果走的是 if2,非常幸运,连接可以建立。同样,以后 remote host 1 会收到所有数据包,不论是从 if1还是 if2 来的,只是从 if1 来的 TCP 包一概按例办理,全部丢弃。好在local host 1 会重传这些被丢弃的包,总有机会走到 if2 而被收到,因此连结还可以勉强维持,只是比较慢而已;当然,在某种极端情况下,也可能中途断掉。

所以,equalize 负载均衡和 NAT 在一起工作,可能会导致建立连结失败或者较缓慢的连结。换句话说,1+1 < 1。

最后有一个好消息,不是大好,是小好:ICMP 协议在此种情况下可以工作,也许你可以试着用它干点什么。当然这也意味着一个使用动态IP对你发动 ICMP 攻击的黑客有双倍的可用带宽:)

注1:2.4内核中 MultiPath 设定的具体的位置在 Networking options -> TCP/IP networking -> IP: advanced router -> IP: equal cost multipath,.config 文件中的对应行为 CONFIG_IP_ROUTE_MULTIPATH

注2:iproute2 的手册明确指出,仅当内核打过补丁的情况下 equalize 关键字才能工作,原文"equalize only works if the kernel is patched." iproute2-ss010824, p26.

注3:本文所说的随机并不是真正意义的随机,但我们假定考察真正随机的情况。

注4:对于如何处理所谓"来路不明的 ACK 包",可能是实现相关的,还请了解的朋友说一说。

附录A

关于 lartc 中 split access 和 load-balancing 设置的一点说明:

在 load-balancing 小节中提到"如果你已经如前所述设置了 split access 的话 load-balancing 真的不是太难"。而在 split access 小节中就给出了一堆命令,T1 T2 P1 P2 IF1 IF2 什么的。很多人不明白这些命令到底有何作用。其实这些命令是说,到 P1_NET 去的走 if1,到 P2_NET 去的走 if2,大家各行其道。那么,我到 P1_NET 去的走if2,到 P2_NET 去的走 if1,可不可以呢?理论上也是可以的,但是这里有个问题。如果 P1_NET 和 P2_NET 分属两家不同的 ISP,则从 if2 到 P1_NET 就要走远路经过交换中心,而这可能会造成瓶颈。

至于从 P1_NET 和 P2_NET 回来的包,已经超出了我们的控制范围,只能等它到 IF1或 IF2。如果出于某种原因路由不正常,没有收到回音,那我们能做的也只是承认失败而已。

因此这段命令想要防止舍近求远,如此而已。

另外这段命令似乎有点问题。我已经在lartc邮件列表中请求帮助了,希望能尽快有一个满意的答复。

在搞清楚这一点后,如果读者的 P1_NET 和 P2_NET 和我一样其实是同一家 ISP 的网络,这段准备功夫是完全可以省去的。

意见和建议

大家认为有不正确、不妥当、不清楚的地方,请百忙中不吝赐教,以便改进。谢谢。

email : mopa@163.net


--------------------------------------------------------------------------------

相关文章
Elasticsearch之配置详解 2017/6/5 9:18:45
Elasticsearch之配置详解 2017/6/5 9:18:38
迁移到原生云应用架构 2017/2/13 17:26:00
干货 | 常见的大数据术语表(中英对照) 2017/1/24 16:15:22
如何在阿里云上构建高可用应用 2017/1/24 16:08:45
接入而非拥有,深入浅出谈云计算经济学的现实价值 2017/1/24 16:08:14
APACHE+TOMCAT的简单HA配置 2015/10/9 10:50:48
如何做好大型数据中心的运维? 2015/9/24 8:53:09
运维的85条军规 2015/9/21 8:54:31
系统架构师经验总结 2014/12/18 15:48:36
从攻到防,深入浅出DDoS 2014/4/23 10:15:26
Cisco交换机链路聚合实例 2013/6/21 19:13:17
SUSE Linux 11里Nginx+Resin+JSP+Memcached+MySQL安装配置整合 2013/3/15 16:59:34
Nginx配置文件nginx.conf中文详解 2013/3/15 16:55:52
在Nginx下针对IP和目录限速 2013/3/15 16:51:14
23道思科网络面试题及解答 2011/3/22 12:58:43
备份与应急恢复系统功能实现 2010/3/31 13:04:58
网络流量控制对管理起到的作用 2009/11/28 14:34:26
服务器虚拟化对网络配置的影响 2009/4/21 12:56:09
使用apache+resin实现负载均衡设置 2009/3/27 12:26:46
谈不同网络层面上的网络负载均衡技术 2008/7/31 8:44:17
在Linux操作系统中,通过bonding 绑定实现网络负载均衡 2008/6/1 17:48:14
实现Qos 2008/1/10 17:47:02
如何配置交换机TRUNK 2007/11/19 13:55:25
基本的域名服务器配置举例 2007/8/8 9:02:28
Linux 2.6.19.x 内核编译配置选项简介 2007/5/29 7:55:59
路由器电信、网通双线路智能切换配置指导 2007/4/4 13:59:19
Cisco IOS Cookbook 中文精简版第二十二章第一跳冗余协议 2007/4/2 10:07:49
Cisco IOS Cookbook 中文精简版第二十一章 NAT 2007/4/2 10:06:43
Cisco IOS Cookbook 中文精简版第九章 BGP 2007/3/28 9:01:56
Linux各版本上的多网卡绑定(Debian和Ubuntu,SuSE,Fedora和RH) 2007/3/22 11:03:07
NAT中TCP负载均衡实验总结 2006/10/12 13:59:25
以太网交换机性能比较对照指标详解 2006/7/4 19:46:33
服务器的日志合并统计 2006/6/17 11:31:34
解决双出口校园网瓶颈 2006/6/17 9:47:20
区分服务与MPLS的区别 2006/5/30 14:01:17
核心交换机的TRUNK配置详细讲解 2006/5/23 7:55:44
CDN的网络架构 2006/5/9 21:06:33
企业网站服务器负载均衡技术 2006/5/8 19:33:36
实现四台Web服务器的负载均衡 2006/5/8 19:32:09
一种动态网络负载平衡集群的实践方法 2006/5/8 19:30:46
网络负载均衡技术概况 2006/5/8 19:29:56
CDN 内容分发网络技术 2006/5/8 15:30:39
RFC2328 OSPF V2 中文版 2006/4/27 20:40:32
如何利用负载均衡来提升网络性能 2006/4/6 19:57:30
负载均衡技术的三种实现方法 2006/4/6 19:53:21
基于MPLS的流量工程要求(RFC2702) 2006/3/30 21:57:05
策略路由概览 2006/3/8 11:15:41
用route map实现多ISP Internet接入工程实例 2006/3/6 8:39:09
排除路由故障 2006/3/1 8:37:26
思科IOS 12.3新特性 2005/11/21 9:32:14
多服务器的日志合并统计 2005/8/29 15:16:44
负载均衡技术全攻略 2005/8/19 8:33:25
Web服务器日志统计分析完全解决方案 2005/8/10 12:27:24
路由选择原理 2005/8/4 12:49:14
从二层到七层交换机技术适用环境介绍 2005/7/10 10:38:41
教你识别思科交换机型号 2005/6/11 21:49:53
深度包检测技术工作原理简介 2005/4/26 9:18:02
从二层到七层交换机技术适用环境介绍 2005/4/26 9:16:24
通俗易懂的《路由和交换》 2004/11/19 9:24:31
交换机的种类 2004/11/9 14:19:33
实现四台Web服务器的负载均衡 2004/9/1 11:15:32
深入浅出了解交换机是怎么工作的 2004/8/16 8:21:07
实现四台服务器的负载均衡 2004/8/13 13:01:59
Cisco 路由配置语句汇总 2004/8/10 12:26:42
NAT后无法在内网通过外部IP访问内部服务的问题的详细说明 2004/7/27 17:12:50
网闸40问 2004/7/26 8:43:18
NAT的原理及其注意事项 2004/7/23 10:19:21
第四层交换 2004/6/18 8:07:38
CCNP路由部分精华 2004/1/6 11:10:54
交换机类型(机架式,固定配置式带/不带扩展槽) 2003/11/19 10:45:55
路由器性能指标详解 2003/11/19 10:45:09
IS-IS路由协议学习总结 2003/11/4 9:53:23
局域网交换机维护 2003/11/3 8:45:18
在防火墙环境下DNS的安装与设置 2003/10/30 11:24:12
用windows2000实现双机热备 2003/10/22 8:10:28
CISCO 技术大集合 2003/9/8 7:46:34
新版CCNA 640-801考试IOS命令大全(ZT) 2003/8/27 17:39:13
以太网交换机性能比较对照指标详解 2003/8/22 11:35:37
Redhat advance server 2.1集群的安装与管理 2003/8/12 8:21:31
思科产品常见问题一百问 2003/7/30 14:17:30
4006交换机(IOS版)简明配置维护手册 2003/7/28 18:02:12
CISCO交换机概览 2003/7/28 15:14:40
用实验快速掌握DNS配置 2003/7/21 8:38:23
网络工程师必懂的专业术语 2003/7/14 16:54:43
[转帖]实现四台服务器的负载均衡 2003/7/13 19:03:25
[精华手册]CISCO路由器配置手册 2003/7/13 19:01:40
Linux环境下多链路负载均衡 2003/7/13 18:12:01
路由的中文笔记 2003/7/8 12:22:30
Linux下实现集群负载均衡 2003/5/25 21:04:02
理解防火墙及防火墙实例系列: 第二部分 unix 下的防火墙软件 ipfilter 2003/1/12 15:47:31


感性空间
设计&运维
网络技术
休闲娱乐
NetFilter
linux&Unix
网络安全
程序空间
软件考试
RFC&ISO
规划&规范
虚拟&存储
Apple技巧
云计算&大数据



文章搜索



站内搜索