在本文中,我们将讨论监控 IBM Storwize 存储系统和其他支持 CIM/WBEM 协议的存储系统。 这种监控的需要被排除在外;我们将认为这是一个公理。 我们将使用Zabbix作为监控系统。
在最新版本的 Zabbix 中,公司开始更加关注模板 - 开始出现用于通过 IPMI 监控服务、DBMS、服务器硬件(IMM/iBMC)的模板。 存储系统监控仍然在开箱即用的模板之外,因此要将有关存储组件的状态和性能的信息集成到 Zabbix 中,您需要使用自定义模板。 我提请您注意其中一个模板。
首先是一点理论。
要访问 IBM Storwize 存储系统的状态和统计信息,您可以使用:
- CIM/WBEM 协议;
- (从软件版本 8.1.3 开始受 IBM Storwize 支持);
- SNMP 陷阱(有限的陷阱集,无统计数据);
- 通过 SSH 连接,然后远程连接 .
有兴趣的人可以在供应商文档的相关部分以及文档中了解有关各种监控方法的更多信息 .
我们将使用CIM/WBEM协议,该协议使我们能够获取存储系统的运行参数,而无需针对不同的存储系统进行重大的软件更改。 CIM/WBEM 协议按照以下规则运行 。 存储管理计划 – 规范基于开放标准 и , 决定 .
WBEM 在 HTTP 协议之上运行。 通过 WBEM,您不仅可以使用存储系统,还可以使用 HBA、交换机和磁带库。
根据 и SMI 实现的主要组件是 WBEM 服务器,它处理来自 WBEM 客户端(在我们的例子中,来自监控脚本)的 CIM-XML 请求:

CIM 是一种基于统一建模语言(UML)的面向对象模型。
托管元素被定义为具有表示托管数据和功能的属性和方法的 CIM 类。
根据 ,要通过 CIM/WBEM 访问存储系统,您可以使用 PyWBEM - 一个用 Python 编写的开源库,它为开发人员和系统管理员提供了 CIM 协议的实现,用于访问 CIM 对象并通过运行在 WBEM 中的 WBEM 服务器执行各种操作符合 SMI-S 或其他 CIM 规范。
为了连接到 WBEM 服务器,我们使用类构造函数 :
conn = pywbem.WBEMConnection(server_uri, (self.login, self.password),
namespace, no_verification=True)
这是虚拟连接,因为 CIM-XML/WBEM 在 HTTP 之上运行,因此当在 WBEMConnection 类的实例上调用方法时,就会发生真正的连接。 根据 IBM System Storage SAN Volume Controller 和 Storwize V7000 最佳实践和性能指南(示例 C-8,第 412 页),我们将使用“root/ibm”作为 IBM Storwize 存储系统的 CIM 命名空间。
请注意,要通过 CIM-XML/WBEM 协议收集统计信息,您必须将用户包含在适当的安全组中。 否则,执行 WBEM 查询时,类实例属性的输出将为空.
要访问存储统计信息,调用构造函数的用户 ,必须至少具有 RestrictedAdmin(适用于 code_level > 7.8.0)或管理员权限(出于安全原因不推荐)。
我们通过 SSH 连接到存储系统并查看组号:
> lsusergrp
id name role remote
0 SecurityAdmin SecurityAdmin no
1 Administrator Administrator no
2 CopyOperator CopyOperator no
3 Service Service no
4 Monitor Monitor no
5 RestrictedAdmin RestrictedAdmin no
将zabbix用户添加到所需的组中:
> chuser -usergrp 5 zabbix
此外,根据 IBM System Storage SAN Volume Controller 和 Storwize V7000 最佳实践和性能指南 (p. 415),您必须在存储系统上启用统计信息收集。 因此,每分钟收集统计数据:
> startstats -interval 1
检查:
> lssystem | grep statistics
statistics_status on
statistics_frequency 1
要获取所有现有存储类,必须使用 EnumerateClassNames() 方法。
示例:
classnames = conn.EnumerateClassNames(namespace='root/ibm', DeepInheritance=True)
for classname in classnames:
print (classname)
该方法用于获取存储系统参数的值 WBEMConnection 类,返回实例列表 .
示例:
instances = conn.EnumerateInstances(classname,
namespace=nd_parameters['name_space'])
for instance in instances:
for prop_name, prop_value in instance.items():
print(' %s: %r' % (prop_name, prop_value))
对于某些包含大量实例的类(例如 IBMTSSVC_StorageVolume),对所有实例的完整查询可能会非常慢。 它可以生成大量数据,这些数据必须由存储系统准备、通过网络传输并由脚本处理。 对于这种情况有一种方法 ,它允许我们只获取我们感兴趣的类实例的属性。 此方法涉及使用类似 SQL 的查询语言(CIM 查询语言 (DMTF:CQL) 或 WBEM 查询语言 (WQL))来查询 CIM 存储对象:
request = 'SELECT Name FROM IBMTSSVC_StorageVolumeStatistics'
objects_perfs_cim = wbem_connection.ExecQuery('DMTF:CQL', request)
要确定我们需要哪些类来获取存储对象的参数,请阅读文档,例如 .
因此,要获取物理磁盘(磁盘驱动器)的参数(不是性能计数器),我们将轮询类 IBMTSSVC_DiskDrive,获取卷参数 - 类 IBMTSSVC_StorageVolume,获取阵列参数 - 类 IBMTSSVC_Array,获取 MDisks 参数 - 类 IBMTSSVC_BackendVolume,等等。
对于性能,您可以阅读 (具体来说 - )以及 IBM System Storage SAN Volume Controller 和 Storwize V7000 最佳实践和性能指南(示例 C-11,第 415 页)。
要获取卷的存储统计信息,您必须指定 IBMTSSVC_StorageVolumeStatistics 作为 ClassName 参数的值。 收集统计信息所需的 IBMTSSVC_StorageVolumeStatistics 类的属性可以在以下位置查看 .
此外,对于性能分析,您可以使用 IBMTSSVC_BackendVolumeStatistics、IBMTSSVC_DiskDriveStatistics、IBMTSSVC_NodeStatistics 类。
为了将数据记录到监控系统中,我们将使用该机制 ,在Python模块中实现 。 我们将存储系统类的结构及其属性放入 JSON 格式的字典中。
我们将模板上传到Zabbix服务器,确保监控服务器可以通过WEB协议(TCP/5989)访问存储系统,并将配置文件、检测和监控脚本放置在监控服务器上。 接下来,将脚本启动添加到调度程序。 结果是:我们发现存储对象(阵列、物理和虚拟磁盘、盘柜等),将它们传输到 Zabbix discovery,读取其参数的状态,读取性能统计信息(性能计数器),将所有这些传输到相应的 Zabbix我们模板的项目。
Zabbix模板,python脚本,存储类的结构及其属性,以及配置文件的示例,您可以 .
来源: habr.com
