服务器和网络交换机,作为IT基础架构中最为核心的功能组件,是每一位IT系统网络工程技术人员日常接触最多也是最为熟悉的设备类型。无论是负责售前方案设计的架构师,还是担负系统部署和运维的现场工程师,虽然角色分工有所不同,但都有着一个共同的心愿:那就是希望自己设计、部署和运维的系统具有***的可用性,不但平日里能够可靠、稳定和高效地承载上层业务应用,而且当故障发生时还能够按照预先设计的冗余策略实现既定的故障转移、自愈或容错。
作为一个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所设定的网卡冗余的具体模式有关。)
Dell出招治理“网络黑洞”
以上所描绘的场景,自然是我们不希望发生的。那么能否有一种方法,可以让刀片服务器的网卡端口状态,可以随着刀箱交换机模块的上行端口的状态实现“联动”呢?下图描绘了我们最希望看到的没有网络“黑洞”愿景:
在上述场景中,我们假想,如果刀箱交换机模块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)
在上面三款DellPowerConnect系列的交换机中,我们设计了一种端口状态“联动”机制,被称之“连接依赖性(Link Dependency)”。我们可以在交换机配置中,通过建立一个“连接依赖性组”, 把具有依赖性关联的端口添加到这个“连接依赖性组”中,并指明端口之间的“联动”规则,即可实现端口智能联动策略。例如,在前面的场景中,我们可以把“刀箱交换机模块A”上和刀片服务器相连接的端口与和核心交换机连接的聚合端口(Port Channel)配置到同一个“连接依赖性组”中,并设定策略:当连接核心交换机的上行聚合端口(Port Channel)变为“link-down”时,所有与刀片服务器相连接的端口也强制变为“link-down”状态。这个配置策略一旦激活生效,上行聚合端口(Port Channel)的连接状态将持续处于被监视状态,一经发现其链路中断,PortChannel变为“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”。
对于DellPowerConnect系列交换机,除了CLI命令行访问方式,还为用户提供了Web操作方式,上述配置操作完全也可以通过Web管理界面来实现,操作更为简单便捷。
DellForce10 MXL万兆交换机配置示例
DellForce10 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)# description #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~Ten0/32)作为下行端口(“downstream ”)添加到uplink-state-group1中。***,再将上行链路 port-channel1作为上行端口类型(“upstream”)添加到uplink-state-group1中。设定联动策略为“downstream disable links all”和“downstream auto-recover”,意为如若上行链路状态为“link-down”,则所有下行端口也变为“link-down”;当上行链路恢复可用时,所有下行同步恢复可用。
工程师手札
以上示例中涉及到的交换机的配置命令以及更详细的使用说明,感兴趣的朋友可以参考Dell官方技术支持站点提供的《用户手册和用户指南》。通过support.dell.com站点,您只需选择相应的交换机产品型号,在该产品的技术支持页面中可以选择直接在线阅览或免费下载。
本文所探讨的 “网络黑洞”问题,是一个十分常见却容易被忽视的问题。事实上,未经充分的链路切换测试演练的服务器网络环境一旦交付上线投产,事前是很难发现这类潜在隐患的。通常都是在投产后发现了网络连通性问题做故障排查时,才会略见端倪,而此时极有可能已经因此引发了计划外生产业务中断事件,代价高昂。所以,仅有服务器、网络链路的物理冗余的前期设计是远远不够的,必须辅之以全面优化的部署服务才能确保我们所交付的IT基础架构具备真正意义上的高可用。
谨以此文与朋友们分享,在此感谢大家一直以来对Dell的支持和关注!