作为一个IT人,在我个人日常的技术部署实践和问题诊断排错过程中,经常会发现一些不正确的网络配置,使得网络链路故障时,网络流量无法被正确引导至冗余路径,致使通讯异常,乃至业务中断。

  下面,将以Dell刀片系统的网络拓扑结构为例,介绍一种被我称为 “网络黑洞”的故障现象及其解决方法。

首先,请看下面这张系统拓扑图:

上图中描绘了一个典型的刀片服务器网络接入场景:在Dell M1000e刀片系统中,单台刀片服务器(M630)通过两个集成网口(网卡1和网卡2),分别与刀片机箱上的交换机相连接(刀箱交换机模块A和刀箱交换机模块B)。刀片服务器网卡1和网卡2配置为Teaming或Bond方式。刀箱交换机模块A和B再通过各自的上行端口分别与核心交换机A和核心交换机B连接,每个刀箱交换机模块出于链路冗余考虑,都采用2条上行链路到核心交换机,每个刀箱交换机用于上行链路的2个端口配置为聚合方式(Port Channel)。两台核心交换机之间通过堆叠方式实现互连。
通过上述方式,我们构建了一个物理层全冗余的网络环境。那么,它真的能够具备我们所希望的网络冗余能力么?接下来,我们将一起分析看看,当这个系统中的某些网络链路出现故障时,会发生什么?

假设一:有一条从刀箱交换机模块A到核心交换机A的上行链路出现故障,如下图所示。

  此时,来自网卡1的流量到达刀箱交换机模块A后,可以被刀箱交换机模块A从另1条未发生故障的上行链路转发到核心交换机B。来自于网卡2的流量到达刀箱交换机模块B后,与此前一样顺利地被转发到核心交换机。除了刀箱交换机模块A到核心交换机的上行链路带宽减少50%以外,不会有任何其他网络访问连通性方面的问题。

假设二:在假设1的基础上,如果上图中刀箱交换机模块A与核心交换机B之间的上行链路也发生故障,如下图所示。

此时,刀箱交换机模块A的上行端口已全部变为“link-down”状态,而它与刀片服务器网卡相连接的内部端口仍然保持“link-up”状态。这种情况下,刀片服务器操作系统的teaming或bond服务组件,确认网卡1和网卡2都是“link-up”状态,不会触发任何网络流量切换动作,一如此前的工作状态,继续发送数据流量到服务器网卡1和网卡2。请注意,此时问题出现了——被发送到网卡1的流量到达刀箱交换机模块A后,因为刀箱交换机模块A上行链路已全部中断,无法被转发至核心交换机,最终这部分数据流无法被送达目的主机,最终会因投递超时被丢弃。这部分流量仿佛落入了“黑洞”一般,得不到任何回应,将导致严重的丢包或断网情况发生。(注:究竟是完全断网还是部分丢包,与刀片服务器上teaming和bond所设定的网卡冗余的具体模式有关。)

出招治理“网络黑洞”
以上所描绘的场景,自然是我们不希望发生的。那么能否有一种方法,可以让刀片服务器的网卡端口状态,可以随着刀箱交换机模块的上行端口的状态实现“联动”呢?下图描绘了我们最希望看到的没有网络“黑洞”愿景:

在上述场景中,我们假想,如果刀箱交换机模块A的2条上行链路全部失效,刀箱交换机模块A发现全部上行链路中断后,可以自动的阻断自己与刀片服务器相连接的交换机端口,使之变为“link-down”状态,那么服务器网卡1也将同步变为“link-down”状态。刀片服务器操作系统的teaming或bond服务组件,将监测到网卡1的状态变化,随时将网络流量全部转移至网卡2,网络流量进一步会由刀箱交换机模块B成功转发给核心交换机,这样就确保了刀片服务器网卡通讯正常,真正实现了原始方案中所设计的服务器网卡冗余的高可用功能,消除了网络“黑洞”现象。

  下面我们将继续沿用Dell刀片系统的网络架构作为例子,来说明防范网络“黑洞”的方法。

在Dell M1000e刀片系统中目前可以配置下面几款刀片交换机模块:
Dell PowerConnect M6220(1GbE/10GbE)
Dell PowerConnect M6348(1GbE/10GbE)
Dell PowerConnect M8024-k(10GbE)
Dell Force10 MXL(10 GbE /40GbE)

  在上面三款Dell PowerConnect系列的交换机中,我们设计了一种端口状态“联动”机制,被称之“连接依赖性(Link Dependency)”。我们可以在交换机配置中,通过建立一个“连接依赖性组”, 把具有依赖性关联的端口添加到这个“连接依赖性组”中,并指明端口之间的“联动”规则,即可实现端口智能联动策略。例如,在前面的场景中,我们可以把“刀箱交换机模块A”上和刀片服务器相连接的端口与和核心交换机连接的聚合端口(Port Channel)配置到同一个“连接依赖性组”中,并设定策略:当连接核心交换机的上行聚合端口(Port Channel)变为“link-down”时,所有与刀片服务器相连接的端口也强制变为“link-down”状态。这个配置策略一旦激活生效,上行聚合端口(Port Channel)的连接状态将持续处于被监视状态,一经发现其链路中断,Port Channel变为“link-down”,交换机与刀片服务器相连接的端口也会即可变为“link-down”,与刀箱交换机模块A连接的服务器网卡1自然也会同步变为“link-down”,服务器端teaming或bond将会检测到网卡1链路失效,并将网络流量完全切换至网卡2。为保证对称性,需要在刀箱交换机模块B上同样进行上述配置。这样,我们就彻底防止了潜在网络“黑洞”的出现,确保了网络的可用性。更多示例,可以在捷拓商贸查看。

