张璇, 陈瑛
(上海杉达学院 信息科学与技术学院,上海 201209)
存储区域网络(Storage Area Network,SAN)作为目前应用最为广泛的存储通道连接技术,核心在于通过FC交换机连接存储设备和服务器主机,建立用于数据存储的区域网络。随着SAN被广泛应用于银行、保险、运营商等企业的大型数据中心生产场景,FC交换机的自动监控和人工干预技术始终是运维人员重点关注的问题之一[1-6]。
在交换机的监控管理领域,使用最广泛的网络监控管理协议是简单网络管理协议SNMP(Simple Network Management Protocol),其相关的研究或文献也屡见不鲜。如赵琳、吴姣等[7]设计了一套基于SNMP的FC网络管理软件,把FC网络上各个节点和交换机定义为MIB库中的实例对象,通过对自扩展的网络管理信息库进行操作和维护,通过FC网络发送查询命令以及相应回复判断网络系统状态,为网络管理者提供决策依据;杨明光、张云飞等[8]利用Python语言编程实现了一种基于SNMP协议的网络交换机状态的监测系统;武韡、石亚军[9]在Windows平台上采用MySQL数据库,通过ODBC连接,从底层开发实现基于SNMP协议的网络预警系统。
但是对于特定产品如FC交换机,SNMP的监控粒度过大,交互能力不足,无法应对突发故障并做出及时响应处理。因此,在日常运维中,客户普遍依赖于各厂家提供的专用工具,或是基于SNMP协议开发的第三方集中监控平台。博通(Broadcom)公司旗下的博科(Brocade)系列交换机(FC Switch)作为目前市场的主流产品,因其可靠性、安全性和高性价比而闻名。然而,受限于Brocade市场推广策略、培训课程及参考资料的不足,国内对于其FC交换技术及其网络设备应用领域的研究并不多见。
本文将以MAPS(Monitoring and Alerting Policy Suite)监控策略为切入点,探讨博科(Brocade)DCX8510 FC交换机(Fabric OS 7.4.2a)的自动运维及干预策略。
博科FC交换机采用自主研发的Fabric OS系统,自Fabric OS 7.2.0开始,引入了Monitoring and Alerting Policy Suite(MAPS)网络监控策略。通过这套监控策略机制,系统可以实时获取硬件状态、触发错误报警,并自动运行各种预定义的保护策略[10]。
(1)MAPS可监控状态
MAPS将其可监控的状态进行归类,共划分为11类,如表1所示。
表1 MAPS监控状态
这些状态划分保证了MAPS对FC交换机系统各模块的详细监测,用户可以根据这些监测值来设计不同的策略及应对动作,以适应各种突发状况。
(2)MAPS默认策略
监控策略(Policy)是针对监控对象所定义的一组规则(Rule)的集合。MAPS默认包含3项策略,涵盖了常用监控状态及其相应阈值,这些默认策略按照监控强度和阈值灵敏度进行划分,旨在简化用户配置流程,以便用户使用时可以在其基础上进行规则的自定义。
简单网络管理协议(SNMP)是目前使用最为广泛的网络管理及设备通讯协议,该协议具有兼容性高、可扩展性强、二次开发度便利等优点。同SNMP协议相比,MAPS存在以下几点明显优势。
(1)部署简单。SNMP采用客户端服务器架构,且需要维护管理信息库(MIB)的内容。相比之下,MAPS仅需要根据不同需求创建策略即可。
(2)针对性强。相比于SNMP的广泛兼容性,MAPS的针对性更强,可以完全满足FC交换机的日常维护要求。
(3)故障处理及时。同使用SNMP的监控平台相比,MAPS可以在发现故障的第一时间实现动作干预,而无需与后台服务器进行通讯响应。
(4)节约成本。同搭建SNMP监控平台相比,使用MAPS的成本及维护时间更少。
对于FC交换机而言,链路错误(Link Layer Issue)是一类最常见且对用户影响最大的故障。生产环境中对于SAN链路错误的判定和排查,通常有3个判定依据场景。
(1)对应链路存在CRC报错且具有“good_eof”标识
(2)对应链路存在大量ENC_OUT、ITW或Link reset事件
(3)对应Port连接的光电转换模块SFP(Small Form-factor Pluggable)存在发送/接收功率(RXP/TXP)异常
其中,场景(2)通常依赖于运维人员的经验判断,而(1)和(2)则可以通过设计监控策略来实现自动运维。本文主要针对(3)即链路错误中常见的RXP/TXP异常设计监控策略,设计FC交换机的自动化运维方案并实现。
本策略主要针对RXP/TXP异常情况处理,通过配置Brocade DCX8510交换机端口(FC Port)的最大发送/接收功率的经验阈值,定义“强制停用对应端口”(Fence)的应对动作(Action)。一旦MAPS监控到功率达到或超过了定义阈值,会自动将对应端口设置为禁用状态(Disable),这样既能够定位并处置了故障端口,也能避免其他设备受到故障链路的影响。
RXP/TXP异常监控策略的设计思路与流程如图1所示。
图1 RXP/TXP异常监控策略设计流程
步骤1:查看系统当前监控阈值
该步骤的目的在于确定系统MAPS默认策略定义的端口最大发送/接收功率(RXP/TXP)监控阈值,并根据当前使用的SFP类型确定合适的监控范围。
系统MAPS默认最大发送、接收功率如图2、图3所示。
图2、图3说明对于不同速率的SFP模块系统默认的RXP和TXP的监控范围。由于当前监控阈值范围过大,远远大于判定故障的经验值100,因此需要重新进行设置,详见步骤3。
图2 系统MAPS默认最大发送功率
图3 系统MAPS默认最大接收功率
步骤2:创建监控策略并关联至相应对象组
为了更好地对监控对象进行管理和划分,MAPS将其监控对象进行了分组(Group)管理,用户可以根据需要创建不同的对象组。对象组具有不同的类型(Type),该类型可以保证组内监控对象的一致性,避免不同对象混用造成的策略设计失误。
查看系统监控对象组、关联策略如图4、图5所示。
图4 查看系统监控对象组
图5 查看系统关联策略
在图4与图5中,使用logicalgroup——show命令和mapspolicy-show-summary命令列出并查看系统现有的监控对象组(Group)及关联策略(Policy),请注意对象组的类型(Type)标志了FC交换机上不同的硬件,如“Port”“Fan”“Power Supply”“WWN”“Sfp”“Blade”“Flash”等,而RXP/TXP监控需要将 “Sfp”作为监控对象的类型。
步骤3:创建规则
监控策略(Policy)是我们针对监控对象所定义的一组规则(Rule)集合。对象组(Group)创建后我们可以将其与设计好的监控策略(Policy)进行关联。为了监控最大发送/接收功率(RXP/TXP),需要分别创建LowRXP和LowTXP两条规则,其采样监测间隔为1小时且该值无法修改,规则触发后的应对动作(Action)为强制停用对应端口(Fence)并将其加入到对应策略(Policy)中。
1.LowRXP规则的创建过程如下。
(1)判定条件:RXP<100时发送SNMP trap。
(2)监控策略:copy_dflt_moderate_policy,采样监测间隔为1小时且该值无法修改,规则触发后的应对动作(Action)为强制停用对应端口(Fence)。
(3)配置命令:
DCX:FID128:admin> mapsrule--create LowRXP-monitor RXP-group ALL_SFP-op l-value 100-action fence-policy copy_dflt_moderate_policy
Rule has been created but policy is not present.
2.LowTXP规则的创建过程如下。
(1)判定条件:TXP<100时发送SNMP trap。
(2)监控策略:copy_dflt_moderate_policy,采样监测间隔为1小时且该值无法修改,规则触发后的应对动作(Action)为强制停用对应端口(Fence)。
(3)配置命令:
DCX:FID128:admin> mapsrule--create LowTXP-monitor TXP-group ALL_SFP-op l-value 100-action fence-policy copy_dflt_moderate_policy
Rule has been created but policy is not present.
步骤4:将步骤3规则导入新策略并启用
上述规则创建后会出现系统提示“Rule has been created but policy is not present”,说明规则已经创建但是策略尚未启用,因此需要使用下列命令启用该策略。
DCX:FID128:admin> mapspolicy--enable < copy_dflt_moderate_policy >
规则和策略创建完成后需要进行可用性测试,如测试出现异常可使用如下命令进行删除回退操作。
DCX:FID128:admin> mapsrule--delete LowRXP
DCX:FID128: admin> mapsrule--delete LowTXP
2.2针对发送/接收功率(RXP/TXP)异常情况定义的动作为“强制停用对应端口”,即“Fence”应对动作。事实上,除了“Fence”“Decommissioning”等针对不同平台及监控对象定义的10余种应对动作外,MAPS还可以自定义全局应对动作。
使用mapsconfig--actions raslog,snmp,email,sfp_margina命令和mapsconfig--show命令可以添加并验证全局MAPS应对动作,如图6所示。
图6 添加并验证全局MAPS应对动作
特别需要注意的是,全局MAPS应对动作的优先级要高于规则中定义的应对动作,一旦两者产生冲突,系统会按照全局动作的设置来进行应对动作。
除了以上通过设置MAPS监控策略实现系统自动运维外,MAPS还预留了与第三方监控平台的通讯接口,将所有的监控信息利用SNMP协议或邮件文本发送给第三方监控平台,帮助相关人员在统一平台下完成决策及维护。
SNMP的网络管理由3部分组成,即SNMP本身、管理信息结构SMI(Structure of Management Information)和管理信息库MIB(Management Information Base)。SNMP定义了管理站和代理之间所交换的分组格式。SMI定义了命名对象和定义对象类型的通用规则,以及把对象和对象的值进行编码的规则。MIB在被管理的实体中创建了对象并规定了其类型。即SMI建立规则,MIB对变量进行说明,而SNMP完成网管的动作[11]。在MAPS设计中,每个MAPS Trap都定义了问题严重级别并包含在MAPS Config Severity Level变量中,如图7所示。
图7 MAPS Traps定义的变量名示意
MAPS Severity Level包含的严重程度级别有“None”“Critical”“Error”“Warings”“Informational”“Debug”几种,通常“Critical”和“Error”表明出现较为严重的硬件错误,需要人工干预,如图8所示。
图8 MAPS SeverityLevel
第三方监控平台可通过SNMP Trap实时抓取数据并进行响应,预警信息通过邮件组进行转发,可以自动关联到短信网关通知到运维人员。首先,SNMP Trap接口接收含有OID 与MIB值的字符串;然后,利用MAPS的MIB库文件,将字符串翻译成明文;最后,经过判断找出带有Critical或Error字段的明文,发送短信。过程如图9所示。
图9 MAPS与第三方监控平台交互设计流程
发送的MAPS短信范例如图10所示。
图10 短信内容范例
利用Python语言设计MAPS与第三方监控平台交互接口的伪代码如下。
(1)使用snmp trap 接口接收oid与mib值
cg = cmdgen.CommandGenerator()#获取CommandGenerator对象
errorIndication, errorStatus, errorIndex, varBinds = cg.getCmd
(
0代表SNMPv1版本,1代表SNMPv2c版本
cmdgen.CommunityData('myagent', 'public', 1),
cmdgen.UdpTransportTarget(('127.0.0.1', 161)), #传输通道
'.1.3.6.1.2.1.1.1.0'#传送的OID
)
print(str(varBinds[0][1]))#varBinds返回MIB值及获得值
(2)使用mib查看器翻译成明文
# Assemble MIB viewer
mibBuilder = builder.MibBuilder()
compiler.addMibCompiler(mibBuilder, sources=['file:///usr/share/snmp/mibs','http://mibs.test.com/test/@mib@'])
mibViewController = view.MibViewController(mibBuilder)
# Pre-load MIB modules we expect to work with
mibBuilder.loadModules('SNMPv2-MIB', 'SNMP-COMMUNITY-MIB')#mib文件的配置
# This is what we can get in TRAP PDU
varBinds =[
('1.3.6.1.2.1.1.3.0', 12345),
('1.3.6.1.6.3.1.1.4.1.0', '1.3.6.1.6.3.1.1.5.2'),
('1.3.6.1.6.3.18.1.3.0', '0.0.0.0'),
('1.3.6.1.6.3.18.1.4.0', ''),
('1.3.6.1.6.3.1.1.4.3.0', '1.3.6.1.4.1.20408.4.1.1.2'),
('1.3.6.1.2.1.1.1.0', 'my system')
]
(3)通过对每一次接收的oid翻译,通过varBins所获得的mid值判断带有critical或error字段
text = '#oid翻译明文
for varBind in varBinds:
a = 0
test = varBind[1].prettyPrint()
text = text + test + ' '
if 'critical' in test:
a = 1
elif 'CRITICAL' in test:
a = 1
elif 'error' in test:
a = 1
elif 'ERROR' in test:
a = 1
(4)根据a 的值来决定是否发送短信
from twilio.rest import Client
# Your Account SID from twilio.com/console
account_sid = "your account sid"
# Your Auth Token from twilio.com/console
auth_token = "your token"
client = Client(account_sid, auth_token)
message = client.messages.create(
# 这里中国的号码前面需要加86
to="+接收者的号码",
from_="+twilio给你的号码 ",
body="text")
print(message.sid)
print(call.sid)
# 发送到短信网关实现报警
本文提出了一种基于博科(Brocade)MAPS(Monitoring and Alerting Policy Suite)监控策略实现FC交换机自动运维的方案,详细介绍了MAPS监控策略的创建、定义、关联及测试回退过程,并尝试利用SNMP Trap接口,将MAPS预警消息同第三方监控平台整合,提供了一种交互报警、人工干预的设计思路。本设计方案旨在尽可能节约资金与人力成本的前提下,充分利用交换机的现有机制,及时发现并自动处理常见交换机故障,为自动化运维工程提供了新的研究方向。