VMware NIC Teaming技术探讨
首先,说明几个知识要点:
(1) 所有3种类型的VMware网络都支持NIC Teaming (复习提问:哪3种类型?答:VMkernel, Service Console和VM port group)
(2) uplink连接到那些物理交换机的端口都必须在同一个Broadcast domain中。(也就是必须在同一个VLAN中,不能跨路由)
(3) 如果uplink要配置VLAN,则每个uplink必须都配置成VLAN Trunk并且具有相同的VLAN配置。
(4) VMware的负载均衡(Load Balancing)只是出站(Outbound)的负载均衡。(概念类似于HP术语中的TLB。关于HP负载均衡的术语详见拙文《HP NIC Teaming技术探讨》,但是它和TLB其实不同,关于这一点,请看后文解释)
(参考:p192. Scott Lowe, 《Mastering VMware vSphere 4.0》)
(5) NIC Teaming的Load Balancing和一些高级路由算法的Load Balancing不同,它不是按照Teaming中网卡上通过的数据流量来负载均衡,而是根据网卡上的连接(connection)来进行负载均衡。
【VMware的3种负载均衡】
VMware的NIC Teaming Load Balancing策略有3种。
(1) 基于端口的负载均衡(默认)
(2) 基于源MAC的负载均衡
(3) 基于IP hash的负载均衡
基于端口的负载均衡 (Route based on the originating virtual port ID)
这种方式下,负载均衡是基于vPort ID的。一个vPort和Host上的一个pNIC(从vSwitch角度看就是某个uplink)捆绑在一起,只有当这个pNIC失效的时候,才切到另外的pNIC链路上。这种方式的负载均衡只有在vPort数量大于pNIC的数量时才生效。
什么是vport?一个VM上的vNIC或者某一个VMKernel或者Service Console的某个vswif。用一个图来直观的表述,vPort在下图中显示为vSwitch上左侧的那些绿点。而pNIC在图中显示为右边的vmnicX。(还记得创建一个vSwitch时候,默认的port数是56吗?你可以设置一个vSwitch的Port数为8,24,56,120,248,504或1016,看出什么规律来了没?对的,是2的某次方减8。这是因为VMKernel需要保留8个port的缘故)
对于VM来说,因为某台VM的vNIC是捆绑在某一个pNIC上的,也就是说这台VM(如果只有一个vNIC的话)对外的数据流量将固定在某一个pNIC上。这种负载均衡是在VM之间的均衡,对于某一台VM而言,其uplink的速率不可能大于单个pNIC的速率。此外,只有当VM的数量足够多,并且这些VM之间的数据流量基本一致的情况下,Host上的NIC Teaming的Load Balancing才较为有效。对于以下这些极端情况,基于端口方式的负载均衡根本不起作用或者效果很差,充其量只能说是一种端口冗余。
(1)Host上只有一台只具有单vNIC的VM (此时完全没有Load balancing)
(2)Host上的VM数量比pNIC少(比如有4台VM但是Teaming中有5块pNIC,此时有一块pNIC完全没用上,其他每个vNIC各自使用一块pNIC,此时也没有任何负载均衡实现)
(3)Host上虽然有多台VM,但是99%的网络流量都是某一台VM产生的
基于源MAC地址的负载均衡 Route based on source MAC hash
这种方式下,负载均衡的实现是基于源MAC地址的。因为每个vNIC总是具有一个固定的MAC地址,因此这种方式的负载均衡同基于端口的负载均衡具有同样的缺点。同样是要求vPort数量大于pNIC的时候才会有效。同样是vNIC的速率不会大于单个pNIC的速率。
基于IP Hash的负载均衡 Route based on IP hash
这种方式下,负载均衡的实现是根据源IP地址和目的IP地址的。因此同一台VM(源IP地址总是固定的)到不同目的的数据流,就会因为目的IP的不同,走不同的pNIC。只有这种方式下,VM对外的流量的负载均衡才能真正实现。
不要忘记,VMware是不关心对端物理交换机的配置的,VMware的负载均衡只负责从Host出站的流量(outbound),因此要做到Inbound的负载均衡,必须在物理交换机上做同样IP Hash方式的配置。此时,pNIC必须连接到同一个物理交换机上。
需要注意的是,VMware不支持动态链路聚合协议(例如802.3ad LACP或者Cisco的PAgP),因此只能实现静态的链路聚合。(类似于HP的SLB)。不仅如此,对端的交换机设置静态链路聚合的时候也要设置成IP Hash的算法。否则这种方式的负载均衡将无法实现。 比如Cisco 3560上的默认Etherchannel的算法是源MAC,因此需要将其修改成源和目的IP。
首先查看交换机的负载均衡的算法:
show etherchannel load-balance
然后用修改负载均衡算法为src-dst-ip
port-channel load-balance src-dst-ip
要点:配置IP Hash方式pNIC对端的物理交换机端口,要记得关闭802.3ad LACP和PAgP以减少这些动态协议带来的不必要网络开销,加快链路在failover时的转换速度。
这种方式的缺点是,因为pNIC是连接到同一台物理交换机的,因此存在交换机的单点失败问题。(这和HP SLB的缺点一样,详见拙文《HP NIC Teaming技术探讨》)。此外,在点对点的链路中(比如VMotion),2端地址总是固定的,所以基于IP Hash的链路选择算法就失去了意义。
不管采用以上哪一种方法的Load Balancing,它会增加总聚合带宽,但不会提升某单个连接所获的带宽。为啥会这样?同一个Session中的数据包为啥不能做到Load Balancing?这是因为网络的7层模型中,一个Session在传输过程中会被拆分成多个数据包,并且到目的之后再重组,他们必须具有一定的顺序,如果这个顺序弄乱了,那么到达目的重组出来的信息就是一堆无意义的乱码。这就要求同一个session的数据包必须在同一个物理链路中按照顺序传输过去。所以,10条1Gb链路组成的10Gb的聚合链路,一定不如单条10Gb链路来的高速和有效。
【选择】
那么应该选择哪种NIC Teaming方式呢?大拿Scott Lowe建议:
- 如果物理交换机使用链路聚合,必须设为“Route based on IP hash”
- 如果不是使用链路聚合,可以设为任何其它设置。大多数情况下,接受默认设置“Route based on originating virtual port ID”是最好的。
【更好的选择及其缺陷】
还有没有更好选择?答案是有。Cross-Stack Link Aggregation,跨堆叠交换机的链路聚合。
堆叠交换机通过堆叠线连接在一起,组成一个交换机堆叠栈。堆叠栈中的交换机共享同一个Forwarding Table。
堆叠交换机组在逻辑上被视作1台交换机,但是在物理上则是2台或多台不同的设备。
这和NIC Teaming是不是很像?
Teamport 在逻辑上是一个端口,但是在物理上却是2个或多个端口。
(突然想到,在一切都套上“虚拟化”的帽子的今日,不知道以后交换机堆叠技术会不会改名为交换机虚拟化?就像存在了多少年的RAID突然被套上了磁盘虚拟化的帽子一样,笑~~)
如图,SLB中的2条链路就可以不局限在同一台物理交换机上了,而可以分别连接到2台堆叠在一起的物理交换机上(切记,交换机堆叠必须连成环以保证冗余性)。此时,SLB的最大缺陷——交换机的单点失败就被克服了。这样,就可以既达到容错又达到双向负载均衡的目的了。
但是,这种方式的缺点是要求物理交换机具有堆叠能力。很遗憾的是,HP支持工程师告诉我,到目前为止,HP用于c-class刀片服务器机箱的所有以太网交换机都不支持堆叠。(信息获取时间2010年1月,不排除以后HP会提供支持堆叠的刀片交换机)
NIC Teaming技术探讨原创文档,NIC Teaming技术将2个或更多个网卡(HP NIC Teaming最多可达8个)捆绑在一起使用,以达到增加总的带宽(Load Balance,负载均衡)或者线路容错(Fault Tolerance)的目的。由2个或多个网卡组成一个逻辑网络端口Teamport,IP地址和网络设置绑定在这个逻辑的Teamport上,这样,无论哪一个物理网卡或者其相连的链路单独出现故障,Teamport还是能正常工作,服务器对外的网络连接不会中断。
为了方便说明,除非特别说明,本文以下部分的例子中将2个或多个网卡一律写成2个网卡,示意图也只画2个网卡。
HP服务器的NIC Teaming分三大类共7个选项,这三大类是指NFT、TLB和SLB。(7个选项后文会说明)
【NFT】
NFT 就是Network Fault Tolerant的缩写,这种模式下一个网卡处于活动(Active)状态,而另外一个网卡处于待机(standby)状态,平时只有一个网卡在用。NFT模式下,组成Teamport的2个1Gb的网卡分别连到2个不同的交换机,Teamport总带宽只有1Gb,这种模式具有容错能力,但是不具有增加带宽和负载均衡的能力。
【TLB】
TLB就是Transmit Load Balance,从字面上理解,就是传出(Tx)的负载均衡,也就是说,从服务器向外部发送的数据包,根据一定的规则,分别从Teamport中的2个网卡传出去,但是这种方式,不能保证接受(Rx)的数据包也同样能够负载均衡。简单的说,TLB可以做到网络容错,Teamport的Tx是2Gb带宽,Rx还是只有1Gb(除非有另外的方法来做负载均衡)
【SLB】
SLB是Switch-assist Load Balance,顾名思义,交换机协助的负载均衡,就是需要在交换机上进行相应的配置以后才能实现。SLB Team中的2个网卡必须连接到同一个交换机,这2个网卡到同一交换机的2个端口之间的链路就合并组成一个通道,这个通道Cisco交换机术语叫Etherchannel,其他厂商的交换机则常称这个为Port Trunk。这种组成联合通道的方式也称之为静态的链路聚合(SLA, Static Link Aggregation)。SLB方式的Teamport是双向2Gb,Tx和Rx的数据流都可以做到负载均衡,但是它只能保证网卡的容错,做不到交换机的容错。
注意(1):应用SLB时还要特别注意SLB的负载均衡实现方式和对端交换机的限制。一般而言,很多厂商的交换机,都要求同一个聚合链路中的每个端口都必须是一致的,例如千兆端口不能和百兆端口聚合,百兆全双工的端口不能和百兆半双工的端口聚合。
注意(2): 不同厂商的负载均衡的算法有所不同,比如某些型号的Cisco交换机的Etherchannel是Layer 2的,有3种Load Balancing方式:基于源MAC,基于目的MAC和XOR方式;而其他一些型号或其他厂商的交换机还可以根据源IP,IP Hash或者TCP Session等的方式。如要继续深入研究并理解这些算法的优劣,请参考相关交换机厂商的文档。
【NFT/TLB/SLB比较】
这三种方式的比较如下: NFT TLB SLB 网卡容错 支持 支持 支持 交换机容错 支持 支持 不支持 Tx负载均衡 不支持 支持 支持 Rx负载均衡 不支持 不支持 支持 【HP的NIC Teaming】
HP Proliant系列服务器的NIC Teaming是通过其PSP(Proliant Support Pack)中的NCU (Network Configuration Utility)来实现的。双击右下Systray中的HP网络工具的小图标,就能打开NCU配置界面。
从下面的截图我们可以看见,HP Network Team #1是一个Teamport,它由2个HP NC7782千兆端口组成。Teamport左边的绿色图标说明它目前工作正常。端口1是实线,说明其处于Active状态,端口2有一部分虚灰的颜色,表明这个链路是Standby的。
点击Teamport,然后点Property按钮,就可以打开Teamport的属性配置界面,在这里,我们可以选择HP NIC Teaming的类型。
从图中我们可以看到,HP的Team类型有7个选择,分别是
- Automatic (Recommended)
- 802.3ad Dynamic with Fault Tolerance
- Switch-assisted Load Balancing with Fault Tolerance (SLB)
- Transmit Load Balancing with Fault Tolerance (TLB)
- Transmit Load Balancing with Fault Tolerance and Preference Order
- Network Fault Tolerance Only (NFT)
- Network Fault Tolerance with Preference Order
我们发现上面这些选择中毫无例外的都注明了Fault Tolerance,这恰恰说明了NIC Teaming的最重要的目的:容错。
这其中的SLB, TLB, NFT前文已经介绍过了。这里再解释下其他几个。
【NFT with PO和TLB with PO】
Preference Order就是指一种优先顺序,这种顺序往往是根据链路类型、速率等方式决定的。
NFT with Preference Order就是带有优先顺序的NFT。举例说明,比如一台NFT的Teamport是由一个千兆的Port A和一个百兆的Port B组成的,则Port A由于传输速率快,优于Port B,所以Port A会成为Active,而Port B则为Standby。TLB with Preference Order同理,通常用于将不同速率端口绑定在一起的情况下。
【802.3ad Dynamic】
和SLB类似,802.3ad Dynamic 方式也是到同一台交换机的链路聚合,只不过不是手工配置(静态)的,而是自动协商(动态构成)的。它是通过一种智能的链路协商协议LACP (Link Aggregation Control Protocol)来实现的。LACP原本用于交换机和交换机之间的链路聚合,启用了LACP协议的2台交换机会相互发送LACP的协商报文,当发现2者之间有多条可用的链路的时候,自动将这些链路组合成一条带宽更大的逻辑链路,从而利用负载均衡来实现加宽交换机间链路带宽的目的。HP的NIC Teaming也支持动态链路聚合,可以实现在HP服务器和支持802.3ad 动态LACP的交换机之间自动创建聚合链路。
【Automatic】
Automatic (Recommended) 其实不是一种单独的模式,当选择Automatic的时候,会判断Team中的这些port是不是连接到同一个支持802.3ad Dynamic LACP协议的交换机,如果是,则选择802.3ad Dynamic方式;如果不是,则使用TLB方式。