PowerConnect交换机配置示例
在PowerConnect交换机的管理控制台上可以通过命令实现上述功能。配置示例如下:
console#configure
console(config)# interface range gigabitethernet 1/0/17-18
console(config-if)#channel-group 1 mode auto
console(config-if)#no shutdown
console(config-if)#exit
console(config)#interface port-channel 1
console(config-if)#switchport mode trunk
console(config-if)#exit
console(config)#link-dependency group 1
console(config-linkDep-group-1)#add gigabitethernet 1/0/1-16
console(config-linkDep-group-1)#depends-on port-channel 1
console(config-linkDep-group-1)#action down
console(config-linkDep-group-1)#exit
console(config)#

配置说明:
首先将刀片交换机模块上的上行端口Gi1/0/17和Gi1/0/18聚合为端口通道Port- Channel1。随后创建“连接依赖性组”link-dependency group1,并将刀片交换机的所有内部端口(Gi1/0/1~Gi1/0/16)作为成员端口添加到连接依赖性组中。最后,指派成员端口所依赖的端口为Port- Channel1,设定联动策略为“action down”,意为如若上行端口状态为“link-down”,则所有内部端口也变为“link-down”。
对于Dell PowerConnect系列交换机,除了CLI命令行访问方式,还为用户提供了Web操作方式,上述配置操作完全也可以通过Web管理界面来实现,操作更为简单便捷。

Dell Force10 MXL万兆交换机配置示例
Dell Force10 MXL万兆交换机模块也具备类似的功能。在Force10的术语中把这种连接依赖性关联机制称之为“上行链路失效监测(Uplink Failure Detection)”。PowerConnect上的“连接依赖性组(link-dependency group)”的概念,在Force10 MXL上被称为“上行链路状态组(uplink-state-group)”,其含义是一样的。

在Force10 MXL上的配置示例如下:
Force10# configure
Force10 (conf)#interface range TengigabitEthernet 0/1 -32
Force10 (conf-if-range-Te-0/1-32)#no shutdown
Force10 (conf-if-range-Te-0/1-32-lacp)#exit
Force10 (conf)#interface port-channel 1
Force10 (conf-if-po-1)#switchport
Force10 (conf-if-po-1)#no shutdown
Force10 (conf-if-po-1)#exit
Force10 (conf)#interface range TengigabitEthernet 0/49-50
Force10 (conf-if-range-Te-0/49-50)#no shutdown
Force10 (conf-if-range-Te-0/49-50)#switchport
Force10 (conf-if-range-Te-0/49-50)#port-channel-protocol lacp
Force10 (conf-if-range-Te-0/49-50-lacp)# port-channel 1 mode active
Force10 (conf-if-range-Te-0/49-50-lacp)#exit
Force10 (conf)# uplink-state-group 1
Force10 (conf-uplink-state-group-1)# deion #Sample Configuration for UFD
Force10 (conf-uplink-state-group-1)# upstream port-channel 1
Force10 (conf-uplink-state-group-1)# downstream TengigabitEthernet 0/1 -32
Force10 (conf-uplink-state-group-1)# downstream disable links all
Force10 (conf-uplink-state-group-1)# downstream auto-recover
Force10 (conf-uplink-state-group-1)# exit

配置说明
首先将刀片Force10 MXL交换机模块上的上行端口Ten 0/49和Ten 0/50聚合为端口通道port-channel1。随后创建“上行链路状态组”uplink-state-group1,并将刀片Force10 MXL交换机的所有内部端口(Ten 0/1~Ten 0/32)作为下行端口(“downstream ”)添加到uplink-state-group1中。最后,再将上行链路 port-channel1作为上行端口类型(“upstream”)添加到uplink-state-group1中。设定联动策略为“downstream disable links all”和“downstream auto-recover”,意为如若上行链路状态为“link-down”,则所有下行端口也变为“link-down”;当上行链路恢复可用时,所有下行同步恢复可用。

本文所探讨的 “网络黑洞”问题,是一个十分常见却容易被忽视的问题。事实上,未经充分的链路切换测试演练的服务器网络环境一旦交付上线投产,事前是很难发现这类潜在隐患的。通常都是在投产后发现了网络连通性问题做故障排查时,才会略见端倪,而此时极有可能已经因此引发了计划外生产业务中断事件,代价高昂。所以,仅有服务器、网络链路的物理冗余的前期设计是远远不够的,必须辅之以全面优化的部署服务才能确保我们所交付的IT基础架构具备真正意义上的高可用。