Globus Toolkit 的监控和发现服务(MDS)组件使用了一个可扩展的框架来管理有关计算网格及其所有组件(网络、计算机节点、存储系统和工具)状态的静态和动态信息。MDS 的优点包括:
- 访问有关系统组件的静态和动态信息
- 统一灵活地访问信息
- 访问多个信息源
- 异构动态环境中进行配置和调整的基础
- 分散维护
可以使用 MDS 来回答下列有关网格状态的问题:
- 什么资源是可用的
- 计算网格的状态是什么?
- 如何根据底层系统的配置来优化应用程序?
MDS 使用轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP)作为访问该信息的接口。但是,您可以使用许多商用或开放源码软件组件来实现 MDS 的基本功能,这些功能包括如下:
- 建立到 MDS 服务器的连接
- 在 MDS 中查询内容
- 显示查询结果并断开与服务器的连接
MDS 提供了发现网格中机器、计算机和网络特性的方法,这些特性包括当时可用的处理器数目、提供的带宽和存储器类型(磁带或磁盘)。通过使用 LDAP 服务器,MDS 在公共接口中提供了中间件信息,从而将统一的图象放在全异资源的顶部。
网格资源信息服务(GRIS)提供了在计算网格上查询资源以获取其当前的配置、功能和状态的统一方法。GRIS 是一种分布式信息服务,通过将查询定向到作为 Globus 服务一部分部署在网格资源上的信息提供程序,从而可以回答有关某一特定资源的查询。该服务所提供的信息示例包括主机身份(操作系统和版本)以及更多的动态信息(CPU 和内存可用性)。
网格索引信息服务(GIIS)组合了任意 GRIS 服务,来为网格应用程序提供浏览和搜索功能。在计算网格的一致映象(coherent image)中,GIIS 提供了标识特别重要的资源(比如计算资源、存储器、数据和网络的可用性)的方法。
Java 商品网格(Java Commodity Grid,CoG)工具箱提供了可以用来在网格上查询 GRIS 和 GIIS 服务的工具。这些类位于 org.globus.mds 包(请参阅
参考资料)中。也可以查看下面的清单 1。
清单 1. 一个查询 MDS 的 Java 类
package com.ibm.globus.services.mds;
import org.globus.mds.*;
import java.util.Hashtable;
import java.util.Enumeration;
/**
* A Java Class to query information from the Globus MDS service
*/
public class MDSService {
// Default MDS server parameters. Change to fit your Global MDS server
values
private final String _MDS_SERVER = "global-pool-giis.intragrid.ibm.com";
private final String _MDS_BASE_DN = "Mds-Vo-name=POOL-CONTACT,o=grid";
// Our Grid uses port 2135. Default globus MDS port is 391
private final String _MDS_PORT = "2135";
private MDS _mds = null;
/**
* Constructors
* @param _MDS_SERVER LDAP Host
* @param _MDS_PORT LDAP port
* @param _MDS_BASE_DN LDAP search Dn (Distinguished name)
*/
public MDSService() {
_mds = new MDS(_MDS_SERVER, _MDS_PORT, _MDS_BASE_DN);
}
public MDSService(String host, String port, String baseDN) {
_mds = new MDS(host, port, baseDN);
}
|
org.globus.mds 包支持连接到 MDS 服务器、查询内容、打印查询结果并断开与该服务器的连接。它提供了一个中间应用层,您可以轻松地适应不同的 LDAP 客户机库,比如 JNDI、Netscape SDK 和 Microsoft SDK。当前的发行版基于 JNDI。
使用该 Java 类的第一步就是通过发出下面这行代码来建立连接(即调用 MDS 构造函数):
MDS mds = new MDS("www.globus.org", "389", "o=Globus, c=US") ;这个类的参数有:MDS 服务器的名称、端口号(缺省情况下为 389)和专有名称或基本目录。LDAP 查询在基本目录(DN)上进行搜索。缺省值为
o=Globus, c=US 。
注:网格可以使用另一种设置。下面的清单 2 显示了搜索代码。
清单 2:搜索 MDS
/**
* This method performs the actual MDS search.
* @param filter search filter to be used. Ex: (objectClass=*)
*/
public String HostInfoLookup(String filter) {
try {
// Attributes to be returned by the search
String[] attribs = null;
_mds.connect();
// The MDS pkg returns a Multi-valued hashtable
Hashtable t = _mds.search(filter, attribs, _mds.SUBTREE_SCOPE);
_mds.disconnect();
return "<mds>\n" + buildStatusXML(false, this.getClass()
+ "HostLookup","ok") +
"\n<data>\n" + ht2XML(t) + "</data>\n</mds>";
}
catch (Exception ex) {
ex.printStackTrace();
return "<mds>" + buildStatusXML(true, this.getClass().getName(),
ex.getMessage()) + "</mds>";
}
}
/*
* Return xml is composed by a status tag
*/
private String buildStatusXML(boolean bError, String source, String desc){
String XML = "<status>\n\t" +
"<error>" + bError + "</error>\n\t<source>" + source
+ "</source>\n\t" +
"<desc>" + desc + "</desc>\n</status>";
return XML;
}
/**
* Convert an MDS Search HashTable (Multi-valued) to XML
*/
private String ht2XML(Hashtable t) throws Exception {
Enumeration e = t.elements();
MDSResult mvRecord = null; // result is a multi-val hash table
String dn = ""; // ht key is a dn
StringBuffer xml = new StringBuffer();
// sweep HT keys translating to XML
for (Enumeration dnEnum = t.keys() ; dnEnum.hasMoreElements() ; ){
mvRecord = (MDSResult)e.nextElement();
dn = (String)dnEnum.nextElement();
if ( mvRecord.size() > 0 ) {
xml.append("\t<record dn=\""
+ dn.replace('"',' ').trim()
+ "\">\n\t");
Enumeration recKeys = mvRecord.keys();
String sKey = "";
for (int i = 0; i < mvRecord.size(); i++) {
sKey = (String)recKeys.nextElement();
xml.append("\t<" + sKey + ">"
+ mvRecord.getValueAt(sKey,0)
+ "</" + sKey + ">\n\t");
}
xml.append("</record>\n");
}
}
return xml.toString();
}
|
调用 MDS 构造函数之后,搜索之前的下一步通过使用 MDS 类的
connect() 方法打开连接。
然后可以准备用如下调用进行搜索:
result = mds.search("(=*)", MDS.ONELEVEL_SCOPE);
在清单 2 中,有一个参数指定使用哪个过滤器。
(objectClass=*) 过滤器想获取所有数据。另一个参数指定搜索范围(
ONELEVEL 搜索当前的 DN 层,而
SUBTREE 则向下搜索目录结构)。
MDS 类的
search() 方法的结果是一个用
MDSResult 类包装的类型为
org.globus.common.MVHashtable 的散列表。它基本上是一个多值散列表。
清单 2 中的
ht2XML() 方法显示了如何将 MDS 的结果从散列表转换成其它进程可以轻松理解或处理的 XML 字符串。
下面的清单 3 显示了如何发出针对 GRIS 和 GIIS 的查询。
清单 3:对网格上的 MDS 机器运行查询
/**
*
*/
public static void main(String[] args) {
String baseDN = "Mds-Vo-name=AKgrid,o=grid";
String host = "mdev1.raleigh.ibm.com";
// Querying a GRIS machine with our grid
MDSService mds = new MDSService(host,"2135", baseDN);
String xml = mds.HostInfoLookup("(objectclass=*)");
System.out.println("GRIS output\n" + xml);
// Querying the global GIIS of our grid
MDSService mds1 = new MDSService();
mds1.HostInfoLookup("(objectclass=*)");
System.out.println("GIIS output\n" + xml);
}
}
|
host 的值和 baseDN 的值决定了是对 GRIS 运行查询还是对 GIIS 运行查询。org.globus.mds 包提供了几个构造函数来操作这些参数。但是,在 IBM 实验室中实现的网格使用了不同于 Globus 缺省值的其它值。
运行 MDS Java 类显示了清单 4 中的输出。
MDS output
<mds>
<status>
<error>false</error>
<source>class com.ibm.globus.services.mds.MDSServiceHostLookup</source> <desc>ok</desc>
</status>
<data>
<record dn="Mds-Device-name=/usr,Mds-Device-Group-name=filesystems,
Mds-Host-hn=mdev1.raleigh.ibm.com , Mds-Vo-name=AKgrid,o=grid">
<objectClass>MdsDevice</objectClass>
<Mds-Device-name>/usr</Mds-Device-name>
<Mds-keepto>20030212112509Z</Mds-keepto>
<Mds-validto>20030212112509Z</Mds-validto>
<Mds-Fs-freeMB>15592</Mds-Fs-freeMB>
<Mds-validfrom>20030212111009Z</Mds-validfrom>
<Mds-Fs-sizeMB>17078</Mds-Fs-sizeMB>
<Mds-Fs-mount>/usr</Mds-Fs-mount>
</record>
<record dn="Mds-Device-name=eth0,Mds-Device-Group-name=networks,
Mds-Host-hn=mdev6.raleigh.ibm.com, Mds-Vo-name=AKgrid,o=grid">
<objectClass>MdsDevice</objectClass>
<Mds-Device-name>eth0</Mds-Device-name>
<Mds-Net-addr>10.30.10.15</Mds-Net-addr>
<Mds-keepto>20030212151853Z</Mds-keepto>
<Mds-Net-netaddr>10.30.0.0/16</Mds-Net-netaddr>
<Mds-validto>20030212151853Z</Mds-validto>
<Mds-Net-name>eth0</Mds-Net-name>
<Mds-validfrom>20030212150353Z</Mds-validfrom>
</record>
</data>
</mds>
GIIS output
<mds>
<status>
<error>false</error>
<source>class com.ibm.globus.services.mds.MDSServiceHostLookup</source>
<desc>ok</desc>
</status>
<data>
<record dn="Pool-info=ISE Server System Grid Computing - hyperion,
Mds-Vo-name=POOL-CONTACT,o=grid">
<intraGrid-Pool-name>ISE Server System Grid Computing - hyperion
</intraGrid-Pool-name>
<Mds-Host-hn>hyperion.fscjapan.ibm.com</Mds-Host-hn>
<objectClass>intraGrid</objectClass>
<intraGrid-Pool-administrator>trent@jp.ibm.com
</intraGrid-Pool-administrator>
<Mds-Vo-name>ISE Server System Grid Computing - hyperion</Mds-Vo-name>
<Mds-Service-Ldap-suffix>Mds-Vo-name=ISE Server System Grid Computing -
hyperion, o=grid</Mds-Service-Ldap-suffix>
<intraGrid-Pool-localGIIS>hyperion.fscjapan.ibm.com
</intraGrid-Pool-localGIIS>
<Mds-Service-port>2135</Mds-Service-port>
<intraGrid-Geo-location>CHIBA CITY-CHIBA, 12, Japan (140.11,35.59)
</intraGrid-Geo-location>
</record>
</data>
</mds>
|
这个输出提供了大量有关机器、网络、文件系统和资源池的信息以及用于标识特别重要的资源的机制。由于 MDS 构建在 LDAP 协议上,所以可以使用任何 LDAP 浏览工具来浏览网格上的机器。
Globus Toolkit MDS 提供了一种组合服务以提供粘结系统映象的方法,网格应用程序可以浏览或搜索该系统映象。可以从简单地实现用于在网格中查询信息的 Java 类入手。
- 有关 org.globus.mds 包的信息,请参阅
http://www-unix.globus.org/cog/java/doc/api/org/globus/mds/package-summary.html。
- 有关 Globus 项目的信息,请参阅
http://www.globus.org/。
- 从
http://www-unix.globus.org/cog/java/index.php下载 Java CoG(商品网格,Commodity Grid)工具箱。
- 可以从
http://www.globus.org/toolkit/documentation/QuickStart.pdf获得
Globus Quickstart Guide。
- 有关 org.globus.mds 包的信息,请参阅
http://www-unix.globus.org/cog/java/doc/api/org/globus/mds/package-summary.html。
Vladimir Silva 出生在厄瓜多尔的基多。他于 1994 年从陆军工学院(Polytechnic Institute of the Army)获得系统分析员(System's Analyst)学位。同年,他作为交换学生来到美国,在中田纳西州立大学(Middle Tennessee State University)学习计算机科学。毕业后,他加入了 IBM“Web-Ahead”技术智囊团。他的兴趣包括网格计算、神经网络和人工智能。他还拥有包括 OCP、MCSD 和 MCP 在内的众多 IT 证书。可以通过 vsilva@us.ibm.com与 Vladimir 联系。