摘要:
巩固、集成、重构和移植是当今流行的标语式词汇。它们反映了一个除旧迎新的过程--旧者不是从本质上被更改就是被新者替代而弃之一旁。然而,在许多情况下,我们还是无法摆脱旧的设备和软件。不得不继续从老掉牙的基础结构中提取更多的服务,以及负责它们的管理。巩固、集成、重构和移植是当今流行的标语式词汇。它们反映了一个除旧迎新的过程--旧者不是从本质上被更改就是被新者替代而弃之一旁。然而,在许多情况下,我们还是无法摆脱旧的设备和软件。不得不继续从老掉牙的基础结构中提取更多的服务,以及负责它们的管理。
Java 动态管理工具包 (Java Dynamic Management Kit, JDMK)是一个用于创建基于 Java 的管理软件和基于 SNMP 的遗留系统的框架。它是对 Java 管理扩展 (Java Management Extensions,JMX) 的扩展,JMX 允许分析程序通过网络实现对资源的远程监视。
下文中的一个文件包含一个受管对象的列表,这些对象可以被 JDMK 代码引用。下表摘录了部分 RFC1213_MIBOidTable.java 文件。(本文的所有代码都可以从资源部分直接下载。)此文件是根据另一标准的 MIB 文件生成的。
//感兴趣的受管对象的元数据(Metadata)定义
new SnmpOidRecord("ifInOctets", "1.3.6.1.2.1.2.2.1.10", "C"),
new SnmpOidRecord("ifLastChange", "1.3.6.1.2.1.2.2.1.9", "T"),
new SnmpOidRecord("ifOperStatus", "1.3.6.1.2.1.2.2.1.8", "I"),
每个 SnmpOidRecord 中的符号都可以通过网络管理软件直接访问。也是我们管理网络设备的接口。
稍后,我们将探索 JDMK 关于遗留设备管理的一些独道之处。我们将了解到,使用 JDMK 制造单项级别的管理工具是一种简单、省钱的方法。这些工具可以帮助 IT 管理者加深对网络原理和网络服务的认识。
另外还介绍了,使用适配器模式作为访问 JDMK API 的方法。这增加了我们使用标准 API 的抽象级别。
寒酸的遗产
想象您被提升为只有两名手下的网管。负责四个部门共 200 人的所有计算机设备。部分任务还联系到公司局域网、电话系统支持、PC 升级、应用程序开发、服务器等等。基本上包括了所有网络任务。
让我们假设图 1 是您所负责的网络。
在图 1 中,我们看到一个三层建筑的设备分布图。 每层上的设备都连接到一个开关(正如大多数情况),这些链接每个具有 10 M 带宽并终止于一个线路盒(未显示)。 开头的另一端连接到一个建筑层级别的开关(第一层开关为 F1,第二层为 F2,第三层为 F3)。 层开关的另一端由高速链接连接到一个核心开关。 它的另一端则可能连接到 WAN 或一个服务提供网络。
由图 1 我们也许会立即发现一些问题。 问题存在的部位是:
Links 1, 2 , 3
Switch Core 与层开关之间的链接
各个独立的开关
永远记住网络的性能取决于它最脆弱的一环 -- 也就是说网络是非常脆弱的。 网络设计者的任务就是维持服务的流量与提供信息冗余度两者之间的平衡。 在图 1 中,有一些弱点是可以从再次审视中改进的。 下面将着重讨论通过编写 JDMK 代码来帮助我们了解,问题会在何时出现以及问题在何时将要出现。
入门指南 IT 管理者的一项很重要的工作就是识别网络的薄弱点。 这需要你与用户和前任管理人员(如果可能)细心地交谈来收集信息以及一些鼓励信息收集的办法。 每个网络都有其不足之处! 一些网络链接可能会时不时地过载;一两个路由或开关可能会剥落,服务器许可也许会过期。
一位细心的前任也许会在交接时将这些至关重要的信息告诉你。 让我们假设他是一位好心的想帮助你顺利进入角色的前任。 比如说,他会提醒你“小心 Link 1 -- 它有一些堵塞,一层的用户对此颇有微词。” 这是重要的内部信息,我们将在稍后的 Java 编码中使用到。
大多数情况下,网络是由一些薄弱的脚本和内部决窍组织在一起的组合体。 我在本文中想说的是,制造一个帮助维护网络的 JDMK 工具是一件相当直接了当的事情。 当然,无法代之以一个设计优秀、维护良好的网络,但即使属于这种情况,Java 工具还是可以提供一些辅助功能。
借助标准应用程序 HP OpenView Network Node Manager (NNM) 提供了一个被广泛使用的应用程序,该程序既可以在企业网络中使用也可以用于提供服务的网络。 它提供了许多有用的功能,其中包括动态发现和映射网络设备、接收通知消息以及添加自己喜欢的软件等功能。 简言之,NNM 提供了一个可以看见网络的用户界面。 如果您能够使用 NNM,那么它可以提供无限的对网络的发现和监视功能。 如果不能,也不必失望!
实现高效 IT 管理的决窍落在对自动工具的选择上。 如果你有高端应用程序软件,那么就使用它。 我们正跨入一个自动化计算的时代,系统和软件执行自我管理的趋势将更为突出。 在你的 IT 管理任务中尽可能地使用软件解决方案,才能早日踏上这一特快列车!
创建软件实现轻松管理 使用 JDMK,我们可能创建用于侦听事件和读取设备状态的激活信息的软件。 在本文中,我们将着重于后者,并说明主要原则。
开始,我将编写一个简单的程序,用于识别一个网络并确定它是否有过于拥挤的趋势。 这将通过对此链接一端的接口上的 SNMP 计数器进行取样并计算平均值来完成。 有一些标准对象是由设备上运行的 SNMP 实体维护的。 有时,SNMP 实体在默认情况下是非运行状态(即本例中的情况),我将假设网络管理员(例如,你的前任)选择了在所有设备上运行可用的 SNMP。 让我们描述一下对代码的简单要求。
我们选择的管理要求 我们创建的软件需要满足以下简单要求:
返回指定接口的操作状态。
计算指定接口的流量级别。
确定指定链接是否趋于拥挤。
接口通常具有 administrative(管理性) 和 operational(操作性) 语句。 管理性语句被网管们广泛使用,例如,“I want this interface to be up. (我需要这个接口向上转行。)” 操作性语句是操作接口的语句。 试着将操作语句想象为请求语句的网络应答。 如果管理语句向上转行,而操作语句向下转行,那么肯定是出了问题。
我将在以太网中使用的接口类型,特定为 10Mbps (或 10,000,000bps)。 我将检索一个快照,它的数据来自图 1 中 Link 1 一端的接口上接收的流入字节数。 接着,过一段时间并检索同一计数器的值。 两者之间的不同就是我们要利用的值。 现在,让我们来看一些源代码。
源代码 我使用的 Java 类是 RequestData。 它包括一个 main() 方法,并使用以下 JDMK 资源:
import com.sun.management.snmp.SnmpDefinitions;
import com.sun.management.snmp.SnmpOid;
import com.sun.management.snmp.SnmpVarBindList;
import com.sun.management.snmp.manager.SnmpPeer;
开始,我对 SNMP 管理 API 进行了初始化。 以便对上文提到的生成表进行访问。
final SnmpOidTableSupport oidTable =
new RFC1213_MIBOidTable();
SnmpOid.setSnmpOidTable(oidTable);
接下来,我创建了一个 SnmpPeer 对象。 它表示我们要与之通信的实体。 请注意,它将传入的端口作为命令行参数使用。
final SnmpPeer agent =
new SnmpPeer(host, Integer.parseInt(port));
现在必需创建一个与远程实体的通信会话。 这需要我们指定 SNMP 通信字符串。 这些数据元素将用于与 agent 关联。
final SnmpParameters params =
new SnmpParameters("public", "private");
agent.setParams(params);
我们就要成功了! 现在必需构建会话以管理请求数据,并准备好创建请求数据列表(或等效的捆绑列表)。
final SnmpSession session =
new SnmpSession("SyncManager session");
session.setDefaultPeer(agent);
final SnmpVarBindList list =
new SnmpVarBindList(
"SyncManager varbind list");
该程序是一个构建了 SNMP 请求消息的单个 JDMK 类。 该消息使用以下代码指定了四个对象:
// 对主机设备的描述
list.addVarBind("sysDescr.0");
// 接口 1 上的操作性语句
list.addVarBind("ifOperStatus.1");
// 接口 1 上传入的 octets 的数量
list.addVarBind("ifInOctets.1");
// 接口 1 的速度
list.addVarBind("ifSpeed.1");
四个请求对象被打包到一个 SNMP getRequest 消息中,并按如下方式发送给接收实体:
SnmpRequest request =
session.snmpGetRequest(null, list);
现在,我们两次收到了相同的对象集;使用以下代码计算两者的时间差:
// 计算消息间隔时间
long oldTime = date1.getTime();
long newTime = new Date().getTime();
long elapsed = (newTime - oldTime) / MS_DIVIDEND;
println("Elapsed time in seconds " + elapsed);
在本部分中,将获取一个最近的时间,并使之减去前一检索中记录的时间值。 这样便可以粗略地估计出数据样品间的时间消耗。
显示返回的值时,可以看到以下主要元素:
Value : 25625, Object ID : 1.3.6.1.2.1.2.2.1.5.1 (Syntax : Gauge32)
Value : 10000000
>> Press Enter to resend the request.
Elapsed time in seconds 16
Value : 26005, Object ID : 1.3.6.1.2.1.2.2.1.5.1 (Syntax : Gauge32)
Value : 10000000
三个粗体显示的项表示 ifInOctets 对象的两个值具有 16 秒的间隔时间。 选择的接口(支持速度为 10,000,000bps)在 T1 时间接收到 25625 octets (或字节),T2 时间接收到 26005 octets。 要确定传入链接的使用率,需要用到以下公式:
Incoming Link % Utilization =
((T2 octets - T1 octets) * 8 * 100) /
(ifSpeed * Sample speed)
计算出的使用率为 (26005 - 25625) * 8 * 100/(10,000,000 * 16) = 0.0019%。
显然,该接口在传入端的负载很轻。 可以在传出端进行类似的测量(使用 ifOutOctets 对象)。 然后,把两个值相加确定是否过载。 很明显,进行任何数值计算都需要特别的小心(瞬时数据的快照变化非常快),但还是可以利用它们在接口上的负载量作细微的观察。
对负载情况细心地进行一天的观察,也许会发现为什么离职的前任网管要提醒你注意 Link 1。不管是什么情况,这都意味着你正在开始了解网络的秘密。 将这个方法应用到网络的其他区域,定会帮助从中加强认识。
运行例子 要运行程序,需要安装 JDMK。 可以从 Sun Microsystems 下载免费评估版本,该版本将在 90 天后过期。 所以不要肆意运行这些代码! 再者,如果你中过几次彩票的话,可以试着购买 JDMK。
对于其他情况,按照 examples\current\Snmp\Manager\ReadMe 文件中的介绍操作,其中的例子应该可以顺利地编译和运行。 我使用 JDMK 5.1 版本。 另外,在我的 Network Management, MIBs & MPLS: Principles, Design & Implementation -- 不需要中彩票就买得起 -- 一书中还提到了一些更详细和深入的信息!
谨记:使用模式 强烈推荐使用适配器模式来隐藏 JDMK API 的复杂信息。 严格地说,JDMK 本身不是十分复杂,但它是专用的。 出于这个原因,不要让应用程序代码调用其 API 就变得重要起来。 适配器为完成这一设计目标提供了一个有用的模型。
适配器用于向应用程序代码说明 JDMK (或其他)技术的详细信息。 你的代码将调用适配器,而不是直接使用 JDMK 接口。 所以,如果你从 JDMK 转向使用别的技术,更改代码所需的时间也会被大大地缩短。
一些设计模式的书中介绍了有关适配器模式的详细信息以及其应用程序,例如 O'Reilly 的 Head First Design Patterns。
总结 对遗留系统及其设备的支持是一项困难而艰巨的任务,特别是 IT 预算和人员水平急剧压缩的情况下。 然而,具有冒险精神的 Java 开发者不会惧怕任何挑战! 利用网络管理和 SNMP 的一些简单概念,可以快速创建强大的基于 JDMK 的软件工具。 这些工具可以用于监视网络问题的方方面面,同时你也会获得更多有趣的任务。 它们还可能帮助你解决久而未决的疑问。
希望对捕获消息、创建自己的 agent 和 menager、使用浏览器访问管理界面等 JDMK 功能的介绍能够起到抛砖引玉的作用。需要提醒的是,我们一方面看到的是网络管理在概念上的简单性,另一方面是网络运行中潜在的无限复杂性。 JDMK 为促进这两个方面提供了一片肥沃的土壤